linux內核調優tcp_max_syn_backlog和somaxconn的區別
The behavior of the backlog argument on TCP sockets changed with Linux 2.2. Now it specifies the queue length for completely established sockets waiting
to be accepted, instead of the number of incomplete connection requests. The maximum length of the queue for incomplete sockets can be set using
/proc/sys/net/ipv4/tcp_max_syn_backlog. When syncookies are enabled there is no logical maximum length and this setting is ignored. See tcp(7) for more
information.
If the backlog argument is greater than the value in /proc/sys/net/core/somaxconn, then it is silently truncated to that value; the default value in this
file is 128. In kernels before 2.4.25, this limit was a hard coded value, SOMAXCONN, with the value 128.
tcp_max_syn_backlog介紹:
socket接收的所有連接都是存放在隊列類型的數據結構中,關鍵問題是這種隊列有兩個,而且其長度都是可以設置的。
分別是下面兩個內核參數:
/proc/sys/net/ipv4/tcp_max_syn_backlog
/proc/sys/net/core/somaxconn
其中:
tcp_max_syn_backlog是指定所能接受SYN同步包的最大客戶端數量,即半連接上限;
somaxconn參數介紹:
somaxconn是指服務端所能accept即處理數據的最大客戶端數量,即完成連接上限。
對於沒有調優的新裝的centOS6.5系統,這兩個參數的值都是128。
這麽描述雖然精確,但是沒有一定基礎,不熟練網絡編程的人理解起來很費勁。
打個簡單的比方:
某某發布公告要邀請四海之內若幹客人到場參加酒席。客人參加酒席分為兩個步驟:
1、到大廳;
2、找到座位(吃東西,比如糖果、飯菜、酒等)。
tcp_max_syn_backlog用於指定酒席現場面積允許容納多少人進來;
somaxconn用於指定有多少個座位。
顯然tcp_max_syn_backlog>=somaxconn。
如果要前來的客人數量超過tcp_max_syn_backlog,那麽多出來的人雖然會跟主任見面握手,但是要在門外等候;
如果到大廳的客人數量大於somaxconn,那麽多出來的客人就會沒有位置坐(必須坐下才能吃東西),只能等待有人吃完有空位了才能吃東西。
那麽問題來了:
somaxconn是內核裏的參數,listen函數有個參數backlog,如果在listen方法裏面指定該參數大於somaxconn的值,重新編譯並啟動程序,服務端所能接收的完整的連接數上限是backlog呢還是somaxconn?
答案很簡單,listen方法指定的backlog是在用戶態指定的,內核態的參數優先級高於用戶態的參數,所以即使在listen方法裏面指定backlog是一個大於somaxconn的值,socket在內核態運行時還會檢查一次somaxconn,如果連接數超過somaxconn就會等待。
就相當於主人指定了能有多少座位沒用,客人到了現場,準備入座時,還要看酒店的客戶經理判斷能有多少個座位。
結論:
在沒有調優的centOS6.5版本的服務器上,由於受到系統級別的限制,在該服務器上運行的服務端程序,在同一時間,最大只能接受128個客戶端發起持久連接,並且只能處理128個客戶端的數據通信。
參考文檔:
http://www.saunix.cn/1255.html
linux內核調優tcp_max_syn_backlog和somaxconn的區別