背景說明
網站使用CDN加速以后,大部分靜態文件都將會被離用戶較近的CDN邊緣節點緩存,由此起到訪問加速效果。如果用戶訪問的文件由CDN節點直接響應,無需回源,則稱之為緩存命中。CDN緩存命中率越高,也就意味著加速效果越好,相應的回源量也會極大減少。
天翼云CDN控制臺上【數據分析】模塊,可以看到緩存流量命中率和請求命中率數據。緩存命中的流量除以總流量稱之為流量命中率,緩存命中的請求數除以總請求數稱之為請求命中率。只要在CDN邊緣節點,或是在中間節點命中,均統計為緩存命中(CDN用戶請求流向為:用戶客戶端->CDN邊緣節點->CDN中間節點->源站)。如果命中率低,則較多用戶的請求都會從CDN節點回源,不僅訪問效果不佳,還會給源站造成較大壓力。本文將介紹產生此類情況的可能原因。
可能原因
- 如果域名剛接入天翼云CDN加速,則用戶首次訪問文件時CDN節點均需要回源獲取,此時緩存命中率較低,需要經過一段時間后才能逐步把大部分文件緩存至CDN節點,這個時間往往要經過兩三天至一周左右。
- 如果域名已接入天翼云CDN較長時間,仍命中率較低,則可排查是否存在如下情況:
是否用戶請求量過低導致
如果域名請求數總量較少,則即使有少量URL未命中,仍會對總體命中率影響較大。例如,5分鐘內僅100個URL請求,其中20個是訪問同個URL,但因為該URL在CDN設置了不緩存或緩存時間為0(等同于不緩存),導致每次請求都回源,則此時CDN緩存命中率最高不會超過80%。此外,因為CDN節點磁盤緩存空間有限,一般會有基于文件熱度淘汰冷文件機制。如果該域名訪問的資源熱度極低,例如第一次訪問后,下次用戶訪問同個資源是在一周以后,則在此期間該文件可能因為熱度過低被淘汰掉,也會導致命中率較低。
是否用戶請求確實比較分散,熱度較低導致
域名總請求數和訪問量居中,但用戶請求確實比較分散,即不同地區不同用戶訪問的內容都不一樣,沒有集中請求熱點資源,這種用戶訪問特性也會導致命中率較低。該情況可以結合CDN控制臺上【數據分析】模塊的“熱門URL”數據來進行確認,例如按天統計的熱門URL排名TOP10的訪問次數很少,訪問占比不到1%,則該域名整體命中率較低是正常情況。
是否因緩存設置不合理導致
CDN控制臺上有推薦的緩存規則設置,客戶可以基于該規則進行適當調整。如果緩存規則設置不合理,也會導致緩存命中率較低。可以結合CDN控制臺上【數據分析】模塊中“熱門URL(回源)”數據進行確認。例如,回源請求次數排名TOP的URL,是否存在實際是可緩存的,或是否存在加速URL中攜帶問號后參數但實際指向同個文件,因未設置去問號緩存導致重復回源(詳情請見:CDN緩存key攜帶問號后參數導致緩存命中率低)。如存在上述情況,可通過CDN控制臺【域名管理】模塊中“緩存配置”-“緩存過期時間設置”進行調整優化,例如將實際可緩存的URL,設置為強制緩存一段時間,或將相應URL設置為去問號緩存。
注意CDN緩存規則分為不緩存、強制緩存、遵循源站緩存三種,其中如果選擇遵循源站緩存,則可能因為源站返回Cache-Control頭值為no-cache、no-store、private等不緩存頭而導致CDN節點不緩存,此時如果確認對應URL實際是可緩存的,可將緩存規則調整為強制緩存,此時CDN節點將忽略源站的不緩存頭,強制進行緩存。
完成以上檢查后,如發現回源較多的URL確實是不能緩存的URL,即設置了不緩存或緩存時間為0的URL,例如php、jsp文件等,則命中率較低是正常情況。
檢查是否與分片回源設置有關
通常情況下,針對較大文件,開啟分片回源功能有助于提升回源效率,降低因回源鏈路網絡擁塞造成的下載速度慢等問題。開啟分片回源后,CDN節點將按照固定的分片大小以Range請求方式回源。但如果源站文件實際較小,例如大多小于10MB,則開啟分片回源反而會降低回源效率,造成多次回源,命中率下降。
注意請在新增域名時明確是否開啟分片回源,以及開啟分片回源的具體分片大小;一旦域名CNAME至我司產生流量后,建議不要輕易變更分片回源功能的分片大小,否則過渡期間可能會產生較高回源,命中率下降;如確實有調整需求,請提交工單聯系天翼云客服處理,詳情請見:分片回源。
源站是否設置了多副本緩存
多副本緩存是指源站響應頭中包含vary頭,且值為Accept-Encoding或User-Agent等時,以值為Accept-Encoding為例,意味著源站針對Accept-Encoding請求頭值不同時,會給出不同的響應體,因此要求CDN節點緩存成不同份文件,即多副本的方式來緩存。這樣會導致同個URL請求,CDN節點將回源多次,造成命中率降低。
是否存在頻繁刷新
在CDN控制臺上操作刷新文件或目錄時,會造成所有CDN節點回源,也會導致命中率下降。