1. 前言 上一篇文章我們瞭解了bombardier,並知道了bombardier.yml與開源項目bombardier的關係,接下來的文章我們瞭解一下wrk、wrk2,並對比一下它們與bombardier的關係 2. 認識wrk wrk是一種現代 HTTP 基準測試工具,能夠在單個多核 CPU 上 ...
1. 前言
上一篇文章我們瞭解了bombardier,並知道了bombardier.yml與開源項目bombardier的關係,接下來的文章我們瞭解一下wrk、wrk2,並對比一下它們與bombardier的關係
2. 認識wrk
wrk是一種現代 HTTP 基準測試工具,能夠在單個多核 CPU 上運行時產生大量負載。它結合了多線程設計和可擴展的事件通知系統,例如 epoll 和 kqueue。
其支持參數:
-c, --connections: total number of HTTP connections to keep open with
each thread handling N = connections/threads
-d, --duration: duration of the test, e.g. 2s, 2m, 2h
-t, --threads: total number of threads to use
-s, --script: LuaJIT script, see SCRIPTING
-H, --header: HTTP header to add to request, e.g. "User-Agent: wrk"
--latency: print detailed latency statistics
--timeout: record a timeout if a response is not received within
this amount of time.
基礎用法:
運行了30秒的基準測試, 使用2個線程、100個http連接:
wrk -t2 -c100 -d30s http://127.0.0.1:8080/index.html
進階用法:
每次發送三個http請求:
wrk -t2 -c100 -d30s --script ./pipeline.lua http://127.0.0.1:8080
新建pipeline.lua
-- example script demonstrating HTTP pipelining
init = function(args)
local r = {}
r[1] = wrk.format(nil, "/?foo")
r[2] = wrk.format(nil, "/?bar")
r[3] = wrk.format(nil, "/?baz")
req = table.concat(r)
end
request = function()
return req
end
3. 認識wrk2
wrk2是一個主要基於 wrk 的 HTTP 基準測試工具。是一個被 wrk 修改以產生恆定的吞吐量負載,並將延遲細節精確到高 9s(即當運行足夠長的時間時可以產生準確的 99.9999%'ile)。除了 wrk 的參數之外,wrk2 通過 --rate 或 -R 參數(預設為 1000)採用吞吐量參數(每秒總請求數)
除支持wrk的參數之外,還支持參數:
-R, --rate: 採用吞吐量參數(每秒總請求數),預設為1000
基礎用法:
運行了30秒的基準測試, 使用2個線程、100個http連接、並保持每秒2000個請求的恆定吞吐量:
wrk -t2 -c100 -d30s -R2000 http://127.0.0.1:8080/index.html
高級用法與wrk一致,此處忽略不寫
我們使用wrk2測試一下百度的壓測情況
安裝:
sudo apt install wget
sudo wget https://aspnetbenchmarks.blob.core.windows.net/tools/wrk2
運行:
./wrk2 -d 3s -c 200 -t 200 -R 10 -L https://www.baidu.com
輸出了本次請求每秒請求次數、吞吐量以及詳細情況:
- Requests/sec: 每秒請求次數
- Transfer/sec: 每秒吞吐量
4. 瞭解Microsoft.Crank.Jobs.Wrk
在Microsoft.Crank.Jobs.Wrk項目中Program.cs
- 檢查平臺是否是64位的Linux系統、並檢查參數是否滿足要求
- 通過HttpClient發送請求,並記錄第一次發送請求所消耗的時間
- 下載wrk,並設置wrk是可執行的
- 通過yml傳遞過來的參數構建完整的wrk命令
- 將輸出的結果使用追加到stringBuilder上,再賦值給output,
- 通過正則匹配結果,最後通過BenchmarksEventSource存儲並輸出到控制台或資料庫、csv、json中
其中:
- connections: 每個線程處理時保持打開的 HTTP 連接總數 N = 連接數/線程數
- serverUri: 自定義url,如果此參數存在,則請求地址為: {serverUri}:{serverPort}{path}
- serverPort: 服務埠
- serverScheme: 服務的Scheme,預設http、支持http、https兩種
- serverAddress: 服務地址、不包含http、例如: www.baidu.com,如果serverUri存在,此配置無效,如果不存在,請求格式為: {serverScheme}