天天看點

linux tcp壓測工具,wrktcp: 支援tcp協定壓測的wrk工具,全配置不依賴lua

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