高效能設計
下面從使用者、開發者和運維人員的視角,來看看他們關注的效能是什麼。
從使用者的視角來看,效能相當於從提交請求到看到頁面的時間。
不同計算機的效能差異,不同瀏覽器解析 HTML 的速度差異,以及不同網路提供商提供的網際網路服務的速度差異,等等,都會導致從提交請求到看到頁面的時間遠大於伺服器處理請求的時間。在實踐中,我們可以採用一些前端架構最佳化手段,例如最佳化 HTML 樣式,利用瀏覽器非同步和併發的特性,調整快取策略,使用 CDN 服務、反向代理等,使使用者儘快看到內容,即使不對應用服務進行最佳化,也能夠很好地改善使用者的體驗。
從開發者的視角來看,效能的重點在於應用伺服器的效能,包括響應延遲、系統吞吐量、併發處理、系統穩定性等,主要的最佳化手段是利用快取加速資料讀取,使用叢集提高吞吐量,使用非同步加快請求響應,最佳化程式碼改善程式,等等。
從運維人員的視角來看,效能相當於一些基礎設施的效能和利用率。
主要的效能測試指標
主要的效能測試指標有響應時間、併發數、吞吐量、效能計數器等,下面分別進行講解。
◎ 響應時間:指從發出這個請求開始到接收到資料的時間,在一般情況下,這個時間都非常短,甚至不超過測試的誤差值,所以我們可以採用重複請求的方式來獲取具體的響應時間,比如請求10萬次,並記錄總時間,然後計算出單次請求的時間。
◎ 併發數指:指能夠同時處理的請求數目,對於網站而言就是併發使用者數。其中,網站系統使用者數 > 網站線上使用者數 > 網站併發使用者數。
◎ 吞吐量:指在單位時間內能夠處理的請求數,體現了系統的整體處理能力。衡量指標有很多,可以是每秒請求數、每秒頁面數、每天的訪問人數及每小時處理的業務數等。常用的量化指標有 TPS(每秒事務數)、HPS(每秒 HTTP 請求數)、QPS(每秒查詢數)等。
◎ 效能計數器:指描述伺服器或作業系統的一些效能指標,包括系統負載(System Load)、執行緒數、記憶體使用、磁碟和網路I/O等,當這些值超過警告值(安全臨界值)時,就會向開發運維人員告警,通知其及時處理異常。
效能測試方法
效能測試是一個統稱,具體可以分為效能測試、負載測試、壓力測試和穩定性測試。
◎ 效能測試:指以初期設計的指標為預期目標,不斷對系統施壓,看系統在預期的範圍內能否達到預期的效能。
◎ 負載測試:指對系統不斷增加併發請求以增加系統壓力,直到系統的某項或多項指標達到安全臨界值,這時繼續對系統施加壓力,
系統的處理能力會有所下降。
◎ 壓力測試:指在超過安全負載的情況下繼續施壓,直到系統崩潰或不再能夠處理任意請求,以此來計算系統能承受的最大壓力。
◎ 穩定性測試:指在一定的壓力(不均勻施壓)下,系統能夠穩定執行較長時間。
如圖5.6所示,a到b區間就是網站日常的執行區間,服務處理大多在這一區間內;c點相當於系統的最大負載點;b到c區間指訪問量因某些原因超過了日常訪問壓力;超過了c點後,繼續增加壓力,這時系統的效能開始下降,但是資源消耗會更多,直到d點(系統的崩潰點),超過d點繼續加壓的話,系統將不能處理任何請求。
圖5.6
效能測試反映的是系統的處理能力,與其對應的是使用者的等待時間(響應時間),如圖5.7所示。
圖5.7
圖5.7中的點與圖5.6中的點相互對應,直到系統崩潰,使用者失去響應。
效能最佳化策略
根據系統分層架構,效能最佳化可分為 We b 前端效能最佳化、應用伺服器效能最佳化和儲存效能最佳化。
1.Web前端效能最佳化
對於Web前端,可以從瀏覽器訪問、CDN、代理伺服器這三方面進行效能最佳化。
1)瀏覽器訪問最佳化瀏覽器訪問最佳化的主要方法如下。
◎ 減少HTTP請求數,主要透過合併CSS、JavaScript和圖片實現。
◎ 使用瀏覽器端快取。在某些時候,對靜態資原始檔的編寫需要及時應用到客戶端瀏覽器,可透過改變檔名實現。
◎ 啟用頁面壓縮,文字檔案的壓縮效率可達80%以上。
◎ 將CSS放在頁面最上面,將JavaScript放在頁面最下面。
◎ 減少Cookie傳輸,可以考慮透過獨立域名來傳輸Cookie。
2)CDN
C D N(內容分發網路)在本質上也屬於快取,指將資料快取在離使用者近的地方,使使用者儘快獲取資料,因為 CDN 都部署在網路運營商的機房中,這些運營商同時為使用者提供網路服務,因此使用者請求的路由會優先到達 CDN 伺服器,如果存在請求的資源,就直接返回,以最短路徑返回響應,加快使用者的訪問速度,還能夠為中心機房減輕壓力。
CDN 一般用來快取靜態資源、CSS、JavaScript 指令碼、靜態頁面、圖片等,這些內容的修改頻率很低但是訪問請求頻率很高,因此放在CDN上能夠很好地改善訪問速度。
3)代理伺服器
傳統的代理伺服器是當用戶請求不到想要的資源時,由代理伺服器幫使用者請求,使用者知道自己請求的最終伺服器是誰,比如VPN透過代理伺服器將請求轉發到站外服務網路。而反向代理是當用戶請求一個地址時,使用者請求的是反向代理伺服器,然後由反向代理伺服器請求其他伺服器獲取內容,使用者不知道最終是從哪一臺伺服器獲取的資料。反向代理Web伺服器接收HTTP請求,然後進行請求轉發,在獲取內容後將內容返回給使用者,使用者只知道是由反向代理伺服器給自己的資料,而不知道資料來源最終是從哪個伺服器來的。反向代理伺服器具有保護作用,來自網際網路的請求都需要經過反向代理伺服器,相當於在We b伺服器之間建立起一道屏障。
除安全外,可以在反向代理伺服器上進行一些靜態資源的快取,以此來加快訪問速度,減輕應用伺服器的負載壓力。
當然,也可以將某些動態資源快取在代理伺服器上,比如熱門的詞條、帖子、部落格等,這些資源的請求量可能非常大,如果每次都走一遍流程的話,就會帶來很大的壓力。同時,當這些動態內容發生改變時,會通知反向代理伺服器快取失效,代理伺服器會重新快取動態資源。
除此之外,反向代理伺服器還可以用來做負載均衡,透過負載均衡來構建伺服器叢集,以此來提高系統的總體處理能力,進而提高應用伺服器處理高併發的能力。
2.應用伺服器的效能最佳化
應用伺服器就是處理網站業務的伺服器,網站的業務程式碼都部署在這裡,主要的最佳化手段有快取、叢集、非同步等。
3.儲存效能最佳化
可以考慮使用分散式儲存、磁碟陣列和HDFS(Hadoop)。