壓測工具 wrk

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"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章