在完成一個接口開發後,在交給測試工程師之前,經常也會想知道,自己寫的這個接口的性能如何呢?吞吐量能達到多少?QPS(query-per-second 每秒處理完的請求數) 能達到多少呢?
常用的性能測試工具,如 Apache ab, Apache JMeter (互聯網公司用的較多),LoadRunner 等
github: https://github.com/wg/wrk
what is wrk?
wrk 是一款針對 Http 協議的基準測試工具,它能夠在單機多核 CPU 的條件下,使用系統自帶的高性能 I/O 機制,如 epoll,kqueue 等,通過多線程和事件模式,對目標機器產生大量的負載。
PS: 其實,wrk 是複用了 redis 的 ae 異步事件驅動框架,準確來說 ae 事件驅動框架並不是 redis 發明的, 它來至於 Tcl 的解釋器 jim, 這個小巧高效的框架, 因爲被 redis 採用而被大家所熟知。
優點:
輕量級性能測試工具;
安裝簡單(相對 Apache ab 來說);
學習曲線基本爲零,幾分鐘就能學會咋用了;
基於系統自帶的高性能 I/O 機制,如 epoll, kqueue, 利用異步的事件驅動框架,通過很少的線程就可以壓出很大的併發量;
缺點:
wrk 目前僅支持單機壓測,後續也不太可能支持多機器對目標機壓測,因爲它本身的定位,並不是用來取代 JMeter, LoadRunner 等專業的測試工具,wrk 提供的功能,對我們後端開發人員來說,應付日常接口性能驗證還是比較友好的
安裝:
CentOS
sudo yum groupinstall 'Development Tools'
sudo yum install -y openssl-devel git
git clone https://github.com/wg/wrk.git wrk
cd wrk
make
# 將可執行文件移動到 /usr/local/bin 位置
sudo cp wrk /usr/local/bin
MacOS
brew install wrk
驗證:
wrk -v
如何使用:
使用方法: wrk <選項> <被測HTTP服務的URL>
Options:
-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)
PS: 關於線程數,並不是設置的越大,壓測效果越好,線程設置過大,反而會導致線程切換過於頻繁,效果降低,一般來說,推薦設置成壓測機器 CPU 核心數的 2 倍到 4 倍就行了。
簡單使用案例:
wrk -t12 -c400 -d30s http://www.baidu.com
這條命令表示,利用 wrk 對 www.baidu.com 發起壓力測試,線程數爲 12,模擬 400 個併發請求,持續 30 秒。
Host:~ liuge36$ wrk -t12 -c400 -d10s http://127.0.0.1:8900/test
Running 10s test @ http://127.0.0.1:8900/test
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 14.88ms 27.77ms 321.47ms 94.47%
Req/Sec 1.69k 1.26k 4.04k 50.04%
200054 requests in 10.10s, 22.93MB read
Socket errors: connect 155, read 196, write 0, timeout 0
Requests/sec: 19813.39 # 平均每秒處理請求數
Transfer/sec: 2.27MB
Host:~ liuge36$
參考:https://www.cnblogs.com/quanxiaoha/p/10661650.html