wrk 壓力測試 http benchmark POST接口


簡單的 http 性能測試工具

wrk.git

一個簡單的 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:

post.lua
-- example HTTP POST script which demonstrates setting the
-- HTTP method, body, and adding a header
wrk.method = "POST"
wrk.body   = "{\"q\":1}"
wrk.headers["Content-Type"] = "application/json"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM