基於TSUNG對MQTT進行壓力測試 基礎概念溫習

2022-04-02 03:22:54 字數 3226 閱讀 8329

[單台broker壓測結果]

請移步另一篇部落格:

ack : tcp協議規定,只有ack=1時有效,也規定連線建立後所有傳送的報文的ack必須為1。

syn(synchronization) : 在連線建立時用來同步序號。當syn=1而ack=0時,表明這是乙個連線請求報文。對方若同意建立連線,則應在響應報文中使syn=1和ack=1. 因此,  syn置1就表示這是乙個連線請求或連線接受報文。 

fin (finis)即完,終結的意思, 用來釋放乙個連線。當 fin = 1 時,表明此報文段的傳送方的資料已經傳送完畢,並要求釋放連線。

syn_recv表示正在等待處理的請求數;established表示正常資料傳輸狀態;time_wait表示處理完畢,等待超時結束的請求數。

狀態:描述

closed:無連線是活動的或正在進行

listen:伺服器在等待進入呼叫

syn_recv:乙個連線請求已經到達,等待確認

syn_sent:應用已經開始,開啟乙個連線

established:正常資料傳輸狀態

fin_wait1:應用說它已經完成

fin_wait2:另一邊已同意釋放

itmed_wait:等待所有分組死掉

closing:兩邊同時嘗試關閉

time_wait:另一邊已初始化乙個釋放

last_ack:等待所有分組死掉

tcp協議是作用是用來進行端對端資料傳送的,那麼就會有傳送端和接收端,上篇部落格講了socket預設是阻塞式的,在作業系統有兩個空間即user space和kernal space。

每個tcp socket連線在核心中都有乙個傳送緩衝區和接收緩衝區,tcp的全雙工的工作模式以及tcp的流量(擁塞)控制便是依賴於這兩個獨立的buffer以及buffer的填充狀態。

單工:只允許甲方向乙方傳送資訊,而乙方不能向甲方傳送 ,如汽車單行道。

半雙工:半雙工就是指乙個時間段內只有乙個動作發生,甲方可以向乙方傳送資料,乙方也可以向甲方傳送資料,但不能同時進行,如一條窄馬路同一時間只能允許乙個車通行。

全雙工:同時允許資料在兩個方向上同時傳輸,它在能力上相當於兩個單工通訊方式的結合。

乙個socket的兩端,都會有send和recv兩個方法,如client傳送資料到server,那麼就是客戶端程序呼叫send傳送資料,而send的作用是將資料拷貝進入socket的核心傳送緩衝區之中,然後send便會在上層返回。

也就是說send()方法返回之時,資料不一定會傳送到對端即伺服器上去(和write寫檔案有點類似),send()僅僅是把應用層buffer的資料拷貝進socket的核心傳送buffer中,傳送是tcp的事情,和send其實沒有太大關係。

接收緩衝區把資料快取入核心,等待recv()讀取,recv()所做的工作,就是把核心緩衝區中的資料拷貝到應用層使用者的buffer裡面,並返回。若應用程序一直沒有呼叫recv()進行讀取的話,此資料會一直快取在相應socket的接收緩衝區內。對於tcp,如果應用程序一直沒有讀取,接收緩衝區滿了之後,發生的動作是:收端通知發端,接收視窗關閉(win=0)。這個便是滑動視窗的實現。保證tcp套介面接收緩衝區不會溢位,從而保證了tcp是可靠傳輸。因為對方不允許發出超過所通告視窗大小的資料。 這就是tcp的流量控制,如果對方無視視窗大小而發出了超過視窗大小的資料,則接收方tcp將丟棄它。

檢視socket傳送緩衝區大小,cat /proc/sys/net/ipv4/tcp_wmem

系統埠限制

linux系統埠為short型別表示,數值上限為65535。假設分配壓測業務可用埠範圍為1024 - 65535,不考慮可能還執行著其它對外連線的服務,真正可用埠也就是64000左右(實際上,一般為了方便計算,一般直接設定為50000)。換言之,即在一台機器上乙個ip,可用同時對外建立64000網路連線。

若是n個可用ip,理論上64000*n,實際上還需要滿足:

tcp接收/傳送緩衝區不要設定太大,tsung預設分配32k(可以修改成16k,一般夠用了)

乙個粗略估算假設乙個使用者占用記憶體50k,1w使用者占用500m記憶體,假設需要100w使用者

100w/6w = 17個ip位址;500m * 100w/1024 = 50g記憶體;伺服器單一ip 承載100萬使用者:1臺主機+17臺從機;若單機64g記憶體+17個ip可用ip位址就一台就能搞定。

linux系統開啟檔案控制代碼限制

系統開啟檔案控制代碼,直接決定了可以同時開啟的網路連線數量,這個需要設定大一些,否則,你可能會在[email protected]

檔案中看到error_connect_emfile類似檔案控制代碼不夠使用的警告,建議此值要大 n * 64000。

修改linux系統引數。vi /etc/security/limits.conf 新增

修改以後儲存,登出當前使用者,重新登入,執行ulimit -a ,ok ,引數生效了:

注:nofile是代表最大檔案開啟數

nproc是作業系統級別對每個使用者建立的程序數的限制

記憶體的影響:

乙個網路socket連線占用不多,但上萬個或數十萬等就不容小覷了,設定不當會導致記憶體直接成為屏障。

tcp接收、傳送快取

tsung預設設定的網路socket傳送接收緩衝區為16kb,一般夠用了。

[root@bogon ~]# cat /proc/sys/net/ipv4/tcp_rmem

此值會覆蓋linux系統設定接收、傳送緩衝大小。

粗略的預設值計算,乙個網路連線傳送緩衝區+ 接收緩衝區,再加上程序處理連線堆疊占用,約40多k記憶體,為即計算方便,設定建立乙個網路連線消費50k記憶體。

先不考慮其它因素,若我們想要從機模擬10w個使用者,那麼當前可用記憶體至少要剩餘:50k * 100000 / 1000k = 5000m = 5g記憶體。針對一般伺服器來講,完全可滿足要求(剩下事情就是要有兩個可用ip了)。

通過上述命令可以統計出tcp連線中處於各個狀態的連線數,在經過ng**之後需要真實的連線數需要除以2,因為client——nginx——mqtt其實算是兩個tcp連線。

單台broker壓測結果見:

使用Mysqlslap對Mysql進行壓力測試

mysql5.1版本之後mysql伺服器自帶的基準測試工具,隨mysql一起安裝,可以模擬伺服器負載,並輸出相關的統計資訊,可以指定或自動生成查詢語句。mysqlslap mysqlslap concurrency 50,300 併發50,300個程序 iterations 3 測試執行次數 num...

如何基於Autowired對建構函式進行注釋

在編寫 的時候,使用 autowired註解是,發現ide報的乙個警告,如下 spring team recommends always use constructor based dependency injection in your beans.always use assertions fo...

對頁面進行壓測 流量複製與回放與壓測平台化

背景 每逢618 11.11大促,都需要提前對系統進行壓力測試,盡早評估系統的各項執行指標,全面做好備戰。如果要準確的模擬使用者的場景進行壓力測試,就需要龐大體量的使用者資料支援,比如要對搜尋的介面進行大規模壓測,就需要大批量的搜尋詞來模擬介面的實際呼叫,而且這些搜尋詞最好是與使用者實際購物過程中所...