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


[單台Broker壓測結果]請移步另一篇博客:http://www.cnblogs.com/lingyejun/p/7941271.html

一、TCP報頭部中的SYNFINACK

ACK : TCP協議規定,只有ACK=1時有效,也規定連接建立后所有發送的報文的ACK必須為1。

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

FIN (finis)即完,終結的意思, 用來釋放一個連接。當 FIN = 1 時,表明此報文段的發送方的數據已經發送完畢,並要求釋放連接。

二、一個TCP連接從開始到斷開的幾個狀態

 

SYN_RECV表示正在等待處理的請求數;ESTABLISHED表示正常數據傳輸狀態;TIME_WAIT表示處理完畢,等待超時結束的請求數。

狀態:描述

CLOSED:無連接是活動的或正在進行

LISTEN:服務器在等待進入呼叫

SYN_RECV:一個連接請求已經到達,等待確認

SYN_SENT:應用已經開始,打開一個連接

ESTABLISHED:正常數據傳輸狀態

FIN_WAIT1:應用說它已經完成

FIN_WAIT2:另一邊已同意釋放

ITMED_WAIT:等待所有分組死掉

CLOSING:兩邊同時嘗試關閉

TIME_WAIT:另一邊已初始化一個釋放

LAST_ACK:等待所有分組死掉

三、TCP的發送緩沖區和接收緩沖區

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,實際上還需要滿足:

  • 充足內存支持
  1. tcp接收/發送緩沖區不要設置太大,tsung默認分配32K(可以修改成16K,一般夠用了)
  2. 一個粗略估算假設一個用戶占用內存50k1w用戶占用500M內存,假設需要100w用戶

100w/6w = 17IP地址 500m * 100w/1024 = 50G內存 服務器單一IP 承載100萬用戶1台主機+17台從機 若單機64G內存+17IP可用IP地址 就一台就能搞定

  • 為多IP的壓測端分配適合的權重,以便承擔更多的終端連接

Linux系統打開文件句柄限制

系統打開文件句柄,直接決定了可以同時打開的網絡連接數量,這個需要設置大一些,否則,你可能會在tsung_controller@IP.log文件中看到error_connect_emfile類似文件句柄不夠使用的警告,建議此值要大於 > N * 64000

修改linux系統參數。vi /etc/security/limits.conf 添加

*       soft    nofile  655350

*       hard    nofile  655350

*       soft    nproc  655350

*       hard    nproc  655350

修改以后保存,注銷當前用戶,重新登錄,執行ulimit -a ,ok ,參數生效了:

注:nofile是代表最大文件打開數

nproc是操作系統級別對每個用戶創建的進程數的限制

內存的影響:

一個網絡Socket連接占用不多,但上萬個或數十萬等就不容小覷了,設置不當會導致內存直接成為屏障。

TCP接收、發送緩存

Tsung默認設置的網絡Socket發送接收緩沖區為16KB,一般夠用了。

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

4096 87380 4194304

此值會覆蓋Linux系統設置接收、發送緩沖大小。

粗略的默認值計算,一個網絡連接發送緩沖區 + 接收緩沖區,再加上進程處理連接堆棧占用,約40K內存,為即計算方便,設定建立一個網絡連接消費50K內存。

先不考慮其它因素,若我們想要從機模擬10W個用戶,那么當前可用內存至少要剩余:50K * 100000 / 1000K = 5000M = 5G內存。針對一般服務器來講,完全可滿足要求(剩下事情就是要有兩個可用IP了)。

 

五、服務器查看TCP連接數

命令:ss  -tan|awk 'NR>1{++S[$1]}END{for (a in S) print a,S[a]}’

通過上述命令可以統計出TCP連接中處於各個狀態的連接數,在經過Ng代理之后需要真實的連接數需要除以2,因為Client——Nginx——Mqtt其實算是兩個TCP連接。

 

單台Broker壓測結果見:http://www.cnblogs.com/lingyejun/p/7941271.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM