使用阿里云CDN加速后網(wǎng)站訪問速度較慢
問題描述
在使用阿里云CDN加速后,網(wǎng)站訪問速度比較慢。由于造成訪問慢的影響因素很多,如何去分析定位問題、優(yōu)化網(wǎng)站速度、解決問題是一個十分重要的課題,本文對此進行詳細(xì)介紹。
解決方案
阿里云提醒您:
如果您對實例或數(shù)據(jù)有修改、變更等風(fēng)險操作,務(wù)必注意實例的容災(zāi)、容錯能力,確保數(shù)據(jù)安全。
如果您對實例(包括但不限于ECS、RDS)等進行配置與數(shù)據(jù)修改,建議提前創(chuàng)建快照或開啟RDS日志備份等功能。
如果您在阿里云平臺授權(quán)或者提交過登錄賬號、密碼等安全信息,建議您及時修改。
當(dāng)您使用阿里云CDN加速后,出現(xiàn)網(wǎng)站訪問速度比較慢的問題時,請參考以下內(nèi)容解決問題。
分析思路
在排查分析問題前,需要了解CDN的加速原理,請參見什么是阿里云CDN,它將有助于幫助您如何去思考和分析問題存在的可能原因。簡單來說,CDN主要是通過在現(xiàn)有網(wǎng)絡(luò)中增加一層新的緩存節(jié)點,將網(wǎng)站服務(wù)器的資源發(fā)布到最接近用戶的網(wǎng)絡(luò)節(jié)點,使得用戶側(cè)客戶端在請求時直接訪問到就近的CDN節(jié)點并命中該資源,減少回源情況,提高網(wǎng)站訪問速度。因此,造成訪問慢的可能原因可以簡單歸納為以下幾個類型:
客戶端本地網(wǎng)絡(luò)因素,例如客戶端下行帶寬不足、DNS配置錯誤等。
客戶端到CDN節(jié)點之間的網(wǎng)絡(luò)不佳,網(wǎng)絡(luò)延遲較高。
CDN節(jié)點異常,響應(yīng)速度慢。
資源內(nèi)容比較大,導(dǎo)致下載比較耗時。
CDN回源到源站時,回源網(wǎng)絡(luò)不佳。
源站本身響應(yīng)速度慢。
通過搜集一些問題現(xiàn)象和信息,我們可以進一步分析,初步確定排查方向,這也是一個非常重要的環(huán)節(jié)。
可以先確認(rèn)是否是全網(wǎng)都存在訪問慢的問題,還是個別用戶訪問慢,亦或是某一個地區(qū)、某一個運營商的用戶訪問慢。阿里云為您提供了應(yīng)用實時監(jiān)控服務(wù)ARMS、云監(jiān)控等產(chǎn)品,您可以通過這些產(chǎn)品設(shè)定某一地區(qū)、某一運營商網(wǎng)絡(luò)的探測機器去探測,精準(zhǔn)性更高:
如果只是極個別用戶訪問不佳,那么可能跟用戶側(cè)的網(wǎng)絡(luò)有強相關(guān)性,很可能就是用戶側(cè)的網(wǎng)絡(luò)問題。
判斷異常用戶是否有集中性,比如:某市大量移動用戶訪問異常,而該市聯(lián)通和電信用戶訪問正常。這種情況就有可能跟該地區(qū)的運營商網(wǎng)絡(luò)有一定關(guān)聯(lián),可以使用一些基調(diào)工具,用該地區(qū)的探測機器進行探測。
如果全網(wǎng)用戶都存在訪問慢的問題,那就可能是源站響應(yīng)問題或者是配置方面的問題,因為幾乎不可能同時所有的CDN節(jié)點或者所有地區(qū)的網(wǎng)絡(luò)都出現(xiàn)問題。例如:排查是否是加速區(qū)域選擇的錯誤,是否是動態(tài)請求或者無法緩存的請求,源站響應(yīng)慢,需要重點往這方面考慮。
確認(rèn)訪問慢或者異常的請求是否被CDN緩存:
如果是命中CDN緩存的請求,那么就不存在CDN回源,因此CDN會直接把節(jié)點上的緩存數(shù)據(jù)返回給客戶端,這種情況就和源站沒有關(guān)系。
如果是沒有命中緩存,那么需要重點查看是客戶端到CDN的鏈路慢,還是源站響應(yīng)慢。
衡量指標(biāo)
使用CDN加速,除了通用的數(shù)據(jù)觀測指標(biāo)外,不同的場景下也有更具體的指標(biāo)。觀測這些指標(biāo),不僅可以幫助您體驗CDN加速的效果,也能觀測自身業(yè)務(wù)使用CDN的情況,幫助您更好地做出調(diào)整和決策。阿里云CDN官方幫助文檔中心提供了CDN的衡量指標(biāo)的介紹文檔,請參見CDN的衡量指標(biāo)。
信息搜集
我們知道一次完整的HTTP請求需要經(jīng)過DNS解析>TCP建連>SSL握手(HTTPS需要SSL握手)>客戶端發(fā)送請求>服務(wù)端響應(yīng)請求的過程,了解HTTP請求的過程將有助于我們更深層次的去分析問題,因此在客戶端側(cè)搜集一些信息很有必要,通常可以搜集以下的幾點信息。
搜集客戶端網(wǎng)絡(luò)情況和CDN節(jié)點IP
使用ping命令連接加速域名,確認(rèn)是否正確解析到CDN,以及客戶端到CDN節(jié)點之間網(wǎng)絡(luò)是否是通暢,網(wǎng)絡(luò)延遲如何。如果無法ping通,則需要進行一些鏈路診斷,具體信息請參見鏈路診斷方法。
搜集客戶端IP和LocalDNS
CDN的節(jié)點調(diào)度策略是根據(jù)客戶端的LocalDNS來分配調(diào)度,因此確認(rèn)客戶端的LocalDNS是否設(shè)置正確非常重要。可訪問阿里昆侖用戶診斷工具,獲取客戶端IP以及客戶端DNS。
查找訪問慢的URL
可以打開瀏覽器開發(fā)者模式,切換到Network標(biāo)簽頁,輸入URL之后,在Network標(biāo)簽頁中查看瀏覽器發(fā)出的所有HTTP請求。單擊Time選項,按照時間來排序,查看具體是哪些資源請求慢,在Domain列找到CDN加速域名下訪問慢的URL。
通常情況下,一個網(wǎng)站加載的資源比較多,可能存在一些非CDN加速的URL,這時一些非CDN的資源訪問慢,而CDN加速的資源都訪問快,但是就是這些非CDN加速的資源加載慢導(dǎo)致整個網(wǎng)站響應(yīng)速度變慢。因此根據(jù)Time排序,確認(rèn)到底是哪些URL訪問慢。
搜集HTTP請求的請求頭和響應(yīng)頭
單擊Network標(biāo)簽頁訪問慢的HTTP請求Name值,在Headers標(biāo)簽下可以看到這次請求的General、Response Headers和Request Headers信息。通過請求頭和響應(yīng)頭,我們可以了解這次請求是否是一個靜態(tài)請求,且是否命中緩存等信息。
如果是手機4G慢,則需要在手機側(cè)抓包獲取信息,該操作對一般用戶可能會有一些困難。可以考慮打開手機熱點,PC端連接熱點,在PC端搜集信息。
搜集HTTP請求的Timing信息
在Timing標(biāo)簽中可以顯示資源在整個請求生命周期過程中各部分時間花費信息。
常見案例
在了解CDN的加速原理和HTTP請求過程的基礎(chǔ)下,結(jié)合問題現(xiàn)象進行初步分析,然后根據(jù)搜集到客戶端側(cè)的信息一起判斷,基本已經(jīng)可以發(fā)現(xiàn)或定位一些問題。下面介紹一些典型的問題案例。
案例一:客戶端到CDN節(jié)點網(wǎng)絡(luò)質(zhì)量不佳
客戶端使用ping命令測試加速域名,發(fā)現(xiàn)網(wǎng)絡(luò)延遲較大,甚至出現(xiàn)丟包。這種情況下需要搜集客戶端的IP、客戶端的DNS以及ping的信息截圖、MTR的信息截圖。因為CDN調(diào)度節(jié)點是通過客戶端的DNS來分配調(diào)度,根據(jù)客戶端IP、DNS以及CDN節(jié)點可以判斷調(diào)度是否異常,通過ping以及mtr的信息截圖可以看到網(wǎng)絡(luò)延遲以及具體延遲在哪個網(wǎng)絡(luò)鏈路節(jié)點。本節(jié)通過兩個案例進行介紹。
加速區(qū)域設(shè)置錯誤
中國內(nèi)地的用戶被解析到海外的節(jié)點,或者海外用戶被解析到中國內(nèi)地,具體場景如下所示:
這種情況建議將加速區(qū)域設(shè)置為“全球”。
CDN的加速區(qū)域選擇的是“僅中國內(nèi)地”,那么該域名的調(diào)度域就只有中國內(nèi)地的CDN節(jié)點,海外用戶訪問該域名時,都會調(diào)度到中國內(nèi)地的CDN節(jié)點。
加速區(qū)域選擇的是“全球(不包含中國內(nèi)地)”,那么該域名的調(diào)度域里就只有除中國內(nèi)地之外的CDN節(jié)點,中國內(nèi)地用戶都會調(diào)度到海外的CDN節(jié)點。
客戶端DNS設(shè)置錯誤
客戶端DNS設(shè)置錯誤需要用戶側(cè)修改使用對應(yīng)所在地對應(yīng)運營商的DNS:
一個廣東移動的用戶,使用了聯(lián)通的DNS服務(wù)器,則會導(dǎo)致該用戶請求到聯(lián)通的CDN節(jié)點,遠(yuǎn)距離調(diào)度會延長網(wǎng)絡(luò)鏈路。
一個廣東移動的用戶,使用了哈爾濱移動的DNS服務(wù)器,則會導(dǎo)致該用戶請求到哈爾濱移動的CDN節(jié)點,遠(yuǎn)距離調(diào)度延長網(wǎng)絡(luò)鏈路。
如果加速區(qū)域和DNS設(shè)置正確,在CDN正確分配調(diào)度的情況下,網(wǎng)絡(luò)質(zhì)量還是差,則需要搜集traceroute和mtr信息進一步診斷。
案例二:緩存命中率低或頻繁回源
CDN在靜態(tài)資源加速場景的應(yīng)用,將靜態(tài)資源緩存在距離客戶端最近的CDN節(jié)點。用戶訪問該資源時,直接從緩存中獲取資源,避免通過較長的鏈路回源。如果CDN緩存命中率低,則會導(dǎo)致源站壓力大,靜態(tài)資源訪問效率低。因此,CDN緩存命中率的高低直接影響用戶體驗,而保證較高的緩存命中率也成為CDN的核心課題。可以針對導(dǎo)致CDN緩存命中率低的具體原因,選擇對應(yīng)的優(yōu)化策略,優(yōu)化CDN的緩存命中率,請參見提高CDN緩存命中率。我們可以通過CDN返回Response Header中的X-Cache字段來判斷是否命中緩存。
X-Cache:字段為MISS,則表示未命中緩存,需要進行回源處理;X-Cache字段為HIT,則表示命中了CDN緩存,會直接讀取的緩存數(shù)據(jù)。
X-Swift-CacheTime:字段值表示CDN節(jié)點上的允許緩存時間,即該文件可以在CDN節(jié)點上緩存多久。如果是0,則表示該請求無法緩存。
緩存命中率低或頻繁回源的現(xiàn)象和優(yōu)化方案如下所示:
首次訪問會比直接訪問源站還慢,因為第一次CDN節(jié)點沒有緩存,需要先回源取數(shù)據(jù)。這種情況推薦使用預(yù)熱URL功能,請參見刷新和預(yù)熱資源,將源站的內(nèi)容主動預(yù)熱到CDN節(jié)點,用戶首次訪問可直接命中緩存,提高加載速度。
資源訪問量較低,文件熱度不夠,CDN收到請求較少,且無法有效命中緩存。CDN節(jié)點作為所有使用CDN的用戶共用的節(jié)點資源,因此CDN配置的緩存規(guī)則表示該資源在CDN上的最長緩存時間。如果您的CDN加速域名流量較低,則可能提前從CDN節(jié)點的緩存中清除,即緩存按照熱度屬性采取末尾淘汰制。熱度是指文件在節(jié)點上被訪問的頻率,當(dāng)文件熱度不夠,則會被提前剔除。
緩存配置不合理,緩存時間過短,CDN節(jié)點頻繁回源的場景如下所示:
當(dāng)CDN未配置緩存規(guī)則時,如果靜態(tài)文件未返回ETag和Last-modified響應(yīng)頭,則該靜態(tài)文件不能緩存在CDN節(jié)點上。優(yōu)化方案需要在源站配置這兩個響應(yīng)頭,或者考慮在CDN側(cè)配置緩存規(guī)則,請參見緩存配置。
當(dāng)CDN未配置緩存規(guī)則時,CDN使用的是默認(rèn)緩存策略,請參見阿里云默認(rèn)緩存規(guī)則及優(yōu)先級,緩存時間很短,最長不超過3600秒,因此容易造成頻繁過期回源的情況,建議根據(jù)業(yè)務(wù)情況,在CDN側(cè)設(shè)置合理的緩存時間。
當(dāng)源站配置了一些強制不緩存的Cache-Control的響應(yīng)頭時,即使您配置了緩存規(guī)則,CDN也不會對該資源進行緩存,因為這些響應(yīng)頭在CDN緩存規(guī)則中的優(yōu)先級較高。若源站存在“s-maxage=0”、“max-age=0”、“no-cache”、“no-store”、“private”、“Pragma: no-cache”中的任一種規(guī)則,都會導(dǎo)致CDN無法緩存,需要在源站側(cè)修改這些響應(yīng)頭。修改成Public等可以被緩存的響應(yīng)頭,詳情請參見設(shè)置Nginx緩存策略、設(shè)置Apache緩存策略。
URL攜帶了可變參數(shù) 訪問資源的URL攜帶了參數(shù),并且參數(shù)不斷變化。當(dāng)使用不同的URL去訪問CDN的時候,CDN會認(rèn)為這是一個新請求(即便這兩個不同的URL其實是訪問同一個文件,并且該文件已經(jīng)緩存在節(jié)點上),還是會回源拉取所請求的內(nèi)容。這種情況下,建議開啟過濾參數(shù)功能,請參見忽略參數(shù)。
大文件Range回源 對于一些大文件需要緩存的情況,建議開啟Range回源功能優(yōu)化回源,請參見配置Range回源。
案例三:動態(tài)請求訪問慢
如果訪問慢的請求是一個動態(tài)請求,當(dāng)客戶端訪問這些動態(tài)內(nèi)容時,每次都需要訪問用戶的服務(wù)器,由服務(wù)器動態(tài)生成實時的數(shù)據(jù)并返回給客戶端。這種場景下,CDN無法緩存實時變化的動態(tài)內(nèi)容,因此CDN的緩存加速不適用于加速動態(tài)內(nèi)容。對于動態(tài)內(nèi)容請求,CDN節(jié)點只能轉(zhuǎn)發(fā)回源站服務(wù)器,沒有加速效果。如果用戶的網(wǎng)站或App應(yīng)用有較多動態(tài)內(nèi)容,例如:需要對各種API接口進行加速,可以考慮以下方案。
源站做動靜分離,靜態(tài)資源使用CDN域名加速,動態(tài)請求使用另一個直接解析到源站的域名來訪問。
考慮使用全站加速來加速動態(tài)請求,請參見全站加速。不過要注意的是,全站加速對于動態(tài)請求的加速是通過阿里云的路由優(yōu)化、傳輸優(yōu)化等動態(tài)加速技術(shù),以最快的速度訪問您的服務(wù)器源站獲取數(shù)據(jù),是一個四層鏈路的優(yōu)化,如果源站服務(wù)器本身響應(yīng)速度就很慢,那這種情況下還是需要優(yōu)化源站。
案例四:源站響應(yīng)慢
當(dāng)請求訪問慢時,若該請求是不緩存資源的請求,或者是一個動態(tài)請求,都是需要回源處理。但是由于源站的響應(yīng)速度非常慢,導(dǎo)致最終響應(yīng)的速度慢。該情況下可以直接在本地綁定源站域名訪問源站,或者在源站服務(wù)器中測試源站域名的響應(yīng)速度。導(dǎo)致該情況出現(xiàn)的原因如下所示:
源站性能限制,本身處理速度比較慢,例如源站的帶寬、CPU等達(dá)到瓶頸,或者源站程序處理速度慢等,需要考慮優(yōu)化源站。如果性能不足,則需要對源站擴容。
源站的網(wǎng)絡(luò)比較差,或者源站涉及跨境鏈路,比如用戶請求中國內(nèi)地的CDN節(jié)點,而源站在中國內(nèi)地外。由于CDN回源到源站的鏈路也是公網(wǎng)地址,如果涉及到跨境鏈路的話確實會受到一些影響,因為跨境鏈路涉及到不同的運營商、境外運營商,而且需要走國際互聯(lián)網(wǎng)出口,這些情況CDN側(cè)和源站側(cè)都不可控,CDN單方面優(yōu)化的空間很小,建議部署雙源站(境外和境內(nèi))調(diào)整架構(gòu)進行優(yōu)化。
案例五:網(wǎng)站首頁加載慢
當(dāng)客戶端訪問http://www.example.com/
網(wǎng)站時,瀏覽器會請求該首頁,請求成功以后,服務(wù)端返回HTML代碼給瀏覽器,然后瀏覽器再根據(jù)返回的HTML代碼來請求代碼中需要引入的一些資源,例如圖片、JS、CSS等這些URL。如果首頁是一個動態(tài)資源或者是不需要緩存的資源,則會導(dǎo)致每次請求首頁時,CDN都會經(jīng)過回源處理。如果源站響應(yīng)慢就會最終導(dǎo)致首頁加載慢,該請求在Network中的Pending狀態(tài)持續(xù)時間比較久。具體是否命中緩存可以參見案例二:緩存命中率低或頻繁回源的介紹。
這種首頁不緩存且請求訪問慢的場景,造成的現(xiàn)象就是首頁請求一直為Pending,等首頁請求到數(shù)據(jù)后,靜態(tài)資源很快都會加載出來。
案例六:網(wǎng)站加載的資源比較大
如果網(wǎng)站加載的資源比較大,可以通過設(shè)置加速域名的性能優(yōu)化功能,請參見性能優(yōu)化,縮小訪問文件的體積,提升加速效率和頁面可讀性。目前智能壓縮支持的內(nèi)容格式:text/html、text/xml、text/plain、text/css、application/javascript、application/x-javascript、application/rss+xml、text/javascript、image/tiff、image/svg+xml、application/json、application/xmltext。
案例七:某地區(qū)某運營商用戶訪問慢
有一些問題場景,客戶端存在共性。比如:某一個時間段,某市移動用戶有大量用戶反饋訪問慢或者異常,而聯(lián)通電信用戶都正常。這類問題很有可能跟當(dāng)?shù)剡\營商網(wǎng)絡(luò)或者該地區(qū)請求到的CDN節(jié)點有關(guān)聯(lián),通常的排查方法就是在用戶側(cè)去搜集ping信息,先確認(rèn)客戶端和CDN節(jié)點之間的網(wǎng)絡(luò)延遲情況。
另外根據(jù)用戶請求到的CDN節(jié)點IP,可以綁定到該CDN節(jié)點進行測試,測試方法跟綁定到源站去測試類似,將IP地址轉(zhuǎn)換成CDN節(jié)點的IP即可。綁定節(jié)點測試前,可以先驗證該節(jié)點本身是否存在響應(yīng)慢的情況。如果響應(yīng)慢,再查看該請求是否命中緩存、加載的資源是否過大,結(jié)合前面的案例進一步分析。如果無法定位問題,可以通過提交工單等方式聯(lián)系阿里云。
適用于
CDN
全站加速