Wrk壓測工具安裝使用
官方源碼:https://github.com/wg/wrk
安裝步驟:

  1. wrk只支持linux環境不支持windows環境,
  2. 安裝git,並配置git環境變量,
  3. 克隆源碼git clone https://github.com/wg/wrk
  4. 進入到源碼的路徑下執行make進行編譯
  5. 然後會在當前路徑下生成一個可執行文件wrk
  6. 如果想全局都可以執行,將wrk文件加入到環境變量

命令介紹: wrk <選項> <被測HTTP服務的URL>
Options:
-c, --connections 跟服務器建立並保持的TCP連接數量 (請求併發數量)
-d, --duration 壓測時間
-t, --threads 使用多少個線程進行壓測 一般設置成cpu的核數的2或者4倍

-s, --script      <S>  指定Lua腳本路徑       
-H, --header      <H>  為每一個HTTP請求添加HTTP頭      
    --latency          在壓測結束後,打印延遲統計信息   
    --timeout     <T>  超時時間     
-v, --version          打印正在使用的wrk的詳細版本信息

代表數字參數,支持國際單位 (1k, 1M, 1G)
代表時間參數,支持時間單位 (2s, 2m, 2h)
例子:
wrk -t8 -c200 -d30s --latency “http://www.bing.com”

輸出:
Running 30s test @ http://www.bing.com
8 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 46.67ms 215.38ms 1.67s 95.59%
Req/Sec 7.91k 1.15k 10.26k 70.77%
Latency Distribution
50% 2.93ms
75% 3.78ms
90% 4.73ms
99% 1.35s
1790465 requests in 30.01s, 684.08MB read
Requests/sec: 59658.29
Transfer/sec: 22.79MB

結果詳解:
Running 30s test @ http://www.bing.com (壓測時間30s)
8 threads and 200 connections (共8個測試線程,200個連接)
Thread Stats Avg Stdev Max +/- Stdev
(平均值) (標準差)(最大值)(正負一個標準差所佔比例,參考正太分佈)
Latency 46.67ms 215.38ms 1.67s 95.59%
(延遲)
Req/Sec 7.91k 1.15k 10.26k 70.77%
(每個線程每秒鐘完成的請求數)
Latency Distribution (延遲分佈)
50% 2.93ms
75% 3.78ms
90% 4.73ms
99% 1.35s (99分位的延遲)
1790465 requests in 30.01s, 684.08MB read (30.01秒內共處理完成了1790465個請求,讀取了684.08MB數據)
Requests/sec: 59658.29 (平均每秒處理完成59658.29個請求)
Transfer/sec: 22.79MB (平均每秒讀取數據22.79MB)

腳本執行:
Wrk支持腳本編程,這讓wrk在眾壓測工具中尤為突出,增加了生成壓測請求的靈活性,腳本是基於Lua腳本語言編寫的,Wrk有一個全局的table和幾個全局的function:
Wrk的table數據結構如下:


1. wrk = {

2. scheme  = “http”,
3. host    = “localhost”,
4. port    = nil,
5. method  = “GET”,
6. path    = “/”,
7. headers = {},
8. body    = nil,
9. thread  = ,
10. }


Wrk的全局變量上面的值默認會應用在所有的請求之上,也就是説我們可以通過修改wrk。Host =”192.168.3.1”,讓所有的後續請求去訪問主機ip是192.168.3.1的服務器,其他參數類似。
全局的函數如下:
function wrk.format(method, path, headers, body)
這個函數的主要作用是通過傳參修改上面的Wrk table中的對應參數,從而生成一個字符串類型Http請求進行返回。
function wrk.lookup(host, service)
這個函數返回一個數據結構是table類型的結果,裏面存儲的是host和service對,類似於POSIX的getaddrinfo()函數。

function wrk.connect(addr)
如果入參的地址可以連接則返回ture 否則返回false 但是這個參數必須是通wrk.lookup()返回。
下面是幾個可選的全局函數,使用者可以自定義實現,一定是函數實現:
setup(thread)-----------當線程創建的時候調用
init(args)--------------當線程初始化的時候調用
delay()----------------返回一個延遲
request()---------------調用返回一個request請求
response()-------------返回響應的時候調用、
done(summary, latency, requests)---------------執行完返回結果統計的時候調用

上面的方法根據運行時間可以分為三個部分:創建時,運行時,結束
創建時的方法:
setup(thread)每個線程在被設置了目標Ip地址之後,但是還沒有實例化之前調用,每個線程都會調用一次。
入參 thread,可以有以下操作:
thread:addr 獲得或者設置線程要訪問的服務器地址
thread:get(name) 從線程上下文中獲取key為name對應的value
thread:set(name,value) 為線程上下文設置對應的key value
thread:stop() 停止線程

運行時的方法:
init(arg),獲取wrk指令中的傳參,例如 wrk –helloworld,arg就是helloworld、
delay(),返回一個毫秒級別的延遲下一個request的請求就會延遲,這個時request級別的方法,每個request都會調用一次,
request() 返回一個request請求字符串,例如http://localhost:8080/,調用這個方法會影響性能,
respone() 返回http response 的時候調用,調用這個方法會影響性能

結束時的方法:
done(summary, latency, requests)當執行完壓測計劃後,返回測試報告的時候調用,參數詳解:
接收包含結果數據的table,以及兩個表示每個請求延遲和每個線程的統計對象,請求率。 持續時間和延遲是微秒值,速率是以每秒請求數衡量

    1. latency.min              – minimum value seen
    2. latency.max              – maximum value seen
    3. latency.mean             – average value seen
    4. latency.stdev            – standard deviation
    5. latency:percentile(99.0) – 99th percentile value
    6. latency(i)               – raw value and count
    7. 
    8. summary = {
    
    9. duration = N,  – run duration in microseconds
    10. requests = N,  – total completed requests
    11. bytes    = N,  – total bytes received
    12. errors   = {
    
    connect = N, -- total socket connection errorsread    = N, -- total socket read errorswrite   = N, -- total socket write errorsstatus  = N, -- total HTTP status codes > 399timeout = N  -- total request timeouts1. }
    2. }