深刻淺出開源性能測試工具 Locust (使用篇 2)

《深刻淺出開源性能測試工具 Locust (使用篇 1)》git

Locust運行模式

在開始運行Locust腳本以前,咱們先來看下Locust支持的運行模式。github

運行Locust時,一般會使用到兩種運行模式:單進程運行和多進程分佈式運行。golang

單進程運行模式的意思是,Locust全部的虛擬併發用戶均運行在單個Python進程中,具體從使用形式上,又分爲no_webweb兩種形式。該種模式因爲單進程的緣由,並不能徹底發揮壓力機全部處理器的能力,所以主要用於調試腳本和小併發壓測的狀況。web

當併發壓力要求較高時,就須要用到Locust的多進程分佈式運行模式。從字面意思上看,你們可能第一反應就是多臺壓力機同時運行,每臺壓力機分擔負載一部分的壓力生成。的確,Locust支持任意多臺壓力機(一主多從)的分佈式運行模式,但這裏說到的多進程分佈式運行模式還有另一種狀況,就是在同一臺壓力機上開啓多個slave的狀況。這是由於當前階段大多數計算機的CPU都是多處理器(multiple processor cores),單進程運行模式下只能用到一個處理器的能力,而經過在一臺壓力機上運行多個slave,就能調用多個處理器的能力了。比較好的作法是,若是一臺壓力機有N個處理器內核,那麼就在這臺壓力機上啓動一個masterNslave。固然,咱們也能夠啓動N的倍數個slave,可是根據個人試驗數據,效果跟N個差很少,所以只須要啓動Nslave便可。瀏覽器

腳本調試

Locust腳本編寫完畢後,一般不會那麼順利,在正式開始性能測試以前還須要先調試運行下。bash

不過,Locust腳本雖然爲Python腳本,但卻很難直接當作Python腳本運行起來,爲何呢?這主要仍是由於Locust腳本中引用了HttpLocustTaskSet這兩個類,若是要想直接對其進行調用測試,會發現編寫啓動腳本是一個比較困難的事情。由於這個緣由,剛接觸Locust的同窗可能就會以爲Locust腳本很差調試。微信

但這個問題也能克服,那就是藉助Locust的單進程no_web運行模式。網絡

Locust的單進程no_web運行模式中,咱們能夠經過--no_web參數,指定併發數(-c)和總執行次數(-n),直接在Terminal中執行腳本。併發

在此基礎上,當咱們想要調試Locust腳本時,就能夠在腳本中須要調試的地方經過print打印日誌,而後將併發數和總執行次數都指定爲1,執行形式以下所示。分佈式

$ locust -f locustfile.py --no_web -c 1 -n 1複製代碼

經過這種方式,咱們就能很方便地對Locust腳本進行調試了。

執行測試

Locust腳本調試經過後,就算是完成了全部準備工做,能夠開始進行壓力測試了。

Locust是經過在Terminal中執行命令進行啓動的,通用的參數有以下兩個:

  • -H, --host:被測系統的host,若在Terminal中不進行指定,就須要在Locust子類中經過host參數進行指定;
  • -f, --locustfile:指定執行的Locust腳本文件;

除了這兩個通用的參數,咱們還須要根據實際測試場景,選擇不一樣的Locust運行模式,而模式的指定也是經過其它參數來進行控制的。

單進程運行

no_web

若是採用no_web形式,則需使用--no-web參數,並會用到以下幾個參數。

  • -c, --clients:指定併發用戶數;
  • -n, --num-request:指定總執行測試;
  • -r, --hatch-rate:指定併發加壓速率,默認值位1。
$ locust -H http://debugtalk.com -f demo.py --no-web -c1 -n2
[2017-02-21 21:27:26,522] Leos-MacBook-Air.local/INFO/locust.main: Starting Locust 0.8a2
[2017-02-21 21:27:26,523] Leos-MacBook-Air.local/INFO/locust.runners: Hatching and swarming 1 clients at the rate 1 clients/s...
 Name                                                          # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------
 Total                                                              0     0(0.00%)                                       0.00

