大型高性能網(wǎng)站性能測試方法
性能測試是一個(gè)總稱,具體可細(xì)分為性能測試、負(fù)載測試、壓力測試、穩(wěn)定性測試。
深圳網(wǎng)站建設(shè)以系統(tǒng)設(shè)計(jì)初期規(guī)劃的性能指標(biāo)為預(yù)期目標(biāo),對系統(tǒng)不斷施加壓力,驗(yàn)證系統(tǒng)在資源可接受范圍內(nèi),是否能達(dá)到性能預(yù)期。
負(fù)載測試
對系統(tǒng)不斷地增加并發(fā)請求以增加系統(tǒng)壓力,直到系統(tǒng)的某項(xiàng)或多項(xiàng)性能指標(biāo)達(dá)到安全臨界值,如某種資源已經(jīng)呈飽和狀態(tài),這時(shí)繼續(xù)對系統(tǒng)施加壓力,系統(tǒng)的處理能力不但不能提高,反而會(huì)下降。
壓力測試
超過安全負(fù)載的情況下,對系統(tǒng)繼續(xù)施加壓力,直到系統(tǒng)崩潰或不能再處理任何請求,以此獲得系統(tǒng)最大壓力承受能力。
穩(wěn)定性測試
被測試系統(tǒng)在特定硬件、軟件、網(wǎng)絡(luò)環(huán)境條件下,給系統(tǒng)加載一定業(yè)務(wù)壓力,使系統(tǒng)運(yùn)行一段較長時(shí)間,以此檢測系統(tǒng)是否穩(wěn)定。在不同生產(chǎn)環(huán)境、不同時(shí)間點(diǎn)的請求壓力是不均勻的,呈波浪特性,因此為了更好地模擬生產(chǎn)環(huán)境,穩(wěn)定性測試也應(yīng)不均勻地對系統(tǒng)施加壓力。
性能測試是一個(gè)不斷對系統(tǒng)增加訪問壓力,以獲得系統(tǒng)性能指標(biāo)、最大負(fù)載能力、最大壓力承受能力的過程。所謂的增加訪問壓力,在系統(tǒng)測試環(huán)境中,就是不斷增加測試程序的并發(fā)請求數(shù),一般說來,性能測試遵循如圖4.3所示的拋物線規(guī)律。圖4.3中的橫坐標(biāo)表示消耗的系統(tǒng)資源,縱坐標(biāo)表示系統(tǒng)處理能力(吞吐量)。在開始階段,隨著并發(fā)請求數(shù)目的增加,系統(tǒng)使用較少的資源就達(dá)到較好的處理能力U?b段),這一段是網(wǎng)站的日常運(yùn)行區(qū)間,網(wǎng)站的絕大部分訪問負(fù)載壓力都集中在這一段區(qū)間。
被稱作性能測試,測試目標(biāo)是評估系統(tǒng)性能是否符合需求及設(shè)計(jì)目標(biāo);隨著壓力的持續(xù)增加,系統(tǒng)處理能力增加變緩,直到達(dá)到一個(gè)最大值(c點(diǎn)),這是系統(tǒng)的最大負(fù)載點(diǎn),這一段被稱作負(fù)載測試。測試目標(biāo)是評估當(dāng)系統(tǒng)因?yàn)橥话l(fā)事件超出日常訪問壓力的情況下,保證系統(tǒng)正常運(yùn)行情況下能夠承受的最大訪問負(fù)載壓力;超過這個(gè)點(diǎn)后,再增加壓力,系統(tǒng)的處理能力反而下降,而資源消耗卻更多,直到資源消耗達(dá)到極限(d點(diǎn)),這個(gè)點(diǎn)可以看作是系統(tǒng)的崩潰點(diǎn),超過這個(gè)點(diǎn)繼續(xù)加大并發(fā)請求數(shù)目,系統(tǒng)不能再處理任何請求,這一段被稱作壓力測試,測試目標(biāo)是評估可能導(dǎo)致系統(tǒng)崩潰的最大訪問負(fù)載壓力。
性能測試反應(yīng)的是系統(tǒng)在實(shí)際生產(chǎn)環(huán)境中使用時(shí),隨著用戶并發(fā)訪問數(shù)最的增加,系統(tǒng)的處理能力。與性能曲線相對應(yīng)的是用戶訪問的等待時(shí)間(系統(tǒng)響應(yīng)時(shí)間),如圖4.4所示。
4.1.4性能測試報(bào)告
測試結(jié)果報(bào)告應(yīng)能夠反映上述性能測試曲線的規(guī)律,閱讀者可以得到系統(tǒng)性能是否滿足設(shè)計(jì)目標(biāo)和業(yè)務(wù)要求、系統(tǒng)最大負(fù)載能力、系統(tǒng)最大壓力承受能力等重要信息,表4.2是一個(gè)簡單示例。
4.1.5性能優(yōu)化策略
如果性能測試結(jié)果不能滿足設(shè)計(jì)或業(yè)務(wù)需求,那么就需要尋找系統(tǒng)瓶頸,分而治之,逐步優(yōu)化。
1.性能分析
大型網(wǎng)站結(jié)構(gòu)復(fù)雜,用戶從瀏覽器發(fā)出請求直到數(shù)據(jù)庫完成操作事務(wù),中間需要經(jīng)過很多環(huán)節(jié),如果測試或者用戶報(bào)告網(wǎng)站響應(yīng)緩慢,存在性能問題,必須對請求經(jīng)歷的各個(gè)環(huán)節(jié)進(jìn)行分析,排查可能出現(xiàn)性能瓶頸的地方,定位問題。
排查—個(gè)網(wǎng)站的性能瓶頸和排查一個(gè)程序的性能瓶頸的手法基本相同:檢查請求處理的各個(gè)環(huán)節(jié)的日志,分析哪個(gè)環(huán)節(jié)響應(yīng)時(shí)間不合理、超過預(yù)期;然后檢查監(jiān)控?cái)?shù)據(jù),分析影響性能的主要因素是內(nèi)存、磁盤、網(wǎng)絡(luò)、還是CPU,是代碼問題還是架構(gòu)設(shè)計(jì)不合理,或者系統(tǒng)資源確實(shí)不足。
2.性能優(yōu)化
定位產(chǎn)生性能問題的具體原因后,就需要進(jìn)行性能優(yōu)化,根據(jù)網(wǎng)站分層架構(gòu),可分為Web前端性能優(yōu)化、應(yīng)用服務(wù)器性能優(yōu)化、存儲(chǔ)服務(wù)器性能優(yōu)化3大類。
4.2 Web前端性能優(yōu)化
一般說來Web前端指網(wǎng)站業(yè)務(wù)邏輯之前的部分,包括瀏覽器加載、網(wǎng)站視圖模型、圖片服務(wù)、CDN服務(wù)等,主要優(yōu)化手段有優(yōu)化瀏覽器訪問、使用反向代理、CDN等。
4.2.1瀏覽器訪問優(yōu)化
1.減少http請求
HTTP協(xié)議是無狀態(tài)的應(yīng)用層協(xié)議,意味著每次HTTP請求都需要建立通信鏈路、進(jìn)行數(shù)據(jù)傳輸,而在服務(wù)器端,每個(gè)HTTP都需要啟動(dòng)獨(dú)立的線程去處理。這些通信和服務(wù)的開銷都很昂貴,減少HTTP請求的數(shù)目可有效提高訪問性能。
減少HTTP的主要手段是合并CSS、合并JavaScript、合并圖片。將瀏覽器一次訪問需要的JavaScript、CSS合并成一個(gè)文件,這樣瀏覽器就只需要一次請求。圖片也可以合并,多張圖片合并成一張,如果每張圖片都有不同的超鏈接,可通過CSS偏移響應(yīng)鼠標(biāo)點(diǎn)擊操作,構(gòu)造不同的URL。
2.使用瀏覽器緩存
對一個(gè)網(wǎng)站而言,CSS、JavaScript、Logo、圖標(biāo)這些靜態(tài)資源文件更新的頻率都比較低,而這些文件又幾乎是每次HTTP請求都需要的,如果將這些文件緩存在瀏覽器中,
較低,而這些文件又幾乎是每次HTTP請求都需要的,如果將這些文件緩存在瀏覽器中,可以極好地改善性能。通過設(shè)置HTTP頭中Cache-Control和Expires的屬性,可設(shè)定瀏覽器緩存,緩存時(shí)間可以是數(shù)天,甚至是幾個(gè)月。
在某些時(shí)候,靜態(tài)資源文件變化需要及時(shí)應(yīng)用到客戶端瀏覽器,這種情況,可通過改變文件名實(shí)現(xiàn),即更新JavaScript文件并不是更新JavaScript文件內(nèi)容,而是生成一個(gè)新的JS文件并更新HTML文件中的引用。
使用瀏覽器緩存策略的網(wǎng)站在更新靜態(tài)資源時(shí),應(yīng)采用批量更新的方法,比如需要更新10個(gè)圖標(biāo)文件,不宜把10個(gè)文件一次全部更新,而是應(yīng)一個(gè)文件一個(gè)文件逐步更新,并有一定的間隔時(shí)間,以免用戶瀏覽器突然大量緩存失效,集中更新緩存,造成服務(wù)器負(fù)載驟增、網(wǎng)絡(luò)堵塞的情況。
3.啟用壓縮
在服務(wù)器端對文件進(jìn)行壓縮,在瀏覽器端對文件解壓縮,可有效減少通信傳輸?shù)臄?shù)在服務(wù)器端對文件進(jìn)行壓縮,在瀏覽器端對文件解壓縮,可有效減少通信傳輸?shù)臄?shù)據(jù)墩。文本文件的壓縮效率可達(dá)80%以上,因此HTML、CSS、JavaScript文件啟用GZip壓縮可達(dá)到較好的效果。但是壓縮對服務(wù)器和瀏覽器產(chǎn)生一定的壓力,在通信帶寬良好,而服務(wù)器資源不足的情況下要權(quán)衡考慮。
4.CSS放在頁面最上面、JavaScript放在頁面最下面
瀏覽器會(huì)在下載完全部CSS之后才對整個(gè)頁面進(jìn)行渲染,因此最好的做法是將CSS放在頁面最上面,讓瀏覽器盡快下載CSS。JavaScript則相反,瀏覽器在加載JavaScript后立即執(zhí)行,有可能會(huì)阻塞整個(gè)頁面,造成頁面顯示緩慢,因此』avaScript最好放在頁面最下面。但如果頁面解析時(shí)就需要用到JavaScript,這時(shí)放在底部就不合適了。
5.減少Cookie傳輸
一方面,Cookie包含在每次請求和響應(yīng)中,太大的Cookie會(huì)嚴(yán)重影響數(shù)據(jù)傳輸,因此哪些數(shù)據(jù)需要寫入Cookie需要慎重考慮,盡最減少Cookie中傳輸?shù)臄?shù)據(jù)最。另一方面,對于某些靜態(tài)資源的訪問,如CSS、Script等,發(fā)送Cookie沒有意義,可以考慮靜態(tài)資源使用獨(dú)立域名訪問,避免請求靜態(tài)資源時(shí)發(fā)送Cookie,減少Cookie傳輸?shù)拇螖?shù)。
4.2.2 CDN 加速
CDN( Content Distribute Network,內(nèi)容分發(fā)網(wǎng)絡(luò))的本質(zhì)仍然是一個(gè)緩存,而且將數(shù)據(jù)緩存在離用戶最近的地方,使用戶以最快速度獲取數(shù)據(jù),即所謂網(wǎng)絡(luò)訪問第一跳,如圖4.5所示。
由于CDN部署在網(wǎng)絡(luò)運(yùn)營商的機(jī)房,這些運(yùn)營商又是終端用戶的網(wǎng)絡(luò)服務(wù)提供商,因此用戶請求路由的第一跳就到達(dá)了 CDN服務(wù)器,當(dāng)CDN中存在瀏覽器請求的資源時(shí),從CDN直接返回給瀏覽器,最短路徑返回響應(yīng),加快用戶訪問速度,減少數(shù)據(jù)中心負(fù)載壓力。
CDN能夠緩存的一般是靜態(tài)資源,如圖片、文件、CSS、Script腳本、靜態(tài)網(wǎng)頁等,但是這些文件訪問頻度很高,將其緩存在CDN可極大改善網(wǎng)頁的打開速度。