一般我們壓測的時候,需要了解衡量系統效能的一些引數指標,比如。
1、效能指標簡介
1.1 延遲
簡單易懂。green:一般指響應時間
95線:P95。平均100%的請求中95%已經響應的時間
99線:P99。平均100%的請求中99%已經響應的時間
平均響應時間:所有請求的平均響應時間
最大響應時間:所有請求中最大的響應時間
1.2 吞吐量
簡單易懂。green:即每秒處理的請求數量
對於查詢搜尋類的系統使用每秒處理的請求數(QPS)來衡量吞吐能力。
一般對於交易類的系統使用每秒處理的事務數(TPS)來衡量吞吐能力。
TPS:每秒處理的事務數(比如每秒處理的訂單數)
QPS:每秒處理的請求數
1.3 系統容量
也叫做設計容量,可以理解為硬體配置(記憶體,cpu什麼的),成本約束
2、壓測工具 wrk
wrk 是一款針對 Http 協議的基準測試開源工具,它能夠在單機多核 CPU 的條件下,使用red:系統自帶的高效能 I/O 機制,如 epoll,kqueue 等,透過多執行緒和事件模式,對目標機器產生大量的負載。
wrk 目前僅支援單機壓測,後續也不太可能支援多機器對目標機壓測。
因為它本身的定位,並不是用來取代 JMeter, LoadRunner 等專業的測試工具,wrk 提供的功能,對後端開發人員來說,應付日常介面效能驗證還是比較友好的。
wrk 只能被安裝在類 Unix 系統上,所以我們需要一個 Linux 或者 MacOS 環境。Windows 10 安裝需要開啟自帶的 Ubuntu 子系統。
3、使用 wrk
使用方法: 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)
3.1 命令簡單的壓測
簡單進行一次壓測,用10個執行緒,200個連線,對百度進行30s的壓測。
以下是對壓測結果
wrk -t 10 -c 200 -d 30s --latency http://www.baidu.com
# 30s內測試百度的結果如下:
Running 30s test @ http://www.baidu.comm/
# 用12個執行緒 400個連線測試
12 threads and 400 connections
Latency Distribution
# 響應時間-延遲分佈明細
# 有50%的請求執行時間是在64.42ms內完成
50% 64.42ms
# 30秒內功處理了 149798 個請求,
讀取了 241.85MB 的資料
149798 requests in 30.09s, 241.85MB read
# QPS 4977.65, 即平均每秒處理請求數為4977.65
可以參考吞吐量。
Requests/sec: 4977.65
# 平均每秒讀取 8.04M 的資料
Transfer/sec: 8.04MB
3.2 編寫壓測指令碼
首先需要準備一個 lua 檔案,比如名為 test-postapi.lua ,寫入如下內容。
### 請求方式
wrk.method = "POST"
### 設定 請求型別
wrk.headers["Content-Type"] = "application/json"
### POST 請求引數
wrk.body = '{"username": "13999999999","username": "13999999999"}'
這個檔案內容自己寫,寫好介面內容後儲存。
3.3 執行指令碼
以下是模擬6個執行緒,600個連線,在60s內,間隔6s 執行 test-postapi.lua 指令碼的請求。
# 進入wrk執行檔案目錄
# --script 引數的值為指令碼名
# --latency 引數的值為介面地址
./wrk -t6 -c600 -d60s --script=test-postapi.lua --latency http://api.xxxdev.com/enterprise/user/login
最後感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,這些資料,對於【軟體測試】的朋友來說應該是最全面最完整的備戰倉庫,雖然不是什麼很值錢的東西,如果你用得到的話可以直接拿走: