前言
wrk是一個用c語言寫的壓力測試工具,非常有用,但是ubuntu的軟件倉庫沒有收錄wrk,需要我們自己進行編譯和安裝,最近在學習一些性能測試、性能優化方面的知識,需要使用到這個強有力的工具,故此記錄安裝和使用的過程。
安裝
首先若是沒有安裝編譯工具那么就得先安裝一下:
# 安裝 make 工具
sudo apt-get install make
# 安裝 gcc編譯環境
sudo apt-get install build-essential
之后安裝git
sudo apt-get install git
從git上拉源碼
git clone git@github.com:wg/wrk.git
要是沒有梯子等加速工具可以使用gitee
git clone git@gitee.com:ponponon/wrk.git
安裝openssl庫
sudo apt-get install libssl-dev
使用make編譯源碼
cd wrk
make
make之后在wrk目錄下就可以使用./wrk指令了,不過為了全局能使用,可以將其添加到path
# 把生成的wrk移到一個PATH目錄下面, 比如
sudo cp wrk /usr/local/bin
wrk一個特性就是用很少的線程可以壓出很大的并發量,原因是啥它使用了一些操作系統特定的高性能io機制,例如select,epoll等。
使用一個簡單的性能測試:
wrk -t12 -c100 -d30s http://www.baidu.com ?
可以看到如下輸出:
Running 30s test @ http://www.baidu.com12 threads and 100 connectionsThread Stats ? Avg ? ? Stdev ? ? Max ? +/- StdevLatency ? 41.00ms ? 12.53ms 421.23ms ? 92.02%Req/Sec ? 173.37 ? ? 51.53 ? 260.00 ? ? 75.17%23100 requests in 30.10s, 231.29MB readSocket errors: connect 0, read 1888, write 0, timeout 0
Requests/sec: ? 767.48
Transfer/sec: ? ? 7.68MB
12 threads and 100 connections
用12個線程模擬100個連接.
對應的參數 -t 和 -c 可以控制這兩個參數.
wrk中各個參數:
-
-t 需要模擬的線程數
-
-c 需要模擬的連接數
-
--timeout 超時的時間
-
-d 測試的持續時間
結果中:
-
Latency:響應時間
-
Req/Sec:每個線程每秒鐘的完成的請求數
-
Avg:平均
-
Stdev:標準差
-
Max:最大
-
+/- Stdev: 正負一個標準差占比
-
Requests/sec:QPS(每秒請求數),這是一項壓力測試的性能指標,通過這個參數我們可以看出應用程序的吞吐量。
-
Transfer/sec:每秒傳輸的數據量
如果想看響應時間的分布情況可以加上--latency參數
wrk -t12 -c100 -d30s -T30s --latency http://www.baidu.com ?
Running 30s test @ http://www.baidu.com12 threads and 100 connectionsThread Stats ? Avg ? ? Stdev ? ? Max ? +/- StdevLatency ? 41.46ms ? 20.81ms 453.31ms ? 97.90%Req/Sec ? 169.27 ? ? 57.92 ? 250.00 ? ? 75.02%Latency Distribution50% ? 38.59ms75% ? 42.03ms90% ? 46.62ms99% ? 96.43ms23100 requests in 30.03s, 231.29MB readSocket errors: connect 0, read 1277, write 0, timeout 0
Requests/sec: ? 769.24
Transfer/sec: ? ? 7.70MB
可以看到50%在38ms的量級,很可以
使用 wrk
測試 nginx
wrk http://192.168.31.203 ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Running 10s test @ http://192.168.31.2032 threads and 10 connections
?Thread Stats ? Avg ? ? Stdev ? ? Max ? +/- StdevLatency ? 657.87us ?761.70us ?19.66ms ? 97.90%Req/Sec ? ? 8.48k ? 743.41 ? ? 9.74k ? ?83.00%168665 requests in 10.00s, 138.16MB read
Requests/sec: ?16865.61
Transfer/sec: ? ? 13.82MB
使用 wrk
測試 gunicorn
wrk http://192.168.31.203:63000/upload/
Running 10s test @ http://192.168.31.203:63000/upload/2 threads and 10 connectionsThread Stats Avg Stdev Max +/- StdevLatency 10.91ms 7.41ms 93.90ms 79.23%Req/Sec 486.49 92.10 797.00 64.50%9692 requests in 10.01s, 3.47MB readNon-2xx or 3xx responses: 9692
Requests/sec: 968.38
Transfer/sec: 354.63KB