[2017-02-21 21:27:27,526] Leos-MacBook-Air.local/INFO/locust.runners: All locusts hatched: WebsiteUser: 1
[2017-02-21 21:27:27,527] Leos-MacBook-Air.local/INFO/locust.runners: Resetting stats

 Name                                                          # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------
 GET /about/                                                        0     0(0.00%)       0       0       0  |       0    0.00
--------------------------------------------------------------------------------------------------------------------------------------
 Total                                                              0     0(0.00%)                                       0.00

 Name                                                          # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------
 GET /about/                                                        1     0(0.00%)      17      17      17  |      17    0.00
--------------------------------------------------------------------------------------------------------------------------------------
 Total                                                              1     0(0.00%)                                       0.00

[2017-02-21 21:27:32,420] Leos-MacBook-Air.local/INFO/locust.runners: All locusts dead

[2017-02-21 21:27:32,421] Leos-MacBook-Air.local/INFO/locust.main: Shutting down (exit code 0), bye.
 Name                                                          # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------
 GET /                                                              1     0(0.00%)      20      20      20  |      20    0.00
 GET /about/                                                        1     0(0.00%)      17      17      17  |      17    0.00
--------------------------------------------------------------------------------------------------------------------------------------
 Total                                                              2     0(0.00%)                                       0.00

Percentage of the requests completed within given times
 Name                                                           # reqs 50% 66% 75% 80% 90% 95% 98% 99% 100%
--------------------------------------------------------------------------------------------------------------------------------------
 GET /                                                               1     20     20     20     20     20     20     20     20     20
 GET /about/                                                         1     17     17     17     17     17     17     17     17     17
--------------------------------------------------------------------------------------------------------------------------------------複製代碼

web

若是採用web形式,,則一般狀況下無需指定其它額外參數,Locust默認採用8089端口啓動web;若是要使用其它端口,就可使用以下參數進行指定。

  • -P, --port:指定web端口,默認爲8089.
$ locust -H http://debugtalk.com -f demo.py
[2017-02-21 21:31:26,334] Leos-MacBook-Air.local/INFO/locust.main: Starting web monitor at *:8089
[2017-02-21 21:31:26,334] Leos-MacBook-Air.local/INFO/locust.main: Starting Locust 0.8a2複製代碼

此時,Locust並無開始執行測試,還須要在Web頁面中配置參數後進行啓動。

若是Locust運行在本機,在瀏覽器中訪問http://localhost:8089便可進入Locust的Web管理頁面;若是Locust運行在其它機器上,那麼在瀏覽器中訪問http://locust_machine_ip:8089便可。

Locust的Web管理頁面中,須要配置的參數只有兩個:

  • Number of users to simulate: 設置併發用戶數,對應中no_web模式的-c, --clients參數;
  • Hatch rate (users spawned/second): 啓動虛擬用戶的速率,對應着no_web模式的-r, --hatch-rate參數。

參數配置完畢後,點擊【Start swarming】便可開始測試。

多進程分佈式運行

不論是單機多進程,仍是多機負載模式,運行方式都是同樣的,都是先運行一個master,再啓動多個slave

啓動master時,須要使用--master參數;一樣的,若是要使用8089之外的端口,還須要使用-P, --port參數。

$ locust -H http://debugtalk.com -f demo.py --master --port=8088
[2017-02-21 22:59:57,308] Leos-MacBook-Air.local/INFO/locust.main: Starting web monitor at *:8088
[2017-02-21 22:59:57,310] Leos-MacBook-Air.local/INFO/locust.main: Starting Locust 0.8a2複製代碼

master啓動後,還須要啓動slave才能執行測試任務。

啓動slave時須要使用--slave參數;在slave中,就不須要再指定端口了。

