wrktcp - 無lua依賴的tcp協定壓測wrk工具
你可以檢視readme in the file:README_EN.md
[TOC]
本程式主要是基于wrk的基礎上 取消了ssl和lua依賴,使用tcpini配置用來實作tcp協定下的壓力測試。
主要功能
整體架構基于wrk做的擴充,統計、大部分指令、輸出結果沿用的wrk,增加了部分參數。
增加 --html 參數,用于輸出html結果檔案。
增加--test參數,用于驗證ini檔案是否正确。
增加--trace參數,用于在指令行列印時間趨勢資訊。
支援tcp協定的壓力測試,包括各種協定和通訊格式。
支援定義發送封包資訊,應答封包資訊,以及應答的成功響應的結果判斷對比配置。
支援請求封包的參數變量。參數類似loadrunner,有如下四種:
COUNTER, 疊代器,如唯一流水等,可支援定義範圍,定義步長。
DATETIME,時間模式,格式與strtime完全一緻。
CONNECTID,連接配接唯一ID,一般用于做為終端号等使用。
FILE,檔案模式,支援從檔案中順序讀取内容進行内容指派。
支援壓測過程中,動态重新整理TPS和延時。
支援記錄壓測過程資訊,并生成html頁面進行展示。
也支援http,因為http也是tcp協定的一種,隻要http的封包頭明确配置在檔案中即可,具體可以參加sample_http.ini。
與wrk的差別
取消:lua的依賴,自定義的内容和判斷不用學習lua,一個配置檔案即可。
取消:不依賴任何第三方庫,取消ssl和luajit的deps。是以這是一個純淨的(pure)C的工程。
增加:支援tcp協定。使用ini配置檔案來配置tcp封包的格式。連接配接位址、封包約定、請求封包、應答封包資訊都在該檔案中配置。
增加:動态重新整理TPS和延時,在較長時間的壓測過程中也能實時的觀察壓測情況。
增加:直接生成html報表。
增加:執行過程中的實時TPS資訊統計重新整理。
增加:每個連接配接隻連接配接一次的測試參數,用于調試ini檔案。
改進:thread stat的分布統計,把最大支援TPS從1000W縮減到100W,TPS精度從1增加到0.1。
改進:wrk輸出結果,增加了成功和失敗的分類,充分考慮了業務級錯誤。
編譯安裝
macos
cd wrktcp路徑
執行make
linux
cd wrktcp路徑
執行make
windows
需要下載下傳MINGW編譯器,再進行編譯。
快速使用
修改sample_tiny.ini配置
[common]
host = 127.0.0.1
port = 8000
[request]
req_body = this is a test
執行指令
wrktcp -t2 -c20 -d10s --latency sample_tiny.ini
和wrk的用法類似,本指令代表如下意義:
使用2個線程(-t2),并發20個連接配接(-c20),保持運作5秒(-d5s),使用配置sample_tiny.ini來運作.
輸出結果
/Users/suitm/code/c/wrktcp>wrktcp -t2 -c20 -d10s --latency sample_tiny.ini
Running 10s loadtest @ 127.0.0.1:8000 using sample_tiny.ini
2 threads and 20 connections
Time:10s TPS:2347.30/0.00 Latency:5.90ms BPS:48.14KB Error:0
Thread Stats Avg Stdev Max +/- Stdev
Latency 64.19ms 185.36ms 1.11s 91.91%
Req/Sec 1.42k 417.52 1.92k 73.46%
Latency Distribution
50% 6.03ms
75% 8.17ms
90% 168.91ms
99% 983.51ms
23503 requests in 10.09s, 482.00KB read
Requests/sec: 2328.22 (Success:2328.22/Failure:0.00)
Transfer/sec: 47.75KB
指令的詳細說明
指令行參數的詳細說明
-t, --threads: 使用線程總數,一般推薦使用CPU核數的2倍-1
-c, --connections: 連接配接總數,與線程無關。每個線程的連接配接數為connections/threads
-d, --duration: 壓力測試時間, 可以寫 2s, 2m, 2h
--latency: 列印延遲分布情況
--timeout: 指定逾時時間,預設是5000毫秒,越長占用統計記憶體越大。
--trace: 列印出分布圖
--html: 将壓測的結果資料,輸出到html檔案中。
--test: 每個連接配接隻會執行一次,一般用于測試配置是否正确。
-v --version: 列印版本資訊
結果的詳細解釋
Running 10s loadtest @ 127.0.0.1:8000 using sample_tiny.ini
2 threads and 20 connections
代表指令的基本情況以及連接配接的基本情況,程式執行加載完成配置後立刻列印。
Thread Stats Avg Stdev Max +/- Stdev
Latency 64.19ms 185.36ms 1.11s 91.91%
Req/Sec 1.42k 417.52 1.92k 73.46%
Latency代表延時時間,Req/Sec代表每秒的成功應答筆數(TPS),需要注意的是這部分統計是單個線程的統計資料。
說明依次是:線程狀态名(Thread Stats)、平均值(Avg)、标準差(Stdev)、最大值(Max)、正負一個标準差内資料所占比例(+/- Stdev)
如果壓測系統穩定,平均值和最大值是期望相等的, 标準差的期望值是0,+/-标準差的期望值是100%。
Latency Distribution
50% 12.99ms
75% 14.02ms
90% 15.74ms
99% 274.89ms
延遲分布的統計資料,50% - 99%是按相應時間進行排序的。50%代表第50%的資料延時是多少99%代表第99%的資料延時是多少。
23503 requests in 10.09s, 482.00KB read
Requests/sec: 2328.22 (Success:2328.22/Failure:0.00)
Transfer/sec: 47.75KB
第一行代表: 在10.11秒内有6862個請求,一共讀取了140.72KB的資料。
Requests/sec: 678.90 總請求TPS,包含成功和失敗的總數,和wrk相同。
Requests/sec-Success和Requests/sec-Failure : 是區分業務應答是否成功的,可能正常應答了,但是傳回的資訊是錯誤資訊。
Transfer/sec: 每秒的傳輸資料大小。
配置檔案的詳細說明
[common]
host = 127.0.0.1
port = 8000
[request] # 封包長度的長度,預設是8
req_len_len = 8
# 封包長度是全部還是隻計算封包體,預設是body可選配置為total
req_len_type = body
# 封包頭配置,預設隻有長度
req_head = XMLHEAD$(length)20201231
# 必須配置,封包體長度
req_body = \
\
$(DATE)\
$(BRANCH)\
$(TRACENO)\
$(TERMNO)\
313233000017\
張三\
\
HELLO,this is a test\
\
[response]
# 封包頭長度,預設是8
rsp_headlen = 23
# 封包頭中的封包長度位置,預設是1
rsp_len_beg = 8
# 封包頭中的封包長度的長度,預設是8
rsp_len_len = 8
# 封包長度是全部還是隻計算封包體,預設是body可選配置為total
rsp_len_type = body
# 響應碼類型,預設是fixed
rsp_code_type = xml
# 響應碼位置,預設是body
rsp_code_location = body
# 響應碼tag,預設是1 6
rsp_code_location_tag =
# 成功響應碼,預設是000000
rsp_code_success = 000000
[parameters]
TRACENO = COUNTER, 1, 100000, 1, %08ld
BRANCH = FILE, branch.txt
TERMNO = CONNECTID, %08ld
DATE = DATETIME, %H:%M:%S
關于為什麼不使用wrk2
未從wrk2進行擴充的原因,個人觀點是作者從技術說的很對,但是從實際工程角度沒有實際價值。原因有兩點:
第一、一般情況下,壓測都是希望有一個較好的結果。
第二、如果是壓測軟體都會有的統計口徑問題,那麼即使這個統計方式有問題,但是因為是統一的統計口徑和方法,是以也是可信賴的。
是以,相對于每次讨論TPS都需要明确使用何種軟體并且是否排除了協調遺漏,這種複雜的前提造成的溝通困難來說,統一溝通方法就先的更為重要了。
确認須知
wrktcp是基于wrk的擴充開發。當然wrk也是使用了大量的redis、nignx, luajit的源碼,使用和擴充的時候,請注意對應的開源庫的相關協定。
壓測的參數技巧
macos下必須調整的參數:
# 最大連接配接數,mac預設是128,不調整的話連接配接經常失敗
sysctl kern.ipc.somaxconn
sudo sysctl -w kern.ipc.somaxconn=1024
# TIME_WAIT的回收時間,預設是15秒,壓測的時候,需要改成1秒,否則超過17k的随機端口未釋放,mac就會報錯(linux是30k左右)
sysctl net.inet.tcp.msl
sudo sysctl -w net.inet.tcp.msl=1000
linux下的參數調整:
修改/etc/sysctl.conf, 是否可以開啟需要根據實際情況,總結來說,如果有F5或者負載均衡器,則不能開啟tcp_tw_recycle
M.16/root/wrktcp/wrktcp>sysctl -p
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 1