使用Locust框架進行壓力測試

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是前面設定的保持一致,端口號則在源碼中蓖扑,如有沖突可以根據需求去源碼中修改唉铜。打開之后:


locust.png

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末景馁,一起剝皮案震驚了整個濱河市板壮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌合住,老刑警劉巖绰精,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異透葛,居然都是意外死亡笨使,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門僚害,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硫椰,“玉大人,你說我怎么就攤上這事萨蚕“胁荩” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵岳遥,是天一觀的道長奕翔。 經常有香客問我,道長浩蓉,這世上最難降的妖魔是什么派继? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮捻艳,結果婚禮上驾窟,老公的妹妹穿的比我還像新娘。我一直安慰自己认轨,他們只是感情好绅络,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般恩急。 火紅的嫁衣襯著肌膚如雪节视。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天假栓,我揣著相機與錄音,去河邊找鬼霍掺。 笑死匾荆,一個胖子當著我的面吹牛,可吹牛的內容都是我干的杆烁。 我是一名探鬼主播牙丽,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兔魂!你這毒婦竟也來了烤芦?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤田绑,失蹤者是張志新(化名)和其女友劉穎饰躲,沒想到半個月后机隙,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡遂唧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吊奢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盖彭。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖页滚,靈堂內的尸體忽然破棺而出召边,到底是詐尸還是另有隱情,我是刑警寧澤裹驰,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布隧熙,位于F島的核電站,受9級特大地震影響邦马,放射性物質發(fā)生泄漏贱鼻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一滋将、第九天 我趴在偏房一處隱蔽的房頂上張望邻悬。 院中可真熱鬧,春花似錦随闽、人聲如沸父丰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛾扇。三九已至攘烛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镀首,已是汗流浹背坟漱。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留更哄,地道東北人芋齿。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像成翩,于是被迫代替她去往敵國和親觅捆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355