提升緩存命中率的意義
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緩存命中率。