簡單的 http 性能測試工具
一個簡單的 http benchmark 工具, 能做很多基本的 http 性能測試.
wrk 的一個很好的特性就是能用很少的線程壓出很大的並發量.
原因是它使用了一些操作系統特定的高性能 io 機制, 比如 select, epoll, kqueue 等.
其實它是復用了 redis 的 ae 異步事件驅動框架. 確切的說 ae 事件驅動框架並不是 redis 發明的, 它來至於 Tcl的解釋器 jim, 這個小巧高效的框架, 因為被 redis 采用而更多的被大家所熟知。
要用 wrk, 首先要編譯 wrk
你的機器上需要已經安裝了 git 和基本的c編譯環境。wrk 本身是用 c 寫的並且沒有使用很多第三方庫. 所以編譯基本不會遇到什么問題(運行不會存在太大難度)。
安裝
Mac 安裝
brew install wrk
注意: mac 本身連接數有限制,不要做太大的測試
Linux 安裝
git clone https://github.com/wg/wrk.git cd wrk make
成功以后在目錄下有一個 wrk
文件,將這個文件復制到你的軟件目錄,配置好環境變量即可,這里就不細說了
編譯錯誤
fatalerror: openssl/ssl.h: Nosuchfileor directory
是因為系統中沒有安裝openssl的庫
sudo apt-get install libssl-dev
# or run sudo yum install openssl-devel
使用
簡單的性能測試
wrk -t12 -c100 -d30s http://192.168.31.107
# 輸出為 12 threadsand 100 connections ThreadStats Avg Stdev Max +/- Stde Latency 538.64ms 368.66ms 1.99s 77.33 Req/Sec 15.62 10.28 80.00 75.35 5073 requestsin 30.09s, 75.28MB rea Socketerrors: connect 0, read 5, write 0, timeout 6 Requests/sec: 168.5 Transfer/sec: 2.50M
- -t12 為模擬12個用戶線程 -c100模擬100個連接
一般線程數不宜過多. 核數的2到4倍足夠,wrk 不是使用每個連接一個線程的模型, 而是通過異步網絡 io 提升並發量. 所以網絡通信不會阻塞線程執行
結果統計分析
線程統計分析
項目 | 名稱 | 說明 |
---|---|---|
Avg | 平均值 | 每次測試的平均值 |
Stdev | 標准偏差 | 結果的離散程度,越高說明越不穩定 |
Max | 最大值 | 最大的一次結果 |
+/- Stdev | 正負一個標准差占比 | 結果的離散程度,越大越不穩定 |
Latency: 可以理解為響應時間
Req/Sec: 每個線程每秒鍾的完成的請求數
一般我們來說我們主要關注平均值和最大值.
標准差如果太大說明樣本本身離散程度比較高. 有可能系統性能波動很大
讀寫分析
- 總共完成請求數
- 讀取數據量
- 錯誤統計
5073 requestsin 30.09s, 75.28MB rea
Socketerrors: connect 0, read 5, write 0, timeout 6 Requests/sec: 168.5 Transfer/sec: 2.50M
wrk Post 接口測試
首先需要准備一個lua文件
wrk.method = "POST" wrk.headers["Content-Type"] = "application/x-www-form-urlencoded" wrk.body = "youbody&youset"
這個文件內容建議自己填寫,保存為 post.lua
文件
當然這個腳本內容可以再次定義,具體查看wrk的git文檔
執行腳本
wrk -t4 -c2000 -d60s -T5s --script=post.lua --latency http://192.168.31.107/user/login
這樣就是模擬4個線程,2000個連接,在60s內,間隔5s 執行 post.lua 的請求
- 你可以擴展一下,制作 shell 腳本來批量測試各種接口
如測試post json: