[單臺Broker壓測結果]請移步另外一篇博客:http://www.cnblogs.com/lingyejun/p/7941271.htmlhtml
ACK : TCP協議規定,只有ACK=1時有效,也規定鏈接創建後全部發送的報文的ACK必須爲1。linux
SYN(SYNchronization) : 在鏈接創建時用來同步序號。當SYN=1而ACK=0時,代表這是一個鏈接請求報文。對方若贊成創建鏈接,則應在響應報文中使SYN=1和ACK=1. 所以, SYN置1就表示這是一個鏈接請求或鏈接接受報文。 web
FIN (finis)即完,終結的意思, 用來釋放一個鏈接。當 FIN = 1 時,代表此報文段的發送方的數據已經發送完畢,並要求釋放鏈接。緩存
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:等待全部分組死掉
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,實際上還須要知足:
100w/6w = 17個IP地址 ;500m * 100w/1024 = 50G內存 ;服務器單一IP 承載100萬用戶:1臺主機+17臺從機 ;若單機64G內存+17個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系統設置接收、發送緩衝大小。
粗略的默認值計算,一個網絡鏈接發送緩衝區 + 接收緩衝區,再加上進程處理鏈接堆棧佔用,約40多K內存,爲即計算方便,設定創建一個網絡鏈接消費50K內存。
先不考慮其它因素,若咱們想要從機模擬10W個用戶,那麼當前可用內存至少要剩餘:50K * 100000 / 1000K = 5000M = 5G內存。針對通常服務器來說,徹底可知足要求(剩下事情就是要有兩個可用IP了)。
命令: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