服务器accept队列溢出及其解决

之前对我的NetServer服务器进行测试,在经压力测试一段时间之后,数据曲线降0,之后所有的连接都连不上,我认为不是服务器挂了就是监听端口出问题了,于是看了下服务器还在运行,端口还在listened(通过命令查看:netstat -ltp),非常奇怪,这说明监听正常,能够进行三次握手的。

后来抓包分析,发现三次握手正常建立,但是服务器竟然重传了第二次握手包,总共5次,根据这个现象来看,表面上是服务器没有收到客户端的ACK确认才会触发第二次握手的重传的,但是实际上抓包抓到了ACK ,而且单机内部测试不太可能在传输过程中丢包。

猜测:收到ACK包后,内核协议栈处理出问题了,并没有把连接放到全连接队列中,可能全连接队列已满并溢出。

网上看内核协议栈的TCP连接建立过程如下:

于是我执行命令netsta -s | grep -i listen,ss -lnt 发现队列真的溢出了。

网上查找解决办法,调大accept队列,listen参数和somaxconn(默认128),而且又查到了tcp_abort_on_overflow,等于0时直接丢弃,定时器继续计时;等于1时发送RST给客户端,断开连接。

之后又看到相关的网络内核参数优化的博客:

1. time_wait 问题解决

cat /etc/sysctl.conf

net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;复用连接,1s后;服务器无效

net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。3.5*RTO 内回收

net.ipv4.tcp_timestamps

 

2.常见网络内核参数优化 https://www.cnblogs.com/jking10/p/5472386.html

net.ipv4.tcp_syncookies=1

表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

 

3.net.ipv4.tcp_max_syn_backlog = 16384

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值