[TimLinux] TCP全連接隊列滿
0. TCP三次握手
該圖來自:TCP SOCKET中backlog參數的用途是什麽?
syns queue: 半連接隊列
accept queue: 全連接隊列
控制參數存放在文件:/proc/sys/net/ipv4/tcp_abort_on_overflow中,0:表示如果三次握手第三步的時候全連接隊列滿了,那麽server扔掉client發過來的ack(在server端因為全連接隊列滿了,認為連接還沒有建立起來),1:表示第三步的時候如果全連接隊列滿了,server發送一個reset包給client,表示廢掉這個握手過程和這個連接(client端會拋出異常:connection reset by peer的錯誤)
如果全連接隊列滿了並且tcp_abort_on_overflow=0的話,server過一段時間再次發送syn+ack給client(也就是重試),重試的次數在net.ipv4.tcp_synack_retries參數中配置:sysctl -a 可以查看當前的配置。
1. 查看全連接隊列
$ netstat -s | egrep ‘listen|LISTEN‘
667399 times the listen queue of a socket overflowed ==> 全連接隊列滿了 66739 次
$ ss -lnt ==> 50: 表示監聽的端口上全連接隊列最大為50,第一列Recv-Q表示當前使用了多少
State Recv-Q Send-Q local Address:Port Peer Address:Port
LISTEN 0 50 :3306 *:*
全連接隊列的最大值 = min(backlog, somaxconn)
backlog: 是在socket創建的時候傳入的,somaxconn:是一個os級別的系統參數(cat /proc/sys/net/core/somaxconn)
2. 查看半連接隊列
半連接隊列的大小取決於:max(64, /proc/sys/net/ivp4/tcp_max_syn_backlog),不同的OS會有差異
$ netstat -tn
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp0 0 server:8182 client-1:15260 SYNC_RECV
tcp0 28 server:22 client-1:51708 ESTABLISHED
tcp0 0 server:2376 client-1:60269 ESTABLISHED
這個命令顯示的Recv-Q、Send-Q與全連接、半連接沒有關系!
$ ab -n 10000 -c 300 http://172.16.218.128/3.php (ab: apache benchmark性能測試命令)
[TimLinux] TCP全連接隊列滿