[TimLinux] TCP全连接队列满
Posted TimLinux
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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全连接队列满的主要内容,如果未能解决你的问题,请参考以下文章