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

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

1、TCP報頭部中的SYNFINACK

ACK : TCP協議規定,只有ACK=1時有效,也規定鏈接創建後全部發送的報文的ACK必須爲1。linux

SYN(SYNchronization) : 在鏈接創建時用來同步序號。當SYN=1而ACK=0時,代表這是一個鏈接請求報文。對方若贊成創建鏈接,則應在響應報文中使SYN=1和ACK=1. 所以,  SYN置1就表示這是一個鏈接請求或鏈接接受報文。 web

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

2、一個TCP鏈接從開始到斷開的幾個狀態

 

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

狀態:描述網絡

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

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

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

SYN_SENT:應用已經開始,打開一個鏈接操作系統

ESTABLISHED:正常數據傳輸狀態

FIN_WAIT1:應用說它已經完成

FIN_WAIT2:另外一邊已贊成釋放

ITMED_WAIT:等待全部分組死掉

CLOSING:兩邊同時嘗試關閉

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

LAST_ACK:等待全部分組死掉

3、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

 

4、限制鏈接數上漲的幾個關鍵因素:

系統端口限制

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了)。

 

5、服務器查看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

相關文章
相關標籤/搜索