4. 堪比JMeter的.Net壓測工具 - Crank 進階篇 - 認識wrk、wrk2

MASA技術團隊發表於2022-04-13

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

asciicast

輸出了本次請求每秒請求次數、吞吐量以及詳細情況:

  • Requests/sec: 每秒請求次數
  • Transfer/sec: 每秒吞吐量

4. 瞭解Microsoft.Crank.Jobs.Wrk

在Microsoft.Crank.Jobs.Wrk專案中Program.cs

  1. 檢查平臺是否是64位的Linux系統、並檢查引數是否滿足要求
  2. 通過HttpClient傳送請求,並記錄第一次傳送請求所消耗的時間
  3. 下載wrk,並設定wrk是可執行的
  4. 通過yml傳遞過來的引數構建完整的wrk命令
  5. 將輸出的結果使用追加到stringBuilder上,再賦值給output,
  6. 通過正則匹配結果,最後通過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/cra...

開源地址

MASA.BuildingBlocks:https://github.com/masastack/...

MASA.Contrib:https://github.com/masastack/...

MASA.Utils:https://github.com/masastack/...

MASA.EShop:https://github.com/masalabs/M...

MASA.Blazor:https://github.com/BlazorComp...

如果你對我們的 MASA Framework 感興趣,無論是程式碼貢獻、使用、提 Issue,歡迎聯絡我們

16373211753064.png

相關文章