4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2
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 witheach 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 withinthis 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 pipelininginit = 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) endrequest = function()return req end3. 認識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}://{serverAddress}:{serverPort}{path}
path: 服務接口地址,不包含域,例如: /api/check/healthy
warmup: 預熱時間,默認15s,與執行duration類似,而并非壓測次數
當warmup > 0時,會先預熱warmup秒后再執行一次壓測,第二次的壓測才是最后返回的結果
當warmup = 0時,不進行預熱,直接開始壓測
duration: 測試時長,默認15s
threads: 線程數、默認:32
customHeaders: 自定義headers,如果預設headers中沒有需要的header,則通過重寫customHeaders,以完成自定義header的目的
pipeline: 管道數量,默認為1,當大于1時,支持同時發送多個請求
script: 如果pipeline不大于1時,支持自定義lua腳本以及lua參數{scriptArguments}
5. 總結
優勢:
支持lua腳本,支持動態參數或者更改請求等復雜操作
使用C語言開發、性能高
劣勢:
lua腳本存在學習成本
wrk.yml的存在是為Microsoft.Crank.Jobs.Wrk提供配置參數,Microsoft.Crank.Jobs.Wrk通過調用開源項目wrk實現壓測,并將壓測結果通過BenchmarksEventSource存儲并輸出到控制臺或數據庫、csv、json中
wrk2是基于wrk二次開發,擁有所有wrk的配置,并且支持吞吐量限制,bombardier、wrk、wrk2都是http基準測試工具,豐富了crank對于Http的基準測試能力,三者之間并無優劣之分,根據三者之間的優劣勢自行選擇適合自己的即可
源碼地址:https://github.com/doddgu/crank/tree/sample
開源地址
MASA.BuildingBlocks:https://github.com/masastack/MASA.BuildingBlocks
MASA.Contrib:https://github.com/masastack/MASA.Contrib
MASA.Utils:https://github.com/masastack/MASA.Utils
MASA.EShop:https://github.com/masalabs/MASA.EShop
MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor
如果你對我們的 MASA Framework 感興趣,無論是代碼貢獻、使用、提 Issue,歡迎聯系我們
總結
以上是生活随笔為你收集整理的4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF 实现验证码控件
- 下一篇: Avalonia跨平台入门第二十篇之语音