$ locust -H http://debugtalk.com -f demo.py --slave
[2017-02-21 23:07:58,696] Leos-MacBook-Air.local/INFO/locust.main: Starting Locust 0.8a2
[2017-02-21 23:07:58,696] Leos-MacBook-Air.local/INFO/locust.runners: Client 'Leos-MacBook-Air.local_980ab0eec2bca517d03feb60c31d6a3a' reported as
 ready. Currently 2 clients ready to swarm.複製代碼

若是slavemaster不在同一臺機器上,還須要經過--master-host參數再指定master的IP地址。

$ locust -H http://debugtalk.com -f demo.py --slave --master-host=<locust_machine_ip>
[2017-02-21 23:07:58,696] Leos-MacBook-Air.local/INFO/locust.main: Starting Locust 0.8a2
[2017-02-21 23:07:58,696] Leos-MacBook-Air.local/INFO/locust.runners: Client 'Leos-MacBook-Air.local_980ab0eec2bca517d03feb60c31d6a3a' reported as
 ready. Currently 2 clients ready to swarm.複製代碼

masterslave都啓動完畢後,就能夠在瀏覽器中經過http://locust_machine_ip:8089進入Locust的Web管理頁面了。使用方式跟單進程web形式徹底相同,只是此時是經過多進程負載來生成併發壓力,在web管理界面中也能看到實際的slave數量。

測試結果展現

Locust在執行測試的過程當中,咱們能夠在web界面中實時地看到結果運行狀況。

相比於LoadRunnerLocust的結果展現十分簡單,主要就四個指標:併發數RPS響應時間異常率。但對於大多數場景來講,這幾個指標已經足夠了。

在上圖中,RPS平均響應時間這兩個指標顯示的值都是根據最近2秒請求響應數據計算獲得的統計值,咱們也能夠理解爲瞬時值。

若是想看性能指標數據的走勢,就能夠在Charts欄查看。在這裏,能夠查看到RPS平均響應時間在整個運行過程當中的波動狀況。這個功能以前在Locust中一直是缺失的,直到最近,這個坑才被我以前在阿里移動的同事(網絡IDmyzhan)給填上了。當前該功能已經合併到Locust了,更新到最新版便可使用。

除了以上數據,Locust還提供了整個運行過程數據的百分比統計值,例如咱們經常使用的90%響應時間響應時間中位值,該數據能夠經過Download response time distribution CSV得到,數據展現效果以下所示。

總結

經過前面對Locust全方位的講解,相信你們對Locust的功能特性已經很是熟悉了,在實際項目中將Locust做爲生產力工具應該也沒啥問題了。

不過,任何一款工具都不是完美的,一定都會存在一些不足之處。可是好在Locust具備極強的可定製型,當咱們遇到一些特有的需求時,能夠在Locust上很方便地實現擴展。

仍是前面提到的那位技術大牛(myzhan),他爲了擺脫CPythonGILgeventmonkey_patch(),將Locustslave端採用golang進行了重寫,採用goroutine取代了gevent。通過測試,相較於原生的Python實現,他的這套golang實現具備5~10倍以上的性能提高。當前,他已經將該實現開源,項目名稱爲myzhan/boomer,若是你們感興趣,能夠閱讀他的博客文章進一步瞭解,《用 golang 來編寫壓測工具》

若是咱們也想在Locust的基礎上進行二次開發,那要怎麼開始呢?

毫無疑問,閱讀Locust的項目源碼是必不可少的第一步。可能對於不少人來講,閱讀開源項目源碼是一件十分困難的事情,不知道如何着手,在知乎上也看到好多關於如何閱讀開源項目源碼的提問。事實上,Locust項目的代碼結構清晰,核心代碼量也比較少,十分適合閱讀學習。哪怕只是想體驗下閱讀開源項目源碼,或者說想提高下本身的Python技能,Locust也是個不錯的選擇。

在下一篇文章中,我將對Locust源碼進行解析,《深刻淺出開源性能測試工具Locust(源碼篇)》,敬請期待!

GitHub項目地址

Stormer

硬廣

歡迎關注個人我的博客和微信公衆號。

相關文章
相關標籤/搜索