續《深刻淺出開源性能測試工具 Locust (使用篇 1)》git
在開始運行Locust
腳本以前,咱們先來看下Locust
支持的運行模式。github
運行Locust
時,一般會使用到兩種運行模式:單進程運行和多進程分佈式運行。golang
單進程運行模式的意思是,Locust
全部的虛擬併發用戶均運行在單個Python
進程中,具體從使用形式上,又分爲no_web
和web
兩種形式。該種模式因爲單進程的緣由,並不能徹底發揮壓力機全部處理器的能力,所以主要用於調試腳本和小併發壓測的狀況。web
當併發壓力要求較高時,就須要用到Locust
的多進程分佈式運行模式。從字面意思上看,你們可能第一反應就是多臺壓力機同時運行,每臺壓力機分擔負載一部分的壓力生成。的確,Locust
支持任意多臺壓力機(一主多從)的分佈式運行模式,但這裏說到的多進程分佈式運行模式還有另一種狀況,就是在同一臺壓力機上開啓多個slave
的狀況。這是由於當前階段大多數計算機的CPU都是多處理器(multiple processor cores
),單進程運行模式下只能用到一個處理器的能力,而經過在一臺壓力機上運行多個slave
,就能調用多個處理器的能力了。比較好的作法是,若是一臺壓力機有N
個處理器內核,那麼就在這臺壓力機上啓動一個master
,N
個slave
。固然,咱們也能夠啓動N
的倍數個slave
,可是根據個人試驗數據,效果跟N
個差很少,所以只須要啓動N
個slave
便可。瀏覽器
Locust
腳本編寫完畢後,一般不會那麼順利,在正式開始性能測試以前還須要先調試運行下。bash
不過,Locust
腳本雖然爲Python腳本,但卻很難直接當作Python腳本運行起來,爲何呢?這主要仍是由於Locust
腳本中引用了HttpLocust
和TaskSet
這兩個類,若是要想直接對其進行調用測試,會發現編寫啓動腳本是一個比較困難的事情。由於這個緣由,剛接觸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.複製代碼
若是slave
與master
不在同一臺機器上,還須要經過--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.複製代碼
master
和slave
都啓動完畢後,就能夠在瀏覽器中經過http://locust_machine_ip:8089
進入Locust
的Web管理頁面了。使用方式跟單進程web
形式徹底相同,只是此時是經過多進程負載來生成併發壓力,在web
管理界面中也能看到實際的slave
數量。
Locust
在執行測試的過程當中,咱們能夠在web
界面中實時地看到結果運行狀況。
相比於LoadRunner
,Locust
的結果展現十分簡單,主要就四個指標:併發數
、RPS
、響應時間
、異常率
。但對於大多數場景來講,這幾個指標已經足夠了。
在上圖中,RPS
和平均響應時間
這兩個指標顯示的值都是根據最近2秒請求響應數據計算獲得的統計值,咱們也能夠理解爲瞬時值。
若是想看性能指標數據的走勢,就能夠在Charts
欄查看。在這裏,能夠查看到RPS
和平均響應時間
在整個運行過程當中的波動狀況。這個功能以前在Locust
中一直是缺失的,直到最近,這個坑才被我以前在阿里移動
的同事(網絡IDmyzhan
)給填上了。當前該功能已經合併到Locust
了,更新到最新版便可使用。
除了以上數據,Locust
還提供了整個運行過程數據的百分比統計值,例如咱們經常使用的90%響應時間
、響應時間中位值
,該數據能夠經過Download response time distribution CSV
得到,數據展現效果以下所示。
經過前面對Locust
全方位的講解,相信你們對Locust
的功能特性已經很是熟悉了,在實際項目中將Locust
做爲生產力工具應該也沒啥問題了。
不過,任何一款工具都不是完美的,一定都會存在一些不足之處。可是好在Locust
具備極強的可定製型,當咱們遇到一些特有的需求時,能夠在Locust
上很方便地實現擴展。
仍是前面提到的那位技術大牛(myzhan
),他爲了擺脫CPython
的GIL
和gevent
的 monkey_patch()
,將Locust
的slave
端採用golang
進行了重寫,採用goroutine
取代了gevent
。通過測試,相較於原生的Python
實現,他的這套golang
實現具備5~10
倍以上的性能提高。當前,他已經將該實現開源,項目名稱爲myzhan/boomer
,若是你們感興趣,能夠閱讀他的博客文章進一步瞭解,《用 golang 來編寫壓測工具》。
若是咱們也想在Locust
的基礎上進行二次開發,那要怎麼開始呢?
毫無疑問,閱讀Locust
的項目源碼是必不可少的第一步。可能對於不少人來講,閱讀開源項目源碼是一件十分困難的事情,不知道如何着手,在知乎上也看到好多關於如何閱讀開源項目源碼的提問。事實上,Locust
項目的代碼結構清晰,核心代碼量也比較少,十分適合閱讀學習。哪怕只是想體驗下閱讀開源項目源碼,或者說想提高下本身的Python
技能,Locust
也是個不錯的選擇。
在下一篇文章中,我將對Locust
源碼進行解析,《深刻淺出開源性能測試工具Locust(源碼篇)》,敬請期待!
歡迎關注個人我的博客和微信公衆號。
DebugTalk