這裡有兩個隊列:syns queue(半連接隊列);accept queue(全連接隊列)。 三次握手過程中: 第一步: server 收到 client 的 syn 後,把這個連接信息放到半連接隊列中, 第二步: 同時回覆 syn+ack 給 client 第三步: server 收到 clien ...
這裡有兩個隊列:syns queue(半連接隊列);accept queue(全連接隊列)。
三次握手過程中:
第一步: server 收到 client 的 syn 後,把這個連接信息放到半連接隊列中,
第二步: 同時回覆 syn+ack 給 client
第三步: server 收到 client 的 ack,如果這時全連接隊列沒滿,那麼從半連接隊列拿出這個連接的信息放入到全連接隊列中,否則按tcp_abort_on_overflow指示的執行。
這時如果全連接隊列滿了並且 tcp_abort_on_overflow 是0的話,server過一段時間再次發送syn+ack給client(也就是重新走握手的第二步),如果client超時等待比較短,client就很容易異常了。
cat /proc/sys/net/ipv4/tcp_abort_on_overflow
0
查看 全連接隊列
下麵看到的 13 times ,表示全連接隊列溢出的次數,隔幾秒鐘執行下,如果這個數字一直在增加的話肯定全連接隊列偶爾滿了。
netstat -s |egrep "listen|LISTEN"
13 times the listen queue of a socket overflowed
54 SYNs to LISTEN sockets dropped
ss -lnt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 *:7999 *:*
上面看到的第二列Send-Q 值是50,表示第三列的listen埠上的全連接隊列最大為50,第一列Recv-Q為全連接隊列當前使用了多少。
全連接隊列的大小取決於:min(backlog, somaxconn) . backlog是在socket創建的時候傳入的,somaxconn是一個os級別的系統參數。
cat /proc/sys/net/core/somaxconn
16384
查看半連接隊列
大小取決於:max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog),不同版本的os會有些差異。
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
16384
Tomcat和Nginx中的Accept隊列參數
Tomcat預設短連接,backlog(Tomcat裡面的術語是Accept count)Ali-tomcat預設是200, Apache Tomcat預設100。
Nginx預設是511
http://www.cnxct.com/something-about-phpfpm-s-backlog/