為什么站點(diǎn)訪問慢?請收好這份 Web 服務(wù)器性能提升的總結(jié)
優(yōu)化思路淺析
要優(yōu)化 Web 服務(wù)器的性能,我們先來看看 Web 服務(wù)器在 web 頁面處理上的步驟:
Web 瀏覽器向一個(gè)特定的服務(wù)器發(fā)出 Web 頁面請求; Web 服務(wù)器接收到 web 頁面請求后,尋找所請求的 web 頁面,并將所請求的 Web 頁面?zhèn)魉徒o Web 瀏覽器; Web 瀏覽器接收到所請求的 web 頁面內(nèi)容,并將它顯示出來。
Web 服務(wù)器從磁盤中讀取靜態(tài)頁面內(nèi)容的速度,也即時(shí)間; Web 服務(wù)器判定請求內(nèi)容是靜態(tài)還是動態(tài)內(nèi)容的時(shí)間; Web 服務(wù)器轉(zhuǎn)發(fā)請求給應(yīng)用服務(wù)器的時(shí)間; 應(yīng)用服務(wù)器處理(解釋)動態(tài)內(nèi)容所需的時(shí)間; Web 服務(wù)器返回 Web 內(nèi)容給瀏覽器的響應(yīng)時(shí)間; Web 服務(wù)器接收來自瀏覽器請求的處理性能; Web 訪問請求數(shù)據(jù)在網(wǎng)絡(luò)上傳輸?shù)臅r(shí)間:包括從瀏覽器到服務(wù)器,和從服務(wù)器到瀏覽器兩部分; 瀏覽器本地計(jì)算和渲染 Web 內(nèi)容的時(shí)間,即接收內(nèi)容后展現(xiàn)內(nèi)容的時(shí)間。
Web 服務(wù)器執(zhí)行安全策略檢查的時(shí)間,或者說性能; Web 服務(wù)器讀取日志文件、寫日志內(nèi)容、關(guān)閉對日志文件訪問的時(shí)間,先讀后寫再關(guān)閉,這三步中的讀與寫又涉及到磁盤訪問性能因素; 同時(shí)與 Web 服務(wù)器連接會話的客戶端數(shù)量大小,即并發(fā)訪問量多大。
我們可以將上面一共 11 項(xiàng)影響因素抽像出來,那么就是:
Web 服務(wù)器磁盤性能; Web 服務(wù)器與應(yīng)用服務(wù)器交互的性能; 應(yīng)用服務(wù)器處理動態(tài)內(nèi)容的性能,或者說動態(tài)內(nèi)容應(yīng)用處理性能; 客戶端與 Web 服務(wù)器的連接速度,即網(wǎng)絡(luò)傳輸性能; Web 瀏覽器解釋和渲染 Web 內(nèi)容的性能; Web 訪問并發(fā)性能。
反映到我們進(jìn)行性能優(yōu)化,可以入手的角度就有:
性能優(yōu)化實(shí)踐
1. 站點(diǎn)簡介
一個(gè)社區(qū)論壇站點(diǎn),采用 Discuz! 論壇程序構(gòu)建,該程序采用主流的 PHP + MySQL 組成。
網(wǎng)站目前有近 5 萬注冊用戶,絕大多數(shù)是國內(nèi)的用戶,活躍用戶數(shù)在一半左右,每天平均 PV 在 15~20 萬,獨(dú)立訪問 IP 數(shù)在 8000 左右。
2. Web 服務(wù)器性能優(yōu)化需求
網(wǎng)站現(xiàn)部署在國外的服務(wù)器,租用虛擬主機(jī)來運(yùn)營,因?yàn)樵L問量比較大,所以經(jīng)常會收到虛擬主機(jī)服務(wù)商的流量很大的通知,要求控制下訪問量。
另外,虛擬主機(jī)的服務(wù)器在美國,沒有在國內(nèi)租用虛擬主機(jī)的原因是國內(nèi)網(wǎng)站在備案方面非常繁瑣,在網(wǎng)站一開始運(yùn)營時(shí)數(shù)據(jù)量和訪問量都比較小,所以對性能要求不高,數(shù)據(jù)量小,所以服務(wù)器在查詢處理數(shù)據(jù)時(shí)速度比較快,也讓人感覺訪問速度不慢,現(xiàn)在隨著數(shù)據(jù)量和訪問量的不斷上升,訪問速度已明顯下降,到了需要改善訪問性能的時(shí)候了。
基于目前該社區(qū)網(wǎng)站的情況,提出的優(yōu)化需求是,國內(nèi)訪問速度需要提升一倍,目前首頁加載時(shí)間需要 40 秒左右,希望優(yōu)化后能在 20 秒以內(nèi)將首頁加載完成。
另外提出網(wǎng)站數(shù)據(jù)能夠每天自動備份一次,備份數(shù)據(jù)保留一個(gè)月的,以便隨時(shí)恢復(fù)。
上述兩點(diǎn)需求,其中第一條才是性能優(yōu)化需求,第二條是額外的需求了。
3. 性能優(yōu)化方案
根據(jù)其網(wǎng)站的現(xiàn)狀和優(yōu)化需求,結(jié)合自己的經(jīng)驗(yàn),加上谷歌的搜索,同時(shí)與網(wǎng)站主不斷確認(rèn)溝通,最終得到以下性能優(yōu)化方案:
由虛擬主機(jī)部署改為獨(dú)立服務(wù)器部署
虛擬主機(jī)受限比較多,無法自己自定義配置 Web 服務(wù)器,無法配置 PHP 動態(tài)緩存,而且獨(dú)立服務(wù)器可以獨(dú)享內(nèi)存、處理器資源,不再受虛擬主機(jī)商對每個(gè)虛擬主機(jī)用戶的內(nèi)存和處理器資源占用限制。處理器資源和內(nèi)存資源,對接受更多并發(fā)訪問有直接性能提升效果。
由 Windows 操作系統(tǒng)改為 Linux 操作系統(tǒng)
Web 服務(wù)器采用 Nginx,而不使用 Apache
對 PHP 查詢進(jìn)行動態(tài)緩存,使用 eAccelerator 這個(gè)加速器
具體地,我們計(jì)劃對 eAccelerator 進(jìn)行以下設(shè)置優(yōu)化:
緩存使用物理內(nèi)存來進(jìn)行,不使用磁盤來緩存。我們知道內(nèi)存的讀寫性能是硬盤的 N 倍,所以在內(nèi)存資源可以安排情況下,強(qiáng)烈建議使用內(nèi)存來保存 eAccelerator 的緩存內(nèi)容。 緩存大小設(shè)置為 32MB,這個(gè)值是操作系統(tǒng)默認(rèn)支持最大的緩存容量。雖然可以通過修改配置文件來加大這個(gè)值,但我們覺得沒有必要,所以就放棄了。
Nginx 性能優(yōu)化
選用了 Nginx,雖然它的性能很好,但我們?nèi)匀恍枰獙λM(jìn)行性能優(yōu)化,在這個(gè)案例中,我們做了以下優(yōu)化:
- 使用 8 個(gè)進(jìn)程,每個(gè)進(jìn)程大約需要 20M 內(nèi)存消耗,這里一共使用了 150M 左右的內(nèi)存。
- 充分使用主服務(wù)器的 CPU 內(nèi)核:
四核,使用 CPU 粘性配置選項(xiàng)(worker_cpu_affinity),每核處理器分配兩個(gè)進(jìn)程。
- 開啟 gzip 壓縮功能:
gzip 壓縮對 JS, CSS, XML 壓縮效果非常好,能壓縮一半,即減少一倍的傳輸時(shí)間;
對圖片文件,JPG 已經(jīng)壓縮過的,它的壓縮性能要少一些。
- 圖片本地緩存 1 天:
網(wǎng)站上的圖片很多,通常一張圖片上傳后,不會頻繁的修改,只會頻繁的訪問,所以將圖片放在 Nginx 緩存里,可以減少服務(wù)器訪問加載次數(shù),提升訪問速度。
- JS、CSS 文件本地緩存 7 天:
這兩種網(wǎng)頁文件,平時(shí)都不會去修改它,將它緩存起來,可以減少加載次數(shù),提升訪問速度。
為什么這兩種文件不和圖片一起設(shè)置緩存有效期,是考慮了不同文件的修改頻率不一樣。
- Nginx 日志每天切割一次:
這個(gè)優(yōu)化項(xiàng)能大大減小 Nginx 日志文件的大小,經(jīng)過一周的查看,每天的日志文件是 50M 左右,如果不是每天切割,用月切割,那一個(gè)月的日志文件就是幾個(gè) G,要 Web 服務(wù)器在內(nèi)存里加載這么大的文件,系統(tǒng)本身內(nèi)存不夠用,就自然會用到磁盤來緩存,這就影響性能。
每天 50M 左右,在內(nèi)存上完全可以順利加載,這樣 Nginx 在處理訪問時(shí),可以快速的保存訪問日志。
經(jīng)過上述幾個(gè)優(yōu)化項(xiàng)目,Nginx 這邊一共需要占用 200M 左右內(nèi)存資源。
對 PHP CGI 進(jìn)程性能進(jìn)行優(yōu)化
MySQL 數(shù)據(jù)庫性能優(yōu)化
因此我們要選擇對讀表、查詢性能更好的存儲引擎,結(jié)合以前了解的知識,MySQL 缺省的 MyISAM 引擎就是被設(shè)計(jì)為適合處理讀頻率遠(yuǎn)大于寫頻率的環(huán)境,查詢效率相當(dāng)可觀,而且內(nèi)存占用很少,這也與我們租用低內(nèi)存配置的 VPS 相符。
內(nèi)容分發(fā)網(wǎng)絡(luò)應(yīng)用