目录

CDN命中率低

问题症状

CDN控制台上显示的命中率一直不高,需要排查此类为何命中率不高。

源站收到较多来自CDN的回源请求,对源站造成一定的负载压力。

解决方案

1)控制台统计的命中率仅仅统计的是CDN L1的命中率,实际情况是L2命中也是从CDN节点拿去数据的,并不会回源,所以真实的CDN命中率是略高于控制台显示的CDN命中率的。(CDN数据流向:客户端->CDN L1层->CDNL2层->源站)。

2)查看用户所提交CDN加速域名的流量情况,加速域名的流量不高的情况下,即便MISS的URL不多,但是对命中率的统计计算是影响很大的。

例如,某CDN加速域名一共对外提供了10个可以访问的URL,其中有一个URL源站上设置了no-cache导致不缓存,其他所有URL访问都命中的情况下,命中率也仅有90%。

CDN加速域名的流量带宽查询可以在控制台获取到:

3)如果第1和第2都确认OK的情况下,下面有几种可能导致命中率低的情况,请逐一对照排查:

  Ø  源站上缓存header设置不当,或者缺少必要的header,则根据CDN的缓存规则是不缓存的,那么自然每次访问都会MISS,影响命中率。

  Ø  缓存header设置不当主要是cache-control或者pragma的影响,即源站上设置了cache-control:no-cache/no-store/max-age=0/private或者Pragma:no-cache等均会被CDN当做最高优先级执行不缓存。

  Ø  缺少必要的header,则是指源站的response头中不包含etag和last-modified也会导致不缓存,具体哪几种情况会导致不缓存,可以参考download: 判断CDN不缓存某文件的方法.docx。

4)控制台设置了不缓存的规则(比如某目录或者某种后缀的文件设置缓存时间为0秒),查询方法可以在CDN控制台查看。

5) 源站动态内容居多,目前CDN主要是加速静态资源(css、js、html、图片、txt、视频等),针对动态资源(php、jsp、包含内部逻辑处理甚至cookie等)基本都是回源。

6) CDN的访问URL中带有可变参数(举例:http://dccdn.pier39.cn/1.txt?timestamp=14378923](timestamp表示时间戳,每次访问均会不同)。这里CDN针对第一次访问的URL(之前未预热),无论该URL是否符合CDN的缓存规则,第一次访问肯定都是MISS的(因为节点上还没有这个文件),因为后面的参数可变,所以每次访问都是一个全新的URL,则每次都会MISS,从而影响命中率。

7)刷新操作频繁,有定时刷新的操作,每次刷新都会导致所有已经在CDN上缓存的URL失效,那么下次访问同样的URL,自然就会MISS,从而影响命中率。

8)文件热度不够,不经常被客户访问到,导致虽然符合上面的所有规则,但是经常有被节点下掉缓存。CDN节点上缓存的文件,可以理解为按照热度属性采取末尾淘汰制,所谓热度就是该文件在该节点上被访问的频率,文件热度不够,其实一定程度上跟这个域名本身的流量不高有关联关系(排查点2)。