公司對 http 接口都是直接用 wrk 進行壓測,簡單快捷
剛好有個壓測任務分到我
而且中台跟 Lua 也有關系,剛好 wrk 也支援 Lua 腳本,是以學起來,再用起來
wrk 是一個類似 ab(apache bench)、jmeter 的壓力測試工具,官方稱它為:現代的 HTTP 基準測試工具
用 C 編寫的 HTTP 協定壓測工具
底層基于 epoll 和 kqueue 實作,使用了多線程和多路複用 IO(非阻塞 IO),利用異步的事件驅動架構,通過很少的線程就可以壓出很大的并發量
降低測試工具本身性能開銷對測試結果準确性的影響
支援使用 LuaJIT 腳本,可以執行 HTTP 請求生成、響應處理和自定義報告
輕量級性能測試工具
僅支援 HTTP 協定
僅支援單機壓測,多機器壓測需要每個機器都手動執行一次 wrk 指令
不可取代 Jmeter、LR 等專業性能工具
在 wrk 裡面,每個線程都有自己獨立的 Lua 虛拟機和 Event Loop
通過指令行參數 -c 指定的連接配接數,會平均分給所有線程,每個建立的 socket,都會調用 fcntl 将其設定為 NONBLOCK,即非阻塞,然後托管給 Event Loop
直接使用 redis 的 Event Loop 實作,适配了不同作業系統的實作
啟動的時候,每個線程都會建立一個 Lua State,并調用 luaL_dofile 加載指令行參數 -s 指定的 lua 腳本檔案
如果沒有自定義的 lua 腳本,wrk 預設發送的是 HTTP 1.1 GET 請求,用長連接配接
-c:與伺服器保持的 http 連接配接數
-d:壓測持續運作時間,可以是 2s、2m、2h
-t:啟動的線程數
-s:指定 lua 腳本
-H:自定義 http header 請求頭,例如:"User-Agent: benchmark-wrk"
--latency:列印延遲統計資料
--time:http 逾時時間,如果在此時間内未收到響應,則當做逾時
數字參數:可以使用 1k、1M、1G 機關
一般是 CPU 核數,最大不要超過 CPUx2 核數,否則會帶來額外的上下文切換,将線程數設定為 CPU 核數主要是為了 WRK 能最大化利用 CPU,使結果更準确(截取網上,暫時沒看到官方推薦)
和并發數沒有直接關系
檢視 Linux CPU 總核數:
連接配接數(connection)可以了解為并發數
一般在測試過程中,這個值需要使用者不斷向上調試,直至 QPS 達到一個臨界點,便可認為此時的并發數為系統所能承受的最大并發量
實際上,wrk 會為每個線程配置設定(c/t)個 socket 連接配接
每個連接配接會先執行請求動作,然後等待直到收到響應後才會再發送請求,是以每個時間點的并發數大緻等于連接配接數(connection)
運作 wrk 的機器必須有足夠數量的臨時端口可用,關閉的 socket 必須快速回收
僅更改 HTTP 方法、路徑、添加請求頭或正文的使用者腳本不會對性能産生影響
每個請求的操作,特别是建構新的 HTTP 請求,以及 response() 的使用将必然減少可以生成的負載量
啟動 2 個線程,保持 5 個 http 連接配接打開的狀态下,持續壓測 10s 的基準測試
qps 是 14.85
啟動 16 個線程,保持 400 個 http 連接配接打開的狀态下,持續壓測 5s 的基準測試,并列印延遲統計資料
qps 是 578.7
施壓機:16c32g
受壓機:8c16g
接下來對某個接口進行基準測試
qps:20504.3
qps:19948.69
qps:18811.35
線程數增加,qps 反而下降
初步可以認為,-t 線程數取系統 CPU 核數是一個比較靠譜的建議