性能測試工具Locust–(1)概述及安裝入門
- 2020 年 3 月 4 日
- 筆記
Locust是一個簡單易用的分佈式用戶負載測試工具。它用於web站點(或其他系統)的負載測試,並計算一個系統可以處理多少並發用戶。
在測試中,一群locusts(蝗蟲)會攻擊你的網站。每個locusts (或者測試用戶)的行為由您定義,集群過程由web UI實時監控。這將幫助你在允許實際用戶使用之前測試並確定代碼中的瓶頸。
Locust完全基於事件,因此可以在一台計算機上支持數千個並發用戶。與許多其他基於事件的應用程序不同,它不使用回調。相反,它通過gevent使用輕量級進程。每個聚集站點上的蝗蟲實際上是在它自己的進程中運行的(正確的說是greenlet)。這允許你使用Python編寫非常有表現力的場景,而不用回調使代碼複雜化。
Locust特性
- 用普通的Python編寫用戶測試場景 不需要笨拙的UI或龐大的XML,只需像通常那樣編碼即可。基於協程而不是回調,您的代碼看起來和行為都與正常的、阻塞Python代碼一樣。
- 分佈式和可擴展——支持成千上萬的用戶 Locust支持在多台機器上運行負載測試。由於基於事件,即使一個Locust節點也可以在一個進程中處理數千個用戶。這背後的部分原因是,即使你模擬了那麼多用戶,也不是所有用戶都積極的訪問你的系統。通常,用戶無所事事,想知道下一步該怎麼做。每秒請求數不等於在線用戶數。
- 基於web的UI Locust具有簡潔的HTML + JS用戶界面,可實時顯示相關的測試細節。而且由於UI是基於Web的,因此它是跨平台且易於擴展的。
- 可以測試任何系統 儘管Locust是面向web的,但它幾乎可以用於測試任何系統。只需要未測試的內容編寫一個客戶端,然後用Locust訪問!超級簡單!
- 可控 Locust很小,很容易被入侵,我們打算保持這種狀態。事件I / O和協程的所有繁重工作都委託給gevent。替代測試工具的脆弱性是我們創建Locust的原因。
Locust背景
Locust 的誕生是因為我們厭倦了現有的解決方案。對我來說,他們都沒有解決正確的問題,沒有抓住重點。我們已經嘗試了Apache JMeter和Tsung。 這兩種工具都可以使用;我們已經在工作中多次使用了前一種方法。JMeter附帶UI界面,您可能會認為這是一件好事。但是您很快就會意識到,通過某些點擊界面「編碼」你的測試方案是一種陷阱。其次,JMeter是線程綁定的。這意味着對於要模擬的每個用戶,都需要一個單獨的線程。不用說,在一台機器上對成千上萬的用戶進行基準測試是不可行的。
另一方面,Tsung沒有這些線程問題,因為它是用Erlang編寫的。它可以利用BEAM自身提供的輕量級流程,並且可以愉快地擴展規模。但是在定義測試場景時,Tsung和JMeter一樣有限。它提供了基於XML的DSL來定義用戶在測試時的行為方式。我想您可以想像「編碼」這一點的恐怖。完成後顯示各種圖形或報告,需要對測試生成的日誌文件進行後期處理。只有這樣,您才能了解測試的具體情況。
不管怎樣,我們在創造Locust的時候已經嘗試解決這些問題。希望以上這些痛點都不存在。
我猜你可能會說我們真的只是在這裡撓痒痒。我們希望其他人會發現它和我們一樣有用。
安裝
Locust可以在PyPI上使用,並且可以與pip一起安裝。
$ pip3 install locust
如果您想要最新版本,可以使用pip直接從我們的Git存儲庫安裝。例如,要使用Python 3安裝master分支:
pip3 install -e git://github.com/locustio/locust.git@master#egg=locustio
安裝了Locust之後,您的shell中應該可以使用Locust命令。(如果您沒有使用virtualenv—您應該使用—請確保您的python腳本目錄位於您的路徑上)。
要查看可用的選項,請運行:
$ locust --help
Python版本支持
在Python 3.6、3.7和3.8
Windows上安裝Locust
在Windows上,運行pip install locustio
即可。
但是,如果沒有成功,那麼可以先安裝為pyzmq、gevent和greenlet預先構建的二進制包來修復它。
你可以在這裡找到一個非官方的集合,預先建立的python包的windows: http://www.lfd.uci.edu/~gohlke/pythonlibs/
下載預構建的.whl
文件後,可以使用以下方法進行安裝:
$ pip install name-of-file.whl
然後可以使用pip install locustio
進行安裝。
==注意:== 在Windows上運行Locust應該可以很好地開發和測試您的負載測試腳本。但是,在運行大規模測試時,建議您在Linux機器上這樣做,因為gevent在Windows下的性能很差。
macOS上安裝Locust
當前是使用Homebrew在OS X上安裝gevent的最短路徑。
- 安裝Homebrew。
- 安裝libev(gevent的依賴):
brew install libev
增加打開文件最大數限制
機器上的每個HTTP連接打開一個新文件(技術上稱為文件描述符)。操作系統可以為可打開的文件的最大數量設置一個較低的限制。如果該限制小於測試中模擬用戶的數量,則會發生故障。
將操作系統的默認最大文件數限制增加到大於你要運行的模擬用戶數的數量。如何執行此操作取決於所使用的操作系統。
快速入門Locust
例子locustfile.py 下面是一個簡單的locustfile.py的小例子:
from locust import HttpLocust, TaskSet, between def login(l): l.client.post("/login", {"username":"ellen_key", "password":"education"}) def logout(l): l.client.post("/logout", {"username":"ellen_key", "password":"education"}) def index(l): l.client.get("/") def profile(l): l.client.get("/profile") class UserBehavior(TaskSet): tasks = {index: 2, profile: 1} def on_start(self): login(self) def on_stop(self): logout(self) class WebsiteUser(HttpLocust): task_set = UserBehavior wait_time = between(5.0, 9.0)
這裡我們定義了一些Locust任務,它們是普通的Python可調用函數,帶有一個參數(一個Locust
類實例)。這些任務收集在tasks屬性中的TaskSet
類下。然後,我們有一個代表用戶的HttpLocust
類,在這個類中定義了模擬用戶在執行任務之間應等待的時間,以及哪個TaskSet
類應定義用戶的「行為」。TaskSet
類可以嵌套。
HttpLocust
類繼承自Locust
類,並且添加了一個client屬性,該屬性是HttpSession
的實例,可用於發出HTTP請求。
默認情況下,我們不再設置代理以提高性能。如果確實想要測試請求通過HTTP代理,你可以繼承HttpLocust
類,並將trust_env字段設置為True。有關更多細節,請參閱請求的文檔。
我們聲明任務的另一種方法(通常更方便)是使用@task裝飾器。下面代碼與上面的代碼效果一樣:
from locust import HttpLocust, TaskSet, task, between class UserBehaviour(TaskSet): def on_start(self): """ on_start is called when a Locust start before any task is scheduled """ self.login() def on_stop(self): """ on_stop is called when the TaskSet is stopping """ self.logout() def login(self): self.client.post("/login", {"username":"ellen_key", "password":"education"}) def logout(self): self.client.post("/logout", {"username":"ellen_key", "password":"education"}) @task(2) def index(self): self.client.get("/") @task(1) def profile(self): self.client.get("/profile") class WebsiteUser(HttpLocust): task_set = UserBehaviour wait_time = between(5, 9)
Locust
類(以及HttpLocust
,因為它是一個子類)還允許您指定任務執行之間的等待時間(wait_time = between(5, 9)
)以及其他用戶行為。使用between函數,可以在指定的最大值和最小值之間隨機選擇時間,但是可以通過將wait_time設置為任意函數來使用任何用戶定義的時間分佈。例如,對於平均時間為1秒的指數分佈等待時間:
import random class WebsiteUser(HttpLocust): task_set = UserBehaviour wait_time = lambda self: random.expovariate(1)*1000
啟動Locust
要使用上述Locust文件運行Locust,如果該文件名為locustfile.py且位於當前工作目錄中,則可以運行: $ locust
如果Locust文件位於與locustfile.py在不同的子目錄/或者文件名不一樣,則使用參數-f
+文件名: $ locust -f locust_files/my_locust_file.py
要在多個進程中運行Locust,我們可以通過指定--master
: $ locust -f locust_files/my_locust_file.py --master
然後我們將啟動任意數量的從屬進程: $ locust -f locust_files/my_locust_file.py --slave
如果要在多台機器上運行Locust,則在啟動從屬服務器時還必須指定主服務器主機(在單台計算機上運行Locust時不需要,因為主服務器主機默認為127.0.0.1): $ locust -f locust_files/my_locust_file.py --slave --master-host=192.168.0.100
還可以在配置文件(locust.conf或~/.locust.conf)或以LOCUST_前綴的env vars中設置參數 例如:(這將與上一個命令執行相同的操作) $ LOCUST_MASTER_HOST=192.168.0.100 locust
注意:要查看所有可用選項,請鍵入:locust—help
打開Locust的Web界面
使用上述命令行之一啟動Locust後,應打開瀏覽器並輸入http://127.0.0.1:8089或者http://localhost:8089(如果您在本地運行Locust)。然後,你會看到以下界面: (或者瀏覽器中訪問ipv6本地地址:http://[::1]:8089, 也可)

Locust UI
如果您在逐步負載模式
下運行Locust,,則應該使用以下Locust UI,如下所示:

Locust UI Step Load Mode
然後在上述幾面中輸入數量,以及要訪問的URL,點擊Start即可看到響應數據,如下圖:

性能相應數據