高效能網站架構方案(二)——優化網站響應時間
高效能網站架構方案(二)——優化網站響應時間
(原創內容,轉載請註明來源,謝謝)
一、概述
優化網站響應時間是保證網站受使用者關注的要點,主要方案有:
1、減少HTTP請求
當需要載入圖片、css、js等內容時,儘量減少載入的次數。可以合併載入,另外當改動量很少時,儘量將內容進行快取。
圖片的快取可以設定更新時間,定時去伺服器檢視是否有需要更新的內容。通常可以定時在1周甚至更久的時間。
CSS、JS的快取,通常可以通過檔名的方式來判斷是否需要重新載入。當網頁確定需要載入某些js和css時,把檔案和已經快取的檔名進行判斷,檔名一致則直接用快取。因此,可以在檔名中設定版本號,如初始階段是avatar.1.js,當對此js的內容進行改動後,將html上載入的js檔名改為avatar.2.js,相應的改變伺服器上的檔名,強制進行載入。另外,對於可以網頁載入完畢後再載入的js,可以將引用的程式碼放到html標籤的最後,保證先將頁面展示出來。
2、動態內容靜態化
3、優化資料庫
資料庫的優化是網站優化的最關鍵的部分。後面專門寫。
4、使用負載均衡
可以用DNS輪詢、反向代理、HTTP重定向等方式,實現負載均衡,保證每臺web伺服器接收的請求數量大致相同。
5、使用快取
使用快取將改動量大、讀取量大等的內容儲存在記憶體中,避免資料庫的多次操作,由於記憶體的讀寫速度比I/O的速度快得多(資料庫存在硬碟中,讀寫需要經過I/O),則可以節省較多的時間。
二、吞吐率與壓力測試
吞吐率是指單位時間內伺服器處理的請求數,通常用reqs/s。吞吐率描述執行期間單位時間內處理的請求數,當需要衡量單位時間內可以承受的最大吞吐率,則需要壓力測試。
壓力測試有許多工具,如LoadRunner、JMeter、ab(Apache Bench)等。
ab是apache附帶的壓力測試軟體。可以通過linux的命令列,直接進行測試,使用方法如下:
ab[options] [http://]hostname[:port]/path
其中,options是可選引數,主要如下:
1)-n:測試會話中執行的請求數,預設是1個
2)-c:要建立的併發使用者數,預設1個
3)-t:等待web伺服器的最大響應時間,預設沒有限制
4)-k:使用keep-alive特性
5)-C:(大寫的C)對請求附加一個Cookie,形式為name=value
例項,10個併發使用者、1000次請求:
ab -c 10 -n 1000 http://localhost/index.php
其結果會有執行總次數(-n引數)、併發請求數(-c引數)、成功次數、失敗次數、總耗時、平均每個請求的耗時(即使用者平均等待時間)、平均每秒可以處理的請求數(即吞吐率)。其中,吞吐率是平均每秒處理的請求數,在結果中的引數是Request per second。
三、持久連線
持久連線(Keep-Alive)又稱為長連線,是指TCP連線中持續傳送多份資料而不斷開連線。相應的也有短連線的概念,即每次完成資料傳送後就斷開連線。
由於客戶端和伺服器每次建立連線,都需要進行三次握手,需要耗費時間。因此希望進行長連線,改變資料傳送後就斷開的情況。HTTP1.1開始支援長連線。
HTTP長連線需要瀏覽器和Web伺服器共同完成:瀏覽器需要保持一個TCP連線不斷開,並且不斷髮送多個請求;伺服器不能過早主動關閉連線。
目前大部分瀏覽器支援長連線,只需要在發出的HTTP請求資料頭中包含相關長連線的宣告即可:Connection:Keep-Alive,即在發出的header中定義該連線方式即可。
對於伺服器,則需要Web伺服器的配置中支援長連線,如:
Apache中設定:KeepAliveOn,KeepAliveTimeout 20
Nginx中配置:
http {
keepalive_timeout20; --長連線timeout
keepalive_requests 8192; --每個連線最大請求數
}
長連線對於瀏覽器和伺服器都有預設超時時間,即超過設定的時間如果還沒有請求,則斷開連線。當雙方都設定超時時間,則以較短的一方為最終的超時時間。
當大量請求小檔案時,長連線可以顯著加快速度。但是,長連線會影響到伺服器的併發效能,因此也不是所有情況都設定長連線。
——written by linhxx 2017.08.16