(将连接放入半连接队列中)
(连接从半连接队列移出,移入全连接队列中。)
当服务端端调用accept()时,会将连接从全连接队列中取出。
max(64,/proc/sys/net/ipv4/tcp_max_syn_backlog)
accept queue大小取决于:min(backlog,somaxconn),
backlog由listen()函数的backlog决定
thrift中默认的backlog大小为1024
somaxconn则是内核参数:/proc/sys/net/core/somaxconn
somaxconn默认为128
ss -lnt ‘sport=:10240‘
Stae Recv-Q Send-Q Local Address:port
LISTEN 0 128 *:10240
Send-Q:全连接队列(accept queue)的最大值,其值为min(backlog,somaxconn)
Recv-Q:已建立成功(状态为ESTABLISHED),但尚未交付给应用的“tcp连接的数量”,其最大值为Send-Q+1。(即三次握手完成,但是服务端还没有调用accept从全连接中取出的连接数量----积压数量)
netstat -anp |grep 10240
cat /proc/sys/net/ipv4/tcp_abort_on_overflow
#有效值为:0或1
全连接队列、半连接队列溢出的问题很容易被忽略,但是又很关键,特别是对于一些短连接应用更容易爆发。一旦溢出,从CPU、线程状态看都正常,但是压力上不去。
为了证明客户端应用程序异常跟全连接队列满有关系,可以先把tcp_abort_on_overflow参数修改为1,接着测试如果在客户端异常中可以看到很多connection reset by peer错误,说明客户端错误是连接队列满导致的。
或者
netstat -s|grep "listen|LISTEN"
3 times the listen queue of a socket overflowed
s SYNs to LISTEN sockets dropped
说明发生了3次全连接队列溢出。
原文:https://www.cnblogs.com/Corphish/p/14124217.html