wrk 是一款針對 Http 協議的基準測試工具,它能夠在單機多核 CPU 的條件下,使用系統自帶的高性能 I/O 機制,如 epoll,kqueue 等,通過多線程和事件模式,對目標機器產生大量的負載。
wrk優缺點
優點:
● 輕量級性能測試工具;
● 安裝簡單(相對 Apache ab 來說);
● 學習曲線基本爲零,幾分鐘就能學會咋用了;
● 基於系統自帶的高性能 I/O 機制,如 epoll, kqueue, 利用異步的事件驅動框架,通過很少的線程就可以壓出很大的併發量;
缺點:
● wrk 目前僅支持單機壓測,後續也不太可能支持多機器對目標機壓測,因爲它本身的定位,並不是用來取代 JMeter, LoadRunner 等專業的測試工具。
安裝方式
Ubuntu/Debian
sudo apt install build-essential libssl-dev git -y
git clone https://github.com/wg/wrk.git wrk & cd wrk & make
# 將可執行文件移動到 /usr/local/bin 位置
sudo cp wrk /usr/local/bin
Mac OS
Mac 系統也可以通過先編譯的方式來安裝,但是更推薦使用 brew 的方式來安裝
brew install rk
檢驗是否安裝成功
wrk -v
輸出如下:
root@ubuntu1804:~# wrk -v
wrk 4.1.0-8-ga211dd5 [epoll] Copyright (C) 2012 Will Glozer
Usage: wrk <options> <url>
Options:
-c, --connections <N> Connections to keep open
-d, --duration <T> Duration of test
-t, --threads <N> Number of threads to use
-s, --script <S> Load Lua script file
-H, --header <H> Add header to request
--latency Print latency statistics
--timeout <T> Socket/request timeout
-v, --version Print version details
Numeric arguments may include a SI unit (1k, 1M, 1G)
Time arguments may include a time unit (2s, 2m, 2h)
使用
簡單使用
wrk -t12 -c400 -d30s http://www.baidu.com
命令的意思:向 url www.baidu.com 發起壓力測試,線程數爲 12,總共發送400 個併發請求,持續 30 秒
參數解釋
參數簡寫 單位 功能
-c, --connections <N> 跟服務器建立並保持的TCP連接數量
-d, --duration <T> 壓測時間
-t, --threads <N> 使用多少個線程進行壓測
-s, --script <S> 指定Lua腳本路徑
-H, --header <H> 爲每一個HTTP請求添加HTTP頭
--latency 在壓測結束後,打印延遲統計信息
--timeout <T> 超時時間
-v, --version 打印正在使用的wrk的詳細版本信息
<N>代表數字參數,支持國際單位 (1k, 1M, 1G)
<T>代表時間參數,支持時間單位 (2s, 2m, 2h)
測試結果
wrk -t12 -c400 -d30s --latency http://www.baidu.com
執行上面的壓測命令,30 秒壓測過後,生成如下壓測報告:
Running 30s test @ http://www.baidu.com (壓測時間30s)
12 threads and 400 connections (共12個測試線程,400個連接)
Thread Stats Avg(平均值) Stdev(標準差) Max(最大值) +/- Stdev(正負標準差所佔比例)
Latency(延遲) 386.32ms 380.75ms 2.00s 86.66%
Req/Sec(每秒請求數) 17.06 13.91 252.00 87.89%
Latency Distribution (延遲分佈)
50% 218.31ms
75% 520.60ms
90% 955.08ms
99% 1.93s
4922 requests in 30.06s, 73.86MB read (30.06s內處理了4922個請求,耗費流量73.86MB)
Socket errors: connect 0, read 0, write 0, timeout 311 (發生錯誤數)
Requests/sec: 163.76 (QPS 163.76,即平均每秒處理請求數爲163.76)
Transfer/sec: 2.46MB (平均每秒流量2.46MB)
標準差解釋:標準差如果太大說明樣本本身離散程度比較高,有可能系統性能波動較大,請求延時分佈不均勻,有可能是服務器不穩定。
實際場景使用
wrk的複雜測試場景需要編寫lua腳本。如POST請求,設置請求頭部信息等。
設置cookie
編寫 demo.lua 腳本
請求方式:GET
請求頭部信息:Content-Type 和 cookie。將用戶的認證信息auth_token放在cookie中。
wrk.method = "GET"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
wrk.headers["cookie"] = "auth_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NDY5MjA2MzQsImV4cCI6MTYzODc3MzQ3OSwiZXhwX3YyIjoxNjM4NzczNDc5LCJkZXZpY2UiOiIiLCJ1c2VybmFtZSI6IndlY2hhdF8zM2g0b3ZuNCIsImlzX3N0YWZmIjoxLCJzZXNzaW9uX2lkIjoiOGY4ZjJiNGE0ZTg0MTFlYzlhZWIxYTYxOGMyYjRlY2EifQ.CrcSmVmJd6TDypsuA43RUxzURaaNgzZKA5pF0K-FMH4"
執行wrk壓測命令
wrk -t2 -c10 -d5 --script=demo.lua --latency https://apiv3.shanbay.com/teacher/trial_plan/user_plan/activate
返回結果
Running 5s test @ https://apiv3.shanbay.com/teacher/trial_plan/user_plan/activate
2 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 247.31ms 88.99ms 519.78ms 72.53%
Req/Sec 20.82 10.50 50.00 58.90%
Latency Distribution
50% 229.55ms
75% 301.28ms
90% 359.52ms
99% 515.54ms
182 requests in 5.07s, 37.12KB read
Requests/sec: 35.88
Transfer/sec: 7.32KB
post請求
wrk.method = "GET"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
wrk.headers["cookie"] = "xxxxx"
wrk.body = "youbody&youset"