怎樣正確做 Web 應(yīng)用的壓力測試?
16 人贊同了該回答
面試的時候凳厢,很多后端或者QA的候選人都會跟我講說有過壓力測試的經(jīng)驗账胧,但在我細問之后,極少有候選人能夠把壓力測試細節(jié)講清楚先紫。
這里整理一下我認為做壓力測試時需要注意的一些細節(jié)。
環(huán)境
首先環(huán)境是非常重要的筹煮,需要盡可能跟生產(chǎn)環(huán)境靠近遮精。
比方說,使用同樣的nginx版本败潦,php的話需要啟用fpm本冲,zend-optimizer等等,參數(shù)配置也最好跟生產(chǎn)環(huán)境保持一致劫扒。
當(dāng)然檬洞,php的版本更加需要保持一致,不能說線上是跑5.3沟饥,而測試環(huán)境卻是php 7添怔;除非是要測試不同php版本的性能。
網(wǎng)絡(luò)也需要注意贤旷,測試機跟服務(wù)器之間是什么網(wǎng)絡(luò)連接广料?100M還是千兆的網(wǎng)線?也同樣需要跟生產(chǎn)環(huán)境盡可能保持一致幼驶。
我曾經(jīng)看過有人直接在自己的筆記本上跑壓測的客戶端艾杏,然后筆記本使用的wifi;這直接就變成是在測試wifi的性能了盅藻。
當(dāng)然购桑,也可以考慮直接在服務(wù)器本機上面跑壓測程序,這樣就可以規(guī)避掉網(wǎng)絡(luò)層的氏淑,更有針對的去看服務(wù)器應(yīng)用的性能勃蜘;但那就要注意壓測程序本身是否會占用過多的CPU、內(nèi)存等資源而影響到服務(wù)器應(yīng)用夸政。
在測試高并發(fā)的場景下元旬,也要注意修改linux的open files limit:
ulimit -n
命令可以顯示file descriptors的值,這值默認是1024;也就是說匀归,最多只能開1024個并發(fā)連接坑资;一般情況下夠用。
如果需要測試C10K甚至更高的并發(fā)場景時穆端,這個值就必須修改了袱贮;關(guān)于ulimit命令的詳細使用,可以參考這里
工具
最常見的web壓測工具是ab - apache benchmark体啰;我偶爾會拿ab來做簡單的快速測試攒巍。但做嚴格的測試時,ab就會顯得非常不合適荒勇。
首先柒莉,ab是單線程程序,只能利用單一CPU沽翔,在給性能好的服務(wù)器端應(yīng)用做壓測時兢孝,往往跑ab的測試機負荷滿了;而服務(wù)器應(yīng)用的性能還綽綽有余仅偎。
這在測試默認啟用多核的go程序是非常常見的跨蟹。
建議至少使用techempower所用的wrk替代ab;wrk默認可以利用單一CPU的多個核橘沥。
其次窗轩,ab僅能是對單一url進行壓測,而當(dāng)我們僅僅只是反復(fù)測試單一URL時座咆,出來的測試結(jié)果往往不能提現(xiàn)真實的壓力場景痢艺。
比方說,應(yīng)用程序反復(fù)查詢箫措、返回同一個賬號的資料腹备,跟隨機查詢、返回十萬個用戶是不一樣的斤蔓;前者的返回結(jié)果很容易就被數(shù)據(jù)庫植酥、應(yīng)用給“緩存”掉。而對于被嚴重“緩存”的性能測試結(jié)果弦牡,并不能很好的反應(yīng)真實場景下的性能表現(xiàn)友驮。
如果要模擬真實的壓測場景,我會推薦使用siege驾锰,siege的有多個參數(shù)方便模擬真實壓力場景:
-f FILE, --file=FILE參數(shù)指定一個輸入文件卸留,在文件中指定多個不同的url,然后對這多個url進行壓測椭豫。
-i, --internet則是指定隨機發(fā)送輸入文件中的url
wrk也支持使用lua腳本去生成壓測的請求耻瑟,siege上面能做的旨指,wrk肯定也可以通過自己編寫腳本去實現(xiàn)。
瓶頸
我會認為喳整,壓測的目的是在于找到系統(tǒng)的瓶頸谆构,一定是要確定系統(tǒng)某個方面達到瓶頸了,壓力測試才算是基本完成框都。
當(dāng)我們說系統(tǒng)可以支撐某某壓力時搬素,一定要同時能夠清楚的說出系統(tǒng)的瓶頸是在哪里;也就是說魏保,當(dāng)瓶頸得到改善的時候熬尺,系統(tǒng)的性能可以得到提高。
對于web應(yīng)用谓罗,系統(tǒng)的瓶頸往往會是數(shù)據(jù)庫粱哼;系統(tǒng)滿負荷運作的時候,數(shù)據(jù)庫的CPU或者是磁盤IO是否跑滿了檩咱?
如果沒有皂吮,那么很可能是說明瓶頸是在別的地方;如果是在應(yīng)用税手,那么應(yīng)用服務(wù)器的CPU、內(nèi)存需纳、IO等等也應(yīng)該有所體現(xiàn)芦倒。
找到系統(tǒng)的瓶頸,是需要反復(fù)做不同測試不翩、優(yōu)化兵扬,然后分析出來的。
對于一些性能有高要求的公司口蝠,比方說七牛云器钟,據(jù)說他們只接受網(wǎng)絡(luò)IO這一瓶頸,壓測的時候妙蔗,是一定要把千兆網(wǎng)卡跑滿傲霸,才算是性能達標(biāo);如果網(wǎng)卡沒跑滿眉反,那就說明瓶頸是在別的地方昙啄,要去不斷優(yōu)化,直到網(wǎng)卡的物理限制成為系統(tǒng)的瓶頸寸五。
延遲與吞吐
延遲latency與吞吐thoughput梳凛,是兩個相關(guān),但其實獨立的概念梳杏。
最理想的系統(tǒng)是低延遲韧拒,高吞吐淹接;但有時高延遲的系統(tǒng),吞吐是可以超過低延遲的系統(tǒng)的叛溢。
最后
偶已經(jīng)離開一線開發(fā)好幾年塑悼,上述都是根據(jù)我差不多5年前的記憶寫的,一定會有錯漏之處雇初,還望讀者指正哈拢肆!翁偉這里先謝過大家。