CDN缓存命中率较低排查方法

阿里云CDN控制台上显示的缓存命中率一直不高,且源站收到较多来自CDN的回源请求,可能会导致内容加载速度变慢,对源站造成一定的负载压力。排查缓存命中率低的问题时,可以按照本文介绍进行排查和优化。

详细信息

如果发生缓存命中率过低的情况意味用户的每次请求都会通过CDN回源,公网链路的不稳定可能导致加速的效果反而变差。如何解决命中率过低的问题,可以通过预热URL、配置资源缓存规则、过滤URL中可变参数优化缓存命中率,具体操作请参见提高CDN缓存命中率。首先参见以下操作分析具体原因。

控制台查看命中率和流量情况

CDN控制台中的命中率和流量的说明及分析如下:

  1. CDN控制台统计的缓存命中率仅仅是CDN L1节点的命中率,实际L1节点的缓存数据也是从CDN L2节点获取,并不会从源站获取数据,所以真实的CDN命中率是略高于CDN控制台显示的命中率。

    说明
    • CDN数据流向为:客户端>CDN的L1节点>CDN的L2节点>源站。

    • 缓存命中率数据可以在控制台监控查询 > 资源监控下的命中率页签获取。

      image

  2. 查看提交的CDN加速域名的流量情况。在加速域名流量不高的情况下,即便MISS状态的URL不多,但是对命中率的统计计算影响很大。例如,某CDN加速域名一共对外提供了10个可以访问的URL,其中有一个URL源站上设置了no-cache,导致不缓存,在其他URL访问都命中的情况下,命中率也仅有90%。

    说明

    CDN加速域名的流量带宽可以在CDN控制台概览页获取。

    image

  3. 检查业务QPS是否正常。CDN的缓存规则默认是按照配置的缓存时间进行缓存,但节点的磁盘空间是有限的,在高频用户访问的情况下,缓存文件会按照冷文件的冷热程度汰换,访问频率较低的文件会被访问热点的文件汰换掉造成回源。遇到这种情况一般都是只有十几个QPS的域名,建议您对自己域名下的资源进行预热,保证资源被节点命中。

缓存配置检查

检查是否因部分参数配置不合理导致缓存命中率低,具体操作如下:

  1. 检查是否开启强制Range回源,详情请参见配置Range回源。此功能开启后,所有回源请求将按照设定的Range size切片回源。 Range的功能也有两面性,对于源站是大文件(超过50 MB) 的场景,Range分片可以有效的降低大文件下载时遇到的网络拥塞,以及源站为窄带的情况。但如果源站的文件平均size相对较小,比如在10M以内的文件,开启强制Range回源没有优化效果,反而降低回源的效率,扩大回源,使命中率降低。

  2. 检查CDN的加速URL中是否带有可变参数。当您的业务经常使用uri带有变量,并且不同用户请求都有不同的parameter变量时,CDN会按照URL hash后的值存储,每一条不同的uri都会触发回源,CDN就变成透传的组件失去了缓存的意义。遇到这种情况,建议可以开启CDN忽略参数功能,将uri"?"以后的资源去掉后再进行CDN缓存,详情请参见忽略参数

    但如果源站或者用户对"?"后的参数强依赖,建议切换到全站加速(DCDN)产品,通过智能选路回源更灵活,CDN是固定边缘节点、中心节点双层回源,对于强依赖"?"变量的访问效果略低于全站加速(DCDN),智能选路是动态的网络质量检测规划回源路径,可能是边缘节点直接回源,也可以是边缘节点回到中心节点再回源。

    说明

    例如URL地址为http://example.aliyundoc.com/1.txt?timestamp=14378923,其中timestamp值为时间戳,每次访问此值均不同。CDN针对第一次访问的URL,即之前未预热的URL,无论该URL是否符合CDN的缓存规则,由于节点上还没有这个文件,第一次访问肯定都是MISS状态。但是timestamp参数会变化,所以每次访问都是一个全新的URL,则每次都返回MISS状态,从而影响命中率。

  3. 检查源站是否开启多副本缓存。多副本缓存是服务端(源站) 针对用户请求带有不同Accept-Encoding头,源站能响应不同的Vary头,且CDN会按照不同的Vary头进行缓存。带有不同Vary头的请求会增加回源的次数,导致命中率降低。

  4. 检查缓存配置是否合理。源站上缓存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,这种情况也会导致不进行缓存。

    • 源是否设置过缓存头,CDN默认按照源站的缓存头优先级缓存,如果源站设置了不合理的缓存头,比如max-age=0,则覆盖CDN的缓存。

  5. 检查CDN控制台是否设置了不缓存的规则,即某目录或者某种后缀的文件设置的缓存时间为0秒。

  6. 检查源站动态内容是否较多,目前CDN主要是加速静态资源,例如CSS、JS、HTML、图片、TXT、视频等资源,针对动态资源PHP、JSP、包含内部逻辑处理甚至Cookie等资源都会回源数据。

  7. 刷新操作频繁。CDN控制台有刷新缓存功能,每次刷新都会导致所有已经在CDN上缓存的URL失效,所以在刷新之后访问同样的URL时,就是MISS状态,从而影响命中率。

  8. 文件热度不够。不经常被用户访问到的URL,即使符合所有缓存规则,但是经常有被节点去除缓存的风险。CDN节点上缓存的文件,可以理解为按照热度属性采取末尾淘汰制,热度就是该文件在该节点上被访问的频率,文件热度不够,其实一定程度上跟这个域名本身的流量不高有关系。

相关文档