阿里性能專家全方位對比Jmeter和Locust,到底誰更香?


近些年,隨着互聯網行業的不斷發展,用戶規模也有了爆發性的增長。產品的性能成為影響用戶體驗的重要因素。因此,性能測試越來越受到大型互聯網企業的重視。

在做性能測試時,通常都會借助一些壓測工具來模擬大量的並發用戶。目前業界壓測工具種類繁多,比如Loadrunner、Jmeter、Locust、Ngrinder、Apache ab、Wrk、Webbench等。

 

面臨這么多的壓測工具,我們應該如何做出選擇呢?你在公司里現在用的是什么工具呢?

 

相信很多小伙伴此刻喊出了“Jmeter”的名字,確實是,這幾年Jmeter因其使用簡單,學習成本低,跨平台等特性,在行業內應用非常的廣泛,擁有非常高的人氣。作為一款網紅工具,Jmeter既能做接口性能測試,也可以做自動化測試。深受廣大人民群眾的喜愛。

 

另一方面,Python語言近些年在行業里也非常火,人生苦短、我用Python!使用Python來做自動化和接口測試也是非常的方便。因此,Python屆的壓測工具Locust也逐步成為越來越多人的選擇。

 

那么,在實際性能測試過程中,到底選擇Jmeter還是Locust,除了語言上的差異,它們各自有什么優點和缺點嗎?

 

 

今天,我會從不同的維度,對這兩款工具來做下對比分析,希望能幫助大家選擇適合自己的工具。

 

發壓能力

 

一個壓測工具的核心能力就是發壓能力,每秒能發出多少請求,決定這個工具能產生多大的壓力。我們先從發壓能力來對這兩款工具做下對比測試。

 

測試前的准備

為了方便測試,我首先准備了一個測試環境,一台壓力機和一台web服務器,具體信息如下

 

為了更好的測試兩個工具的發壓能力,必須得找一個性能比較好的項目來做壓測。就好比你現在要測試巔峰姚明的籃球技術,你用潘長江來陪練這就不合適了。你得把奧尼爾找來,這樣姚明才能發揮出自己的全部能力。我在服務器上部署了一個性能VIP課上的接口項目,單接口能支持TPS 1w+

 

 

 

壓力機上分別安裝了Jmeter5.1和Locust 0.13

提前寫好了Jmeter腳本和Locust腳本,兩個腳本里均只保留了http請求和斷言,為了測試最大壓力,沒有做任何參數化,也沒有使用其他影響性能的組件和代碼。

同時,為了避免鏈接數受限,已經優化了兩台機器的文件句柄數和TCP參數。

好了,一切准備就緒,battle開始,Let’s go !

 

 

 

測試場景一:相同並發下,對商品信息接口壓測,測試工具的最高TPS

 

Jmeter測試

前置條件:為了提升性能,采用了no-gui模式壓測,Jvm堆內存配置為2G。從10並發開始,壓測運行2分鍾

Jmeter測試結果

 

 

 

Jmeter結果分析:可以看到在20並發時,壓力機的CPU已經達到了90%,接近極限,TPS為3979,web服務器CPU在80%以內,還有一些剩余空間,證明還是沒壓到極限。

 

Locust測試

前置條件:

1、考慮到Locust是單進程的,不能充分利用多核CPU,於是在壓力機上開啟一個master進程,2個slave進程,組成一個單機分布式系統。

2、將腳本中的wait_time設置為0,即多次循環之間不等待。

3、使用no-web模式進行壓測(實際對比測試,web模式和no-web模式性能沒明顯差別)

 

Locust測試結果

 

看我結果我驚呆了,相同並發下,Jmeter跑出了3000+TPS,Locust只有1500+?而且還把壓力機的CPU消耗到了100%

想到了Locust官網曾提到過,默認情況下,Locust使用requests庫發送HTTP請求,性能不太好,如果要產生更高的壓力,建議使用FastHttpLocust作為HTTP客戶端來壓測,性能可以提升5-6倍

 

趕緊改了下Locust腳本,使用了FastHttpLocust客戶端,再次進行壓測,結果如下

 

 

 

可以看到,使用FastHttpLocust客戶端后,Locust性能大幅提升,在10並發時,TPS就達到了4014,因為壓力機CPU已經100%了,所以20並發下,TPS並沒有什么明顯增長。

 

場景總結

 

1、 在相同硬件配置,測試相同接口,使用相同的並發情況下,Locust產生的壓力確實高於Jmeter,這個也是由於他們的底層實現機制不同,Jmeter基於多線程,Locust基於協程

2、 無論采用哪個工具,單機能產生的TPS大體差不多,相比來說,Locust用更少的並發就能達到相同的TPS。不過Locust對壓力機的CPU消耗也更高

3、 Locust默認的HttpSession客戶端確實挺垃圾的,做壓測還是建議使用FastHttpLocust客戶端,但是Locust官網也提到了,FastHttpLocust並不能完全替代HttpSession,這個還得取決於測試場景,所以這點也是使用中的一個風險

 

測試場景二:相同配置下,測試工具能支持多少並發

前置條件:

在上一個測試場景中,無論Jmeter還是Locust,在20並發時,壓力機CPU會接近100%了,所以為了測試更高的並發,就得需要換一個性能差一些的接口。大家記住一點,性能差的接口比性能好的接口支持更高的並發

還是先測試Jmeter,從1000並發開始測,逐步增加到10000並發,結果如下

 

 

 

場景總結

 

從上面兩個工具的高並發測試來看,相同配置的機器上,兩個工具都可以跑出1w並發,不過Jmeter使用的內存高於Locust。再高的並發,個人感覺沒有必要了,單機1w並發已經滿足絕大多數的項目了(在線下測試,大部分項目幾十並發就能測出拐點),如果需要更大規模的,還是建議用多台機器分布式發壓。

 

以上兩個測試場景,都是針對壓測工具的核心能力:TPS能力和並發能力,接下來再來其他方面的對比

 

測試報告對比

Jmeter有比較豐富的HTML報表,各個維度都有

 

 

 

Locust提供了簡單的數據實時報表,不過也夠用

 

 

個人感覺在報表方面,兩個工具相差不是很大,都基本能滿足工作需求

 

學習成本 & 易用性方面

 

Jmeter有單獨的GUI界面,有豐富的內置函數,在腳本編寫方面確實比較簡單,基本上不需要寫任何代碼就能完成比較復雜的場景。

 

 

Locust沒有GUI界面,完全基於Python代碼,所以你想使用什么功能,像參數化、關聯、斷言等,都得寫代碼來完成,相比來說學習成本更高。

 

 

最終總結

 

發壓能力:相同並發下,Locust(使用FastHttpLocust)> Jmeter

並發能力:Locust和Jmeter旗鼓相當,都能滿足工作需求,Jmeter消耗的內存更高

結果報表:Jmeter好於Locust,但是基本都滿足工作需求

學習成果:Jmeter>Locust

易用性:Jmeter > Locust

 

使用建議

如果只是做簡單的接口測試、壓力測試,沒有需要寫代碼來擴展的特殊需求,首選Jmeter;

如果某些測試場景需要寫代碼來擴展,你會Java的話,可以選擇Jmeter;

如果某些測試場景需要寫代碼來擴展,你會Python的話,可以選擇Locust;

如果想在單台機器發起更大的壓力的話,並且Python代碼能力不錯的話,可以選擇Locust,記得一定要使用FastHttpLocust客戶端

 

作  者:Testfan 北河老師

出  處:微信公眾號:自動化軟件測試平台

版權說明:歡迎轉載,但必須注明出處,並在文章頁面明顯位置給出文章鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM