解决方案
控制台统计的命中率仅仅统计的是CDN L1的命中率,实际情况是L2命中也是从CDN节点拿去数据的,并不会回源,所以真实的CDN命中率是略高于控制台显示的CDN命中率的。(CDN数据流向:客户端->CDN L1层->CDNL2层->源站)
查看用户所提交CDN加速域名的流量情况,加速域名的流量不高的情况下,即便MISS的URL不多,但是对命中率的统计计算是影响很大的。
例如,某CDN加速域名一共对外提供了10个可以访问的URL,其中有一个URL源站上设置了no-cache导致不缓存,其他所有URL访问都命中的情况下,命中率也仅有90%。
CDN加速域名的流量带宽查询可以在控制台获取到:
image.png | center | 1408x758
如果第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。
控制台设置了不缓存的规则(比如某目录或者某种后缀的文件设置缓存时间为0秒),查询方法可以在CDN控制台查看。
image.png | center | 1582x297
源站动态内容居多,目前CDN主要是加速静态资源(css、js、html、图片、txt、视频等),针对动态资源(php、jsp、包含内部逻辑处理甚至cookie等)基本都是回源。
CDN的访问URL中带有可变参数(举例:http://dccdn.pier39.cn/1.txt?timestamp=14378923](http://dccdn.pier39.cn/1.txt?timestamp=14378923,其中timestamp表示时间戳,每次访问均会不同)。这里CDN针对第一次访问的URL(之前未预热),无论该URL是否符合CDN的缓存规则,第一次访问肯定都是MISS的(因为节点上还没有这个文件),因为后面的参数可变,所以每次访问都是一个全新的URL,则每次都会MISS,从而影响命中率。
刷新操作频繁,有定时刷新的操作,每次刷新都会导致所有已经在CDN上缓存的URL失效,那么下次访问同样的URL,自然就会MISS,从而影响命中率。
文件热度不够,不经常被客户访问到,导致虽然符合上面的所有规则,但是经常有被节点下掉缓存。CDN节点上缓存的文件,可以理解为按照热度属性采取末尾淘汰制,所谓热度就是该文件在该节点上被访问的频率,文件热度不够,其实一定程度上跟这个域名本身的流量不高有关联关系(排查点2)。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。