天天看點

wrk(1)- 詳細使用

公司對 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 核數是一個比較靠譜的建議

wrk