背景:
腾讯云 CDN 域名默认开启二级缓存(边缘层、中间层),只要由 CDN 任意一个层级命中,响应请求,则判定为命中 CDN 节点缓存。
流量命中率 =(总下行流量 - 回源流量)/ 总下行流量。
问题描述:
客户反馈xxx域名从流量命中率详情趋势图来看,并不是一直为0,但平均流量命中率显示为0,希望确认原因。
原因分析:
1、查看该域名的节点缓存配置,发现全部文件都有配置缓存一定的时间。
2、测试回源请求的url,CDN节点都能缓存命中,示例如下
3、从访问日志看,业务热度较低。另外,分析回源日志并没有发现同一url同一中间层节点重复回源的现象,说明节点确实能缓存命中。参照如下的平均流量命中率公式,分别查询总下行流量、回源流量,发现总下行流量<回源流量,也就是分子出现了负数,这种场景下,控制台流量命中率计为0。
平均流量命中率:根据所选时间粒度,仍利用(总下行流量 - 回源流量)/ 总下行流量同一个公式计算而来,而非利用流量命中率1分钟结果数据做算术平均。根据这个定义,当流量命中率并不全为0时,但平均流量命中率却为0,就不奇怪了。
ps:https://cloud.tencent.com/document/product/228/30797
那么问题来了,为何回源流量>总下行流量呢,正常情况下,这2者也应该是相等的。这时进一步分析回源日志,发现了一个异常现象,那就是源站不支持range请求,但是该域名开启了分片回源。从如下日志可以看到,回源请求0-0和0-4095时,源站都是响应200状态码以及完整文件,导致回源流量被放大,此时原因已经明确。
ps 分片回源功能逻辑:用户请求完整文件,CDN节点回源会先发起0-0探测文件CL,若文件小于4M,会继续发起0-4095的请求,最终再回源拉取完整的文件;若文件大于4M,默认会按1M大小逐片回源拉取。
ps:回源流量>访问流量可能的原因
1、预热到中间层,预热的url没有用户访问;
2、域名开分片,源站不支持range,导致回源被放大;
3、客户端主动断开,但cdn仍在回源拉取。(影响比较小。一般客户端断开,回源连接也会断开。但回源下载比用户下载快,而且客户端断开后,回源断开还有个延迟)
解决方案:
源站支持range请求或者CDN关闭分片回源即可。
当域名在控制台开启分片回源时,务必得测试下源站是否支持range,否则就会出现回源失败,或者回源流量放大的问题。