1. 程式人生 > 實用技巧 >常用的HTTP服務壓測工具介紹

常用的HTTP服務壓測工具介紹

轉自

HTTP服務壓力測試工具

在專案正式上線之前,我們通常需要通過壓測來評估當前系統能夠支撐的請求量、排查可能存在的隱藏bug,同時瞭解了程式的實際處理能力能夠幫我們更好的匹配專案的實際需求,節約資源成本。

壓測相關術語

  • 響應時間(RT) :指系統對請求作出響應的時間.
  • 吞吐量(Throughput) :指系統在單位時間內處理請求的數量
  • QPS每秒查詢率(Query Per Second) :“每秒查詢率”,是一臺伺服器每秒能夠響應的查詢次數,是對一個特定的查詢伺服器在規定時間內所處理流量多少的衡量標準。
  • TPS(TransactionPerSecond):每秒鐘系統能夠處理的交易或事務的數量
  • 併發連線數:某個時刻伺服器所接受的請求總數

壓力測試工具

ab

ab全稱Apache Bench,是Apache自帶的效能測試工具。使用這個工具,只須指定同時連線數、請求數以及URL,即可測試網站或網站程式的效能。

通過ab傳送請求模擬多個訪問者同時對某一URL地址進行訪問,可以得到每秒傳送位元組數、每秒處理請求數、每請求處理時間等統計資料。

命令格式:

ab [options] [http://]hostname[:port]/path

常用引數如下:

-n requests 總請求數
-c concurrency 一次產生的請求數,可以理解為併發數
-t timelimit 測試所進行的最大秒數, 可以當做請求的超時時間
-p postfile 包含了需要POST的資料的檔案 -T content-type POST資料所使用的Content-type頭資訊

更多引數請檢視官方文件

例如測試某個GET請求介面:

ab -n 10000 -c 100 -t 10 "http://127.0.0.1:8080/api/v1/posts?size=10"

測試POST請求介面:

ab -n 10000 -c 100 -t 10 -p post.json -T "application/json" "http://127.0.0.1:8080/api/v1/post"

wrk

wrk是一款開源的HTTP效能測試工具,它和上面提到的ab同屬於HTTP效能測試工具,它比ab

功能更加強大,可以通過編寫lua指令碼來支援更加複雜的測試場景。

Mac下安裝:

brew install wrk

常用命令引數:

-c --conections:保持的連線數
-d --duration:壓測持續時間(s)
-t --threads:使用的執行緒總數
-s --script:載入lua指令碼
-H --header:在請求頭部新增一些引數
--latency 列印詳細的延遲統計資訊
--timeout 請求的最大超時時間(s)

使用示例:

wrk -t8 -c100 -d30s --latency http://127.0.0.1:8080/api/v1/posts?size=10

輸出結果:

Running 30s test @ http://127.0.0.1:8080/api/v1/posts?size=10
  8 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    14.55ms    2.02ms  31.59ms   76.70%
    Req/Sec   828.16     85.69     0.97k    60.46%
  Latency Distribution
     50%   14.44ms
     75%   15.76ms
     90%   16.63ms
     99%   21.07ms
  198091 requests in 30.05s, 29.66MB read
Requests/sec:   6592.29
Transfer/sec:      0.99MB

go-wrk

go-wrk是Go語言版本的wrk,Windows同學可以使用它來測試,使用如下命令來安裝go-wrk

go get github.com/adeven/go-wrk

使用方法同wrk類似,基本格式如下:

go-wrk [flags] url

常用的引數:

-H="User-Agent: go-wrk 0.1 bechmark\nContent-Type: text/html;": 由'\n'分隔的請求頭
-c=100: 使用的最大連線數
-k=true: 是否禁用keep-alives
-i=false: if TLS security checks are disabled
-m="GET": HTTP請求方法
-n=1000: 請求總數
-t=1: 使用的執行緒數
-b="" HTTP請求體
-s="" 如果指定,它將計算響應中包含搜尋到的字串s的頻率

執行測試:

go-wrk -t=8 -c=100 -n=10000 "http://127.0.0.1:8080/api/v1/posts?size=10"

輸出結果:

==========================BENCHMARK==========================
URL:                            http://127.0.0.1:8080/api/v1/posts?size=10

Used Connections:               100
Used Threads:                   8
Total number of calls:          10000

===========================TIMINGS===========================
Total time passed:              2.74s
Avg time per request:           27.11ms
Requests per second:            3644.53
Median time per request:        26.88ms
99th percentile time:           39.16ms
Slowest time for request:       45.00ms

=============================DATA=============================
Total response body sizes:              340000
Avg response body per request:          34.00 Byte
Transfer rate per second:               123914.11 Byte/s (0.12 MByte/s)
==========================RESPONSES==========================
20X Responses:          10000   (100.00%)
30X Responses:          0       (0.00%)
40X Responses:          0       (0.00%)
50X Responses:          0       (0.00%)
Errors:                 0       (0.00%)