怎樣正確做 Web 應(yīng)用的壓力測試?

怎樣正確做 Web 應(yīng)用的壓力測試?

16 人贊同了該回答

面試的時候,很多后端或者QA的候選人都會跟我講說有過壓力測試的經(jīng)驗,但在我細(xì)問之后,極少有候選人能夠把壓力測試細(xì)節(jié)講清楚。

這里整理一下我認(rèn)為做壓力測試時需要注意的一些細(xì)節(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ò)也需要注意,測試機(jī)跟服務(wù)器之間是什么網(wǎng)絡(luò)連接?100M還是千兆的網(wǎng)線?也同樣需要跟生產(chǎn)環(huán)境盡可能保持一致。

我曾經(jīng)看過有人直接在自己的筆記本上跑壓測的客戶端,然后筆記本使用的wifi;這直接就變成是在測試wifi的性能了。

當(dāng)然,也可以考慮直接在服務(wù)器本機(jī)上面跑壓測程序,這樣就可以規(guī)避掉網(wǎng)絡(luò)層的,更有針對的去看服務(wù)器應(yīng)用的性能;但那就要注意壓測程序本身是否會占用過多的CPU、內(nèi)存等資源而影響到服務(wù)器應(yīng)用。

在測試高并發(fā)的場景下,也要注意修改linux的open files limit:

ulimit -n

命令可以顯示file descriptors的值,這值默認(rèn)是1024;也就是說,最多只能開1024個并發(fā)連接;一般情況下夠用。

如果需要測試C10K甚至更高的并發(fā)場景時,這個值就必須修改了;關(guān)于ulimit命令的詳細(xì)使用,可以參考這里

工具

最常見的web壓測工具是ab - apache benchmark;我偶爾會拿ab來做簡單的快速測試。但做嚴(yán)格的測試時,ab就會顯得非常不合適。

首先,ab是單線程程序,只能利用單一CPU,在給性能好的服務(wù)器端應(yīng)用做壓測時,往往跑ab的測試機(jī)負(fù)荷滿了;而服務(wù)器應(yīng)用的性能還綽綽有余。

這在測試默認(rèn)啟用多核的go程序是非常常見的。

建議至少使用techempower所用的wrk替代ab;wrk默認(rèn)可以利用單一CPU的多個核。

其次,ab僅能是對單一url進(jìn)行壓測,而當(dāng)我們僅僅只是反復(fù)測試單一URL時,出來的測試結(jié)果往往不能提現(xiàn)真實的壓力場景。

比方說,應(yīng)用程序反復(fù)查詢、返回同一個賬號的資料,跟隨機(jī)查詢、返回十萬個用戶是不一樣的;前者的返回結(jié)果很容易就被數(shù)據(jù)庫、應(yīng)用給“緩存”掉。而對于被嚴(yán)重“緩存”的性能測試結(jié)果,并不能很好的反應(yīng)真實場景下的性能表現(xiàn)。

如果要模擬真實的壓測場景,我會推薦使用siege,siege的有多個參數(shù)方便模擬真實壓力場景:

-f FILE, --file=FILE參數(shù)指定一個輸入文件,在文件中指定多個不同的url,然后對這多個url進(jìn)行壓測。

-i, --internet則是指定隨機(jī)發(fā)送輸入文件中的url

wrk也支持使用lua腳本去生成壓測的請求,siege上面能做的,wrk肯定也可以通過自己編寫腳本去實現(xiàn)。

瓶頸

我會認(rèn)為,壓測的目的是在于找到系統(tǒng)的瓶頸,一定是要確定系統(tǒng)某個方面達(dá)到瓶頸了,壓力測試才算是基本完成。

當(dāng)我們說系統(tǒng)可以支撐某某壓力時,一定要同時能夠清楚的說出系統(tǒng)的瓶頸是在哪里;也就是說,當(dāng)瓶頸得到改善的時候,系統(tǒng)的性能可以得到提高。

對于web應(yīng)用,系統(tǒng)的瓶頸往往會是數(shù)據(jù)庫;系統(tǒng)滿負(fù)荷運(yùn)作的時候,數(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)卡跑滿,才算是性能達(dá)標(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年前的記憶寫的,一定會有錯漏之處,還望讀者指正哈!翁偉這里先謝過大家。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容