提升缓存命中率的意义
CDN在静态资源加速场景的应用,是将静态资源缓存在距离客户端最近的CDN节点上。用户访问该资源时,直接从缓存中获取资源,避免通过较长的链路回源。如果CDN缓存命中率低,则会导致源站压力大,静态资源访问效率低。因此,CDN缓存命中率的高低直接影响用户体验,而保证较高的缓存命中率也成为了CDN的核心课题。可以针对导致CDN缓存命中率低的具体原因,选择对应的优化策略,来优化CDN的缓存命中率。CDN缓存命中率包括字节缓存命中率和请求缓存命中率。
- 字节缓存命中率 = CDN缓存命中响应的字节数 / CDN所有请求响应的字节数
- 请求缓存命中率 = CDN缓存命中的请求数 / CDN所有的请求数
如何判断缓存是否成功
我们可以通过打开浏览器审查元素来分析CDN返回的Response Header,其中X-Cache字段来判断是否命中缓存,具体可以参见如何通过浏览器的审查元素判断CDN缓存是否成功。
在 Response Headers 字段内,可以查看详细的请求和返回的报文信息。
- Age:为CDN返回的头部字段,表示该文件在CDN节- 点上缓存的时间,单位为秒。只有文件存在于节点上Age字段才会出现,当文件被刷新后或者文件被清除的首次访问,在此前文件并未缓存,无Age头部字段,需要注意当Age为0时,表示节点已有文件的缓存,但由于缓存已过期,本次无法直接使用该缓存,需回源校验。
- X-Swift-SaveTime:CDN节点上的缓存RS(swift)的时间,即该文件是在什么时间缓存到CDN节点上。
- X-Swift-CacheTime:CDN节点上的允许缓存时间,即该文件可以在CDN节点上缓存多久,是指文件在CDN节点缓存的总时间。计算还有多久需要回源刷新= ’X-Swift-CacheTime’ – ‘Age’。
- X-Cache:"HIT"表示已缓存,"MISS"表示节点上无该文件的缓存,回源请求。
为什么无法命中缓存
(1)客户端请求是动态请求
如果请求是动态请求,则无法命中CDN缓存。当客户端访问这些动态内容时,每次都需要访问用户的服务器,由服务器动态生成实时的数据并返回给客户端。
(2)源站返回强制不缓存的HTTP头
当源站配置了以下响应头时,即使配置了缓存规则,CDN也不会对该资源进行缓存,因为这些响应头在CDN缓存规则中的优先级较高。
- 1:有s-maxage=0、max-age=0、no-cache、no-store、private中的任一种。
- 2:有s-maxage或s-maxage=0。
- 3:有Pragma: no-cache。
如下图,源站响应了no-cache和private导致CDN无法缓存,X-Cache字段为MISS,X-Swift-CacheTime为0。这种情况需要源站去掉这个HTTP响应头,具体可以参见Nginx缓存策略设置、Apache缓存策略的设置、IIS缓存策略的设置方法。
(3)未返回响应头Etag和Last-modified
当CDN未配置缓存规则时,如果静态文件未返回响应头Etag和Last-modified,则该静态文件不能缓存在CDN节点上。解决方案就是源站配置返回Etag和Last-modified或者直接在CDN上配置缓存规则。
(4)全站加速未配置静态加速
全站加速默认走了动态加速,动态加速是每次回源的。如果需要走缓存的话,需要配置静态加速。目前配置静态加速支持按照文件类型、URI以及路径方式配置。如果全站加速没有配置静态加速的情况,则都是走动态加速的,全站加速节点响应的HTTP头没有X-Cache、X-Swift-CacheTime等字段的,类似如下图
影响CDN缓存命中率下降的因素
影响CDN缓存命中率下降的因素:
(1)刷新缓存,可能导致短时间内命中率下降。
(2)带宽突增,会导致CDN节点回源较多,命中率会表现有下降趋势。
(3)CDN节点访问新内容,导致CDN节点回源较多,命中率会表现有下降趋势。
(4)缓存规则调整,可能会影响命中率。
缓存命中率低分析及优化
CDN控制台统计的缓存命中率仅仅是CDN L1层的命中率,实际情况L2层的缓存数据也是从CDN节点获取,并不会从源站获取数据,所以真实的CDN命中率是略高于CDN控制台显示的命中率。
另外查看CDN加速域名流量情况,在加速域名流量不高的情况下,即便MISS状态的URL不多,但是对命中率的统计计算影响很大。例如,某CDN加速域名一共对外提供了10个可以访问的URL,其中有一个URL源站上设置了no-cache,导致不缓存,在其他URL访问都命中的情况下,命中率也仅有90%。
在之前检查正常的情况下,有如下几种可能导致命中率低的情况,请逐一进行排查:
(1)源站上缓存Header设置不当,或者缺少必要的Header,如果CDN的缓存规则是不缓存,那么每次访问都是MISS状态,影响命中率,具体请参考前文“为什么无法命中缓存”的描述。
(2)CDN控制台设置了不缓存的规则,即某目录或者某种后缀的文件设置的缓存时间为0秒,相关信息可以在CDN控制台查看。
(3)源站动态内容较多,目前CDN主要是加速静态资源,例如CSS、JS、HTML、图片、txt、视频等资源,针对动态资源PHP、JSP、包含内部逻辑处理甚至Cookie等资源都会回源数据。
(4)CDN的加速URL中带有可变参数。例如URL地址为http://XXX.XXX.cn/1.txt?timestamp=14378923 ,其中timestamp值为时间戳,每次访问此值均不同。CDN针对第一次访问的URL,即之前未预热的URL,无论该URL是否符合CDN的缓存规则,由于节点上还没有这个文件,第一次访问肯定都是MISS状态。但是timestamp参数会变化,所以每次访问都是一个全新的URL,则每次都返回MISS状态,从而影响命中率。
(5)检查是否存在频繁刷新缓存的操作。
(6)文件热度不够。不经常被用户访问到的URL,即使符合所有缓存规则,但是经常有被节点去除缓存的风险。CDN节点上缓存的文件,可以理解为按照热度属性采取末尾淘汰制,热度就是该文件在该节点上被访问的频率,文件热度不够,其实一定程度上跟这个域名本身的流量不高有关系。
针对以上情况,可以考虑通过"预热URL"、"配置资源缓存规则"、"过滤URL中可变参数"来优化缓存命中率,具体操作请参见优化CDN缓存命中率。