5.5 性能
一、不同角度的網站性能
普通用戶認為的網站性能
網站性能對於普通用戶來說,最直接的體現就是響應時間。用戶在瀏覽器上直觀感受到的網站響應速度,即從客戶端發送請求,到服務器返回響應內容的時間。
做為網站開發人員來說,網站性能通常會和普通的用戶理解的不一樣。
普通用戶感受到的網站性能,並不只是由網站服務器決定的。它還包括客戶端計算機和服務器通信的時間,網站服務器處理響應的時間,客戶端瀏覽器構造請求解析響應數據的時間。甚至,不同的計算機性能、不同瀏覽器解析HTML的速度、不同網絡運營商提供的網絡帶寬房屋的差異,這些都會導致用戶感受到響應時間,可能大於網站服務器處理請求的時間。
開發人員認為的網站性能
開發人員關注的主要是服務器應用程序本身,以及相關配套系統的性能。包括並發處理能力、系統穩定性、響應延遲等技術指標。
對性能優化的主要手段,包括使用緩存加速數據讀取,使用集群提高數據吞吐能力,使用異步消息加快請求響應,使用代碼改善程序性能。
運維人員認為的網站性能
運維人員關注的主要是服務器基礎設施和資源利用率。如服務器硬件的配置、網絡運營商的帶寬、數據中心的網絡架構等。主要優化手段有使用高性價比的服務器、建設優化骨干網絡、利用虛擬化技術優化資源利用等。
二、性能的指標
從開發人員的角度,網站性能的指標主要有並發數和響應時間。
並發數
並發數是指系統能夠處理請求的數量,對於網站服務器而言,並發數也就是網站並發用戶數,指同時提交請求的用戶數目。
與並發數相對應的還有網站在線用戶數(登錄用戶數)和網站用戶數(一般指注冊用戶數)。他們的關系一般是:網站用戶數>網站用戶在線數>網站用戶並發數
響應時間
響應時間是最重要的性能指標,直接反映了系統的快慢。
常見的系統操作響應時間
操作 | 響應時間 |
---|---|
打開一個網站 | 幾秒 |
在數據庫中查詢一條記錄(有索引) | 十幾毫秒 |
機械磁盤一次尋址定位 | 4毫秒 |
從機械磁盤順序讀取1MB數據 | 2毫秒 |
從SSD磁盤順序讀取1MB數據 | 0.3毫秒 |
從遠程分布式緩存Redis讀取一個數據 | 0.5毫秒 |
從內存中讀取1MB數據 | 十幾微秒 |
網絡傳輸2KB數據 | 1微秒 |
三、性能的優化
對於開發人員來說,網站性能優化一般包括Web前端性能優化、應用服務器性能優化、存儲服務器性能優化三類。
Web前端性能優化
1、減少http請求 http協議是無狀態的應用層協議,意味着每次http請求都需要建立通信鏈路、進行數據傳輸,而在服務器端,每個http請求都需要啟動獨立的線程去處理。減少http請求的數目可有效提高訪問性能。
減少http的主要手段是合並CSS、合並javascript、合並圖片。
2、使用瀏覽器緩存 對一個網站而言,CSS、javascript、logo、圖標,這些靜態資源文件更新的頻率都比較低,而這些文件又幾乎是每次http請求都需要的。如果將這些文件緩存在瀏覽器中,可以極好的改善性能。通過設置http頭中的cache-control和expires的屬性,可設定瀏覽器緩存,緩存時間可以自定義。
3、啟用壓縮 在服務器端對文件進行壓縮,在瀏覽器端對文件解壓縮,可有效減少通信傳輸的數據量。如果可以的話,盡可能的將外部的腳本、樣式進行合並,多個合為一個。文本文件的壓縮效率可達到80%以上,因此HTML、CSS、javascript文件啟用GZip壓縮可達到較好的效果。但是壓縮對服務器和瀏覽器產生一定的壓力,在網絡帶寬良好,而服務器資源不足的情況下要綜合考慮。
4、CSS放在頁面最上部,javascript放在頁面最下面 瀏覽器會在下載完成全部CSS之后才對整個頁面進行渲染,因此最好的做法是將CSS放在頁面最上面,讓瀏覽器盡快下載CSS。 Javascript則相反,瀏覽器在加載javascript后立即執行,有可能會阻塞整個頁面,造成頁面顯示緩慢,因此javascript最好放在頁面最下面。
應用服務器優化
應用服務器也就是處理網站業務的服務器,網站的業務代碼都部署在這里,主要優化方案有緩存、異步、集群等。
1、合理使用緩存
當網站遇到性能瓶頸時,第一個解決方案一般是緩存。在整個網站應用中,緩存幾乎無處不在,無論是客戶端,還是應用服務器,或是數據庫服務器。在客戶端和服務器的交互中,無論是數據、文件都可以緩存,合理使用緩存對網站性能優化非常重要。
緩存一般用來存放那些讀寫次數比較高,變化較少的數據,比如網站首頁的信息、商品的信息等。應用程序讀取數據時,一般是先從緩存中讀取,如果讀取不到或數據已失效,再訪問磁盤數據庫,並將數據再次寫入緩存。
緩存的基本原理是將數據存儲在相對有較高訪問速度的存儲介質中,比如內存。一方面緩存訪問速度快,另一方面,如果緩存的數據是需要經過計算處理得到的,那使用緩存還可以減少服務器處理數據的計算時間。
使用緩存並不是沒有缺陷:內存資源是比較寶貴的,不可能將所有數據都緩存,一般頻繁修改的數據不建議使用緩存,這會導致數據不一致。
網站數據緩存一般遵循二八定律,即80%的訪問都在20%的數據上。所以,一般將這20%的數據緩存,可以起到改善系統性能,提高服務器讀取效率。
2、異步操作
使用消息隊列將調用異步化,可以改善網站系統的性能。
在不使用消息隊列的情況下,用戶的請求直接寫入數據庫,在高並發的情況下,會對數據庫造成非常大的壓力,也會延遲響應時間。
在使用消息隊列后,用戶請求的數據會發送給消息隊列服務器,消息隊列服務器會開啟進程,將數據異步寫入數據庫。消息隊列服務器的處理速度遠超過數據庫,因此用戶的響應延遲可得到改善。
消息隊列可以將短時間內的高並發產生的事務消息,存儲在消息隊列中,從而提高網站的並發處理能力。在電商網站的促銷活動中,合理使用消息隊列,可以抵御短時間內用戶高並發的沖擊。
3、使用集群
在網站高並發訪問的情況下,使用負載均衡技術,可以為一個應用構建由多台服務器組成的服務器集群,將並發訪問請求,分發到多台服務器上處理,避免單一服務器因負載過大,而導致響應延遲。
4、代碼優化
網站的業務邏輯代碼主要部署在應用服務器上,需要處理復雜的並發事務。合理優化業務代碼,也可以改善網站性能。
任何web網站都會遇到多用戶的並發訪問,大型網站的並發用戶會達到數萬。每個用戶請求都會創建一個獨立的系統進程去處理。由於線程比進程更輕量,占用資源更少,所以,目前主流的web應用服務器都采用多線程的方式,處理並發用戶的請求,因此,網站開發多數都是多線程編程。
使用多線程的另一個原因是服務器有多個CPU,現在手機都到了8核CPU的時代,一般的服務器至少是16核CPU,要想最大限度的使用這些CPU,必須啟動多線程。
那么,啟動多少線程合適呢?
啟動線程數和CPU內核數量成正比,和IO等待時間成正比。如果都是計算型的任務,那么線程數最多不要超過CPU內核數,因為啟動再多,CPU也來不及調用。如果任務是等待讀寫磁盤、網絡響應,那么多啟動線程會提高任務並發度,提高服務器性能。
或者用個簡化的公式來描述:
啟動線程數 = (任務執行時間/(任務執行事件 - IO等待時間)) * CPU內核數
5、存儲優化
數據的讀寫是網站處理並發訪問的另一瓶頸。使用緩存雖然可以解決一部分數據讀寫壓力,但很多時候,磁盤仍然是系統最嚴重的瓶頸。而且磁盤是網站最重要的資產,磁盤的可用性和容錯性也至關重要。
機械硬盤和固態硬盤 機械硬盤是目前最常用的硬盤,通過馬達帶動磁頭到指定磁盤的位置訪問數據,每次訪問數據都需要移動磁頭,在讀取連續數據和隨機訪問上,磁頭移動的次數相差巨大,因此機械硬盤的性能表現差別巨大,讀寫效率較低。而在網站應用中,大多數數據的訪問都是隨機的,在這種情況下,固態硬盤具有更高的性能。但目前固態硬盤在工藝上、數據可靠性上還有待提升,因此固態硬盤的使用尚未普及,從發展趨勢看,取代機械硬盤應該是遲早的事情。
總結:
網站性能優化是在用戶高並發訪問,網站遇到問題時的解決方案。所以網站性能優化的主要內容是改善高並發用戶訪問情況下的網站響應速度。
網站性能優化的最終目的是改善用戶的體驗。但性能優化本身也是需要綜合考慮的。比如說,性能提高一倍,服務器數量也要增加一倍,這樣的優化是否可以考慮?
技術是由業務驅動的,離開業務的支撐,任何性能優化都是空中樓閣。