其他
TCP 半连接队列和全连接队列满了,怎么破?
The following article is from 小林coding Author 小林coding
脚本之家
你与百万开发者在一起
1
增大 TCP 半连接队列方式是增大 tcp_max_syn_backlog; 增大 TCP 全连接队列方式是增大 listen() 函数中的 backlog;
2
半连接队列,也称 SYN 队列; 全连接队列,也称 accepet 队列;
3
Recv-Q:当前全连接队列的大小,也就是当前已完成三次握手并等待服务端accept() 的 TCP 连接个数; Send-Q:当前全连接最大队列长度,上面的输出结果说明监听 8088 端口的 TCP 服务进程,最大全连接长度为 128;
Recv-Q:已收到但未被应用进程读取的字节数; Send-Q:已发送但未收到确认的字节数;
客户端和服务端都是 CentOs 6.5 ,Linux 内核版本 2.6.32 服务端 IP 192.168.3.200,客户端 IP 192.168.3.100 服务端是 Nginx 服务,端口为 8088
0 :表示如果全连接队列满了,那么 server 扔掉 client 发过来的 ack ; 1 :表示如果全连接队列满了,那么 server 发送一个 reset 包给 client,表示废掉这个握手过程和这个连接;
somaxconn 是 Linux 内核的参数,默认值是 128,可以通过/proc/sys/net/core/somaxconn 来设置其值; backlog 是 listen(int sockfd, int backlog) 函数中的 backlog 大小,Nginx 默认值是 511,可以通过修改配置文件设置其长度;
somaxconn 是默认值 128; Nginx 的 backlog 是默认值 511
4
客户端和服务端都是 CentOs 6.5 ,Linux 内核版本 2.6.32 服务端 IP 192.168.3.200,客户端 IP 192.168.3.100 服务端是 Nginx 服务,端口为 8088
如果半连接队列满了,并且没有开启 tcp_syncookies,则会丢弃; 若全连接队列满了,且没有重传 SYN+ACK 包的连接请求多于 1 个,则会丢弃; 如果没有开启 tcp_syncookies,并且 max_syn_backlog 减去 当前半连接队列长度小于 (max_syn_backlog >> 2),则会丢弃;
全连接队列的最大值是 sk_max_ack_backlog 变量,sk_max_ack_backlog 实际上是在 listen() 源码里指定的,也就是 min(somaxconn, backlog); 半连接队列的最大值是 max_qlen_log 变量,max_qlen_log 是在哪指定的呢?现在暂时还不知道,我们继续跟进;
当 max_syn_backlog > min(somaxconn, backlog) 时, 半连接队列最大值 max_qlen_log = min(somaxconn, backlog) * 2; 当 max_syn_backlog < min(somaxconn, backlog) 时, 半连接队列最大值 max_qlen_log = max_syn_backlog * 2;
如果半连接队列满了,并且没有开启 tcp_syncookies,则会丢弃; 若全连接队列满了,且没有重传 SYN+ACK 包的连接请求多于 1 个,则会丢弃; 如果没有开启 tcp_syncookies,并且 max_syn_backlog 减去 当前半连接队列长度小于 (max_syn_backlog >> 2),则会丢弃;
如果「当前半连接队列」没超过「理论半连接队列最大值」,但是超过 max_syn_backlog - (max_syn_backlog >> 2),那么处于 SYN_RECV 状态的最大个数就是 max_syn_backlog - (max_syn_backlog >> 2); 如果「当前半连接队列」超过「理论半连接队列最大值」,那么处于 SYN_RECV 状态的最大个数就是「理论半连接队列最大值」;
0 值,表示关闭该功能; 1 值,表示仅当 SYN 半连接队列放不下时,再启用它; 2 值,表示无条件开启功能;
增大半连接队列; 开启 tcp_syncookies 功能; 减少 SYN+ACK 重传次数。
点击图片参与送书活动
👇🏻👇🏻👇🏻
(更多精彩值得期待……)
●
● 如何快速提升 JSON.stringify() 的性能?