python性能測試工具locust的使用
一、簡介
Locust 是一個易於使用,分佈式,用戶負載測試工具。它用於負載測試 web 站點(或其他系統),並計算出一個系統可以處理多少並發用戶。在測試期間,一大群虛擬用戶訪問你的網站。每個測試用戶的行為由您定義,集群過程由 web UI 實時監控。這將幫助您在讓真正的用戶進入之前進行測試並識別代碼中的瓶頸。
Locust 完全是基於事件的,因此在一臺機器上支持數千個並發用戶是可能的。與許多其他基於事件的應用程序不同,它不使用回調。相反它通過 gevent 使用輕量級協程。這允許您用 Python 編寫非常有表現力的場景,而不用回調使代碼復雜化。
二、安裝
用 pip 管理工具安裝:
pip3 install locust
檢查是否安裝成功,執行命令:locust –v
三、壓測過程
1.編寫腳本
Locust 不同於 jmeter 可以用 GUI 來創建壓測腳本。Locust 需要自己編寫 python 腳本,壓測負載腳本主要包含兩個子類UserTask和WebsiteUser,分別繼承TaskSet和Httplocust類,擁有這兩個父類的公共屬性和方法。
from locust import HttpLocust, TaskSet, task, between import os,json # 定義用戶行為 class UserTask(TaskSet): def on_start(self): '''初始化數據,每個虛擬用戶隻執行一次''' self.client.post("/login",{"username":"test","password":"123456"}) @task(2) def home_index(self): r = self.client.get("/sz/Home/DefaultHomeV2Request") assert json.loads(r.text)['Error'] == 0 @task(1) def sale(self): self.client.get("/sz/Home/FlashSaleRequest") assert json.loads(r.text)['Error'] == 0 def on_stop(self): '''銷毀數據,每個虛擬用戶隻執行一次''' self.client.post("/SignOut",{"CustomerGuid":"c7d7e646-9ce2-499b-a22e-a3c98d4545fe"}) class WebsiteUser(HttpLocust): host = 'http://10.1.62.126' task_set = UserTask wait_time = between(3, 5) if __name__ == "__main__": os.system('locust -f stress_test.py ')
locust 運行時:
- on_start() :每個並發用戶在開始前各執行一次
- on_stop():每個並發用戶在結束後各執行一次
- @task: 通過裝飾器設置運行權重,比如上面代碼中 執行任務 home_index 和 sale 的總請求為 2:1
- assert:斷言設置
- wait_time :每個任務之間設置間隔時間,隨機從3~5區間內取,單位是 s
- locust -f:指定 .py 壓測腳本路徑
2. Locust 監控
順帶提一下 locust web UI監控是基於 flask 框架,不指定 port 的話,默認地址:http://localhost:8089
開始測試,Locust 提供一個簡易的監控界面,可以看到 RPS、響應時間 和 部分曲線圖
3.運行模式
1.web UI 模式
locust -f stress_test.py –web-host 10.1.44.31 –web-port 8090
–web-host:指定 web UI IP,默認 localhost
–web-port:指定 web UI 端口,默認 8089
2. no web 模式
locust -f stress_test.py –no-web -c 100 -r 20 -t 120
–no-web:指定無 web UI模式
-c:起多少 locust 用戶(等同於起多少 tcp 連接)
-r:多少時間內,把上述 -c 設置的虛擬用戶全部啟動
-t:腳本運行多少時間,單位s
在 –no-web 模式下的報告如下:
4.分佈式進程
Locust 是由 python 編寫的,由於GIL的限制,單進程不能利用CPU多核的優勢(實際測試結果也是一樣,8核心的虛擬機,隻有一核達到瞭95%以上的使用率,其餘7核隻圍觀,不出力)。所以單臺機器上想要盡可能的壓榨 CPU,隻能開啟多進程,一般有多少個核心啟多少進程。
單臺多進程:
先啟一個 master
locust -f /home/script/stress_test.py –web-host 10.1.62.223 –master
再啟 8 個 slave
locust -f /home/script/stress_test.py –slave
slave 節點啟動後,在 locust 監控中能看到
多臺多進程:
多臺機器搭建 Locust 分佈式 和 單臺搭建多進程差不多。隻有一個區別,如果 slave 和 master 不在一臺機器上, slave 需要指定 –master-host 參數:
更多功能使用請查看Locust官方文檔,形成良好的習慣 :官方文檔
四、總結
Locust 基於 python 腳本定制化壓測,使用 python 語言來實現 參數化、關聯參數、斷言和一些復雜的壓測場景非常方便。Locust 使用協程來構建tcp連接,本身單機並發能力強,但內部是由requests庫的httpclient 發起網絡請求,requests庫功能挺全面,性能卻很一般,好在 Locust 支持分佈式,彌補瞭一定的性能缺陷。根據自己做的測試,同樣幾臺客戶機,jmeter搭建分佈式測出的 qps 比 Locust分佈式 高1/3。如果要提升 locust 單進程性能,可以將 httpclient 的實現方式從 requests 換成 geventhttpclient ,這個下一篇再講述。
以上就是python性能測試工具locust的使用的詳細內容,更多關於python性能測試工具locust的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Python locust工具使用詳解
- redis哨兵常用命令和監控示例詳解
- Python實現各種中間件的連接
- 解析高可用Redis服務架構分析與搭建方案
- Redis主從配置和底層實現原理解析(實戰記錄)