tcp全连接满了怎么处理
cat /proc/sys/net/ipv4/tcp_max_syn_backlog #syn队列最大长度 netstat -ntl | grep SYN_RECV | wc -l #syn队列当前长度 #要想增大半连接队列,我们不能只单纯增大 tcp_max_syn_backlog 的值,还需一同增大 somaxconn 和 backlog,也就是增大全连接队列。否则,只单纯增大 tcp_max_syn_backlog 是无效的。 #如果syn队列满了,可以开启 tcp_syncookies 功能 echo 1 > /proc/sys/net/ipv4/tcp_syncookies #减少 SYN+ACK 重传次数 echo 2 > /proc/sys/net/ipv4/tcp_synack_retries #重试2次 #accept ss -antl #其中Send-Q就是队列最大长度,Recv-Q是当前队列积压数量,当队列满后,linux默认会丢弃连接 cat /proc/sys/net/ipv4/tcp_abort_on_overflow #0 :如果全连接队列满了,那么 server 扔掉 client 发过来的 ack ; #1 :如果全连接队列满了,server 发送一个 reset 包给 client,表示废掉这个握手过程和这个连接; #如果要想知道客户端连接不上服务端,是不是服务端 TCP 全连接队列满的原因,那么可以把 tcp_abort_on_overflow 设置为 1,这时如果在客户端异常中可以看到很多 connection reset by peer 的错误,那么就可以证明是由于服务端 TCP 全连接队列溢出的问题。 #通常情况下,应当把 tcp_abort_on_overflow 设置为 0,因为这样更有利于应对突发流量。 #当 TCP 全连接队列满导致服务器丢掉了 ACK,与此同时,客户端的连接状态却是 ESTABLISHED,进程就在建立好的连接上发送请求。只要服务器没有为请求回复 ACK,请求就会被多次重发。如果服务器上的进程只是短暂的繁忙造成 accept 队列满,那么当 TCP 全连接队列有空位时,再次接收到的请求报文由于含有 ACK,仍然会触发服务器端成功建立连接。 #所以,tcp_abort_on_overflow 设为 0 可以提高连接建立的成功率,只有你非常肯定 TCP 全连接队列会长期溢出时,才能设置为 1 以尽快通知客户端。 #TCP 全连接队列的最大值取决于 somaxconn 和 backlog 之间的最小值,也就是 min(somaxconn, backlog) cat /proc/sys/net/core/somaxconn #somaxconn 是 Linux 内核的参数,默认值是 128,可以通过 /proc/sys/net/core/somaxconn 来设置其值; echo 5000 > /proc/sys/net/core/somaxconn #backlog 是 listen(int sockfd, int backlog) 函数中的 backlog 大小,Nginx 默认值是 511,可以通过修改配置文件设置其长度; vi nginx.conf #listen 8080 backlog=5000;