Go 效能壓測工具之wrk介紹與使用

贾维斯Echo發表於2024-04-01

在專案正式上線之前,我們通常需要透過壓測來評估當前系統能夠支撐的請求量、排查可能存在的隱藏bug;壓力測試(壓測)是確保系統在高負載情況下仍能穩定執行的重要步驟。透過模擬高併發場景,可以評估系統的效能瓶頸、可靠性和穩定性,進而最佳化系統架構和資源配置。

目錄
  • 一、壓力測試相關術語
  • 二、安裝wrk
    • 2.1 使用Homebrew 安裝
    • 2.2 編譯安裝
    • 2.3 測試是否安裝成功
  • 三、wrk 命令基本使用
    • 3.1 常用命令引數
    • 3.2 執行測試
    • 3.3 輸出結果

一、壓力測試相關術語

  • 響應時間 (RT):指系統對請求作出響應的時間。

  • 吞吐量 (Throughput):指系統在單位時間內處理請求的數量。

  • QPS(每秒查詢率,Query Per Second):“每秒查詢率”,是一臺伺服器每秒能夠響應的查詢次數,是對一個特定的查詢伺服器在規定時間內所處理流量多少的衡量標準。

  • TPS(Transaction Per Second):每秒鐘系統能夠處理的交易或事務的數量。

  • 併發連線數:某個時刻伺服器所接受的請求總數。

二、安裝wrk

2.1 使用Homebrew 安裝

brew install wrk

2.2 編譯安裝

使用Git 下載原始碼

# 1. 切換到待安裝的目錄
cd /usr/local/src

# 2. 擴音示(-y), 安裝 git
yum install git -y

# 3. 下載 wrk 原始碼
git clone https://github.com/wg/wrk.git

克隆完成後,進入wrk目錄並執行make命令進行編譯。這個命令會編譯wrk並生成可執行檔案:

# 4. 進入安裝資料夾
cd wrk

# 5. 下載 gcc 編譯器, 並編譯
yum -y install gcc
make

編譯成功後,你會得到一個名為wrk的可執行檔案。為了能夠在任何目錄下執行wrk,你可以將其移動到系統的PATH環境變數中的某個目錄,或者直接將wrk的目錄新增到PATH環境變數中。如果你不確定如何操作,可以查閱相關的作業系統文件。

在Linux系統中,你可以使用以下命令將wrk新增到PATH環境變數(假設你的當前使用者是user):

# 6. 建立軟連線, 方便全域性呼叫
ln -s /usr/local/src/wrk/wrk /usr/local/bin

2.3 測試是否安裝成功

在使用 wrk 之前,你可以透過 wrk --help 命令來檢視所有可用的命令列選項。這個命令會輸出 wrk 的使用說明和所有支援的引數。

三、wrk 命令基本使用

3.1 常用命令引數

  • -c, --connections: 每個執行緒建立的連線數(併發數)。預設值為 200。
  • -d, --duration: 測試持續時間,例如 2s2m2h。預設值為 10 秒。
  • -t, --threads: 用於執行測試的執行緒數。預設值為 2。
  • -s, --script: 指定一個 Lua 指令碼來處理自定義請求或響應。
  • -H, --header: 新增 HTTP 請求頭,可以多次使用此引數來新增多個頭部。
  • --latency: 列印詳細的延遲統計資訊。
  • --timeout: 設定請求超時時間,預設為無窮大。
  • --body: 指定請求體,可以是一個檔案路徑或直接的資料。
  • --rate: 限制請求速率(每秒請求數),預設不限速。

3.2 執行測試

執行如下命令:

wrk -t1 -d1s -c2 -s ./scripts/wrk/signup.lua http://localhost:8080/users/signup

這個命令是使用 wrk 這個 HTTP 壓力測試工具來對本地主機上的一個使用者註冊介面進行測試。下面是命令中每個部分的解釋:

  • wrk: 命令的名稱,表示執行 wrk 工具。
  • -t1: -t 選項後面跟著的 1 表示使用 1 個執行緒來進行測試。
  • -d1s: -d 選項後面跟著的 1s 表示測試的持續時間是 1 秒。
  • -c2: -c 選項後面跟著的 2 表示每個執行緒保持 2 個連線開啟。
  • -s ./scripts/wrk/signup.lua: -s 選項後面跟著的路徑 ./scripts/wrk/signup.lua 表示載入一個 Lua 指令碼,這個指令碼用於自定義請求或處理響應。在這個例子中,指令碼可能是用來模擬使用者註冊的請求。
  • http://localhost:8080/users/signup: 這是測試的目標 URL,即本地主機上的使用者註冊介面,監聽在 8080 埠。
    綜合來看,這個命令會使用 1 個執行緒在 1 秒內對 http://localhost:8080/users/signup 介面發起壓力測試,每個執行緒保持 2 個連線,並且使用 ./scripts/wrk/signup.lua 指令碼來自定義請求的內容,可能是模擬使用者註冊的行為。

3.3 輸出結果

輸出結果如下:

Running 1s test @ http://localhost:8080/users/signup
  1 threads and 2 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    64.63ms  711.72us  67.28ms   90.00%
    Req/Sec    29.80     10.76    40.00     80.00%
  30 requests in 1.01s, 3.78KB read
Requests/sec:     29.81
Transfer/sec:      3.76KB

這個輸出是 wrk 執行完壓力測試後的統計結果。下面是對每個部分的解釋:

  • Running 1s test @ http://localhost:8080/users/signup: 這行顯示的是測試的配置,包括測試持續時間(1秒)和測試的目標 URL(本地主機的使用者註冊介面)。
  • 1 threads and 2 connections: 這行顯示的是測試使用的執行緒數(1個執行緒)和每個執行緒建立的連線數(2個連線)。
  • Thread Stats: 這部分顯示的是執行緒級別的統計資訊,包括平均延遲、延遲的標準差、最大延遲以及延遲分佈在平均值正負一個標準差內的百分比。
    • Avg: 平均延遲,這裡是 64.63 毫秒。
    • Stdev: 延遲的標準差,這裡是 711.72 微秒。
    • Max: 最大延遲,這裡是 67.28 毫秒。
    • +/- Stdev: 延遲分佈在平均值正負一個標準差內的百分比,這裡是 90.00%。
  • Req/Sec: 這部分顯示的是每秒請求數的統計資訊,包括平均請求數、請求數的標準差、最大請求數以及請求數分佈在平均值正負一個標準差內的百分比。
    • Avg: 平均每秒請求數,這裡是 29.80。
    • Stdev: 每秒請求數的標準差,這裡是 10.76。
    • Max: 最大每秒請求數,這裡是 40.00。
    • +/- Stdev: 每秒請求數分佈在平均值正負一個標準差內的百分比,這裡是 80.00%。
  • 30 requests in 1.01s, 3.78KB read: 這行顯示的是在測試期間總共完成了 30 個請求,耗時 1.01 秒,讀取了 3.78KB 的資料。
  • Requests/sec: 這顯示的是平均每秒完成的請求數,這裡是 29.81。
  • Transfer/sec: 這顯示的是平均每秒讀取的資料量,這裡是 3.76KB。
    總結來說,這個測試在 1 秒內使用 1 個執行緒和 2 個連線對本地主機的使用者註冊介面進行了壓力測試,平均每秒可以完成大約 29.81 個請求,平均延遲大約為 64.63 毫秒。

相關文章