Locust是一種基于python語言的壓測框架渡八,本質上是基于gevent的多協(xié)程機制双泪。這里協(xié)程跟線程(thread)的區(qū)別是切換開銷小坞古、可以由用戶控制切換。但是一個線程基本上同時只能運行一個協(xié)程酱鸭,所以從理論上來說協(xié)程性能并沒有線程好吗垮,但在不同的場景應用下還是有些區(qū)別的。
Locust的安裝
Locust對python2和python3均支持凹髓,但現(xiàn)在python2已經不再更新烁登,所以使用python3為主。那么我們要根據實際的壓測機器來選擇具體的python版本蔚舀,然后再確定Locust的版本饵沧。目前windows7依然有很高的使用率,如果不巧你的壓測機器是windows7的話就只能找python3.6的版本(windows7最高支持到3.6)赌躺,如果不是那么可以選更高的python版本捷泞,越新的越穩(wěn)定的越好。
可以在Locust源碼頁面里看到各版本的Locust所支持的python版本寿谴,https://github.com/locustio/locust。選好版本后就可以進行安裝了失受,根據你是windows還是linux或者mac系統(tǒng)選擇合適的安裝方式讶泰。與python的基本第三方包一樣,Locust安裝會自動把需要的包都自動安裝好拂到,我們需要注意的是有一些第三方包可能跟你的系統(tǒng)相沖突痪署。其中最主要的就是gevent庫、greenlet庫(這兩個是協(xié)程相關庫兄旬,跟性能和穩(wěn)定性息息相關)狼犯、msgpack庫(這個在實際中也遇到過)余寥。對這些庫可以進行回退或者選擇合適的版本,可以在這些第三方庫的官方網站找相關線索悯森。直接在python官方網址搜索庫名即可宋舷,https://www.python.org/。
以windows舉例瓢姻,可以使用pip進行安裝祝蝠,在cmd窗口輸入如下命令(假設安裝的版本是2.4.1):
pip install locust==2.4.1
目前pip國內經常會卡頓,遇上速度較慢可以使用國內鏡像源:
pip install locust==2.4.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
安裝好之后可以使用pip命令查看locust和其所需要的第三方包版本:
pip -list
locust的源碼位置在你的python安裝目錄下幻碱,有時可根據需求進行修改:
C:\Python36\Lib\site-packages\locust
Locust的基本使用
如果是進行簡單的Http壓測绎狭,那么可以從一個簡單的HttpLocust入手:
class UserBehavior(TaskSet):
@task()
def init(self):
... # 一次http請求
class WebsiteUser(HttpLocust):
host = '0.0.0.0' # 某個ip或域名
task_set = UserBehavior # 自己定義的類
min_wait = 0
max_wait = 1000
如此,就是一個簡單的Locust框架褥傍。min_wait和max_wait是必須自定義的儡嘶,他們代表請求間隔的范圍,框架會自動在這個范圍里隨機一個時間出來恍风。TaskSet和@task是Locust的固定用法蹦狂,每次每個協(xié)程(Locust的用戶)會在TaskSet中隨機選一個進行執(zhí)行,Locust也提供順序TaskSet等不同需求邻耕。
寫完腳本需要執(zhí)行起來了鸥咖,這里就是告訴Locust幫我生成用戶進行壓測,前面我們已經設置了請求的間隔兄世,那么運行起來之后我們可以設定Locust最終生成多少用戶進行請求以及孵化這些用戶的效率啼辣。
上面的代碼我們找一個新的文件保存起來,起個腳本的名字御滩,如some_http_request.py鸥拧。然后在cmd窗口可輸入以下命令:
locust -f some\_http\_request.py --web-host=127.0.0.1
locust有很多種運行方式,可參考官方文檔削解,這里是單機執(zhí)行富弦,即只有一臺壓測機情況。同時使用網頁開啟氛驮,開啟網頁的ip這里是配置在了本機上腕柜,可根據需要修改。執(zhí)行完cmd命令后矫废,可打開瀏覽器(盡量不要使用ie):127.0.0.1:8089盏缤。ip是前面設定的保持一致,端口號則在源碼中蓖扑,如有沖突可以根據需求去源碼中修改唉铜。打開之后:
Nubers of users是總的用戶數量,其實就是壓測其來之后locust會孵化多少個協(xié)程出來進行壓測律杠,而Spawn rate則是孵化用戶的數量潭流,所以剛開始壓測時候你會發(fā)現(xiàn)rps可能跟你預設的不符竞惋,原因就在這。這里也是方便了測試服務器在剛開始承壓和一段時候的承壓能力的不同灰嫉。
壓測之后可以從網頁上下載壓測報告拆宛,有實時曲線可以看到response time和rps,有時服務器的承壓能力不夠會出現(xiàn)response time無限增大或者為0(極少數短時間沒有返回)熬甫,此時rps可能達不到預期或很低甚至接近于0胰挑,因為locust總共就會孵化設定好的用戶,每個用戶都按設定的時間間隔來請求椿肩,當本次請求時間過長或者沒有返回時候瞻颂,下次請求就不會發(fā)生,所以rps統(tǒng)計會極低郑象。
Locust的多機使用
當壓測機不止一臺時候贡这,通常情況是因為一臺滿足不了所需要的性能要求(特別當rps需求過高的時候,需要的協(xié)程用戶更多)厂榛,就需要多臺機器一起進行壓測了盖矫。
Locust支持一臺master和多臺worker(更早版本叫slave)形式。這時候通常壓測腳本不要需要變動击奶,在master機器和worker機器上使用不同的cmd命令即可辈双。
master機器上:
locust -f some\_http\_request.py --web-host=127.0.0.1 --master --master-host=127.0.0.1
worker機器上:
locust -f some\_http\_request.py --worker --master-host=127.0.0.1
如果master機器也需要執(zhí)行壓測,即不僅僅是做控制和統(tǒng)計來用柜砾,那么也可以執(zhí)行worker的命令湃望,同時兼有worker的運行。注意檢測下壓測機器的性能即可痰驱,在cpu证芭、內存、硬盤担映、io等指標上不要超標導致壓測結果不準確废士,這里主要注意的就是cpu和內存。
注意web-host的部署僅僅是配置了控制網頁的機器蝇完,不要求此機器一定要和master機器一致官硝。特別是在Linux作為壓測機器時候,如果把windows機器作為控制頁面的機器短蜕,master和worker機器都是Linux泛源,就會很方便控制壓測和獲取報告,這里要注意的就是master忿危、worker和控制頁面機器要互相能夠ping通。
Locust實際中常見的問題
1. 基于Locust的Http壓測
針對Http接口没龙,對服務器進行性能壓測或者自動化的接口測試是比較常見的測試內容铺厨。Locust對Http接口提供了request庫基本請求缎玫,并提供了一種FastHttpUser更高效的方案。后者可以參考官方文檔https://docs.locust.io/en/stable/increase-performance.html解滓。使用時候直接把HttpUser換成FastHttpUser 即可赃磨,訪問url一樣使用request方法。
# 2. 針對非Http的壓測
如前文所述洼裤,Locust是一種多協(xié)程壓測的框架邻辉,本質上是利用多協(xié)程進行同時間多次(就是所謂的rps或者tps)對接口進行訪問,已達到一定的壓力腮鞍。比較常見的就是socket連接值骇,包含Websocket等。那么我們可以選擇使用python的第三方socket庫進行接口訪問移国,這時只需要把連接的IP吱瘩、端口號和密鑰(如果有)準備好建立好連接,之后進行約定好的請求和接收信息即可迹缀。
Locust所提供的內部類在每次的task請求時進行一次使碾,如果task里面我們進行了一次socket請求,那么計算rps或tps就按正常計算即可祝懂,如果多次票摇,按照理論加倍。當然與Http請求不一樣我們在socket請求之前只需要進行一次建立連接即可砚蓬,這部分最好不要算到請求時間的計算內矢门,否則會影響rps的統(tǒng)計。
# 3. 關于性能上限
windows的壓測機器一個cmd窗戶即一個worker里的用戶數量不能超過1024怜械,這是由于windows的句柄限制颅和,是無解的。如果不夠缕允,可以增加worker數量峡扩,但這顯然會增加系統(tǒng)開銷。worker數量的選擇最好與機器的cpu數量一致障本,因為在locust源碼中教届,worker與worker之間是進程級別,而python會默認把進程盡可能多的分開給cpu驾霜,這也可以盡可能多的利用機器資源案训。
linux就沒有這個問題,在linux系統(tǒng)中可以去設置系統(tǒng)句柄限制粪糙。普遍來說linux作為壓測機比windows性能要好的多强霎。
另一個值得注意的問題則是,在htpp請求中蓉冈,不同的請求內部會消耗掉不同的端口號(發(fā)送端不是接收端城舞,接收端是固定的)轩触。http請求底層是基于tcp的,每次http請求都會經過:建立連接-發(fā)送-接收-釋放連接家夺,而tcp的設置會決定釋放連接的時效問題脱柱。如果釋放不及時,壓測時候同一時間有大量端口占用就可能導致后續(xù)請求沒有端口了拉馋。windows的端口數量最多只有6萬多個(這還得在注冊表去設置)榨为,假設一個連接占用端口時間為3s,那么理論上來講每秒2萬rps就是這臺機器的上限了煌茴。所以我們這塊需要去注冊表設置tcp和端口随闺,可參考http://www.reibang.com/p/00136a97d2d8。