没事听听别人口中的自己,这比看大片还刺激,你会发现你什么都没做,但已经演了好多版本,都是大角色。
前言
TIME_WAIT
状态原理
当客户端主动关闭连接时,会发送最后一个ACK
,然后会进入TIME_WAIT
状态,再停留2个MSL时间(约1-4分钟)
,进入CLOSED
状态。
详细
CentOS6/7.x默认没有对系统参数进行设置,当大量TIME_WAIT
产生的时候会影响系统性能,
统计TIME_WAIT
状态数量
1 | netstat -ano | grep TIME_WAIT | wc -l |
查看系统当前连接状态
1 | netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' |
我们只用关心TIME_WAIT
的个数,在这里可以看到,有1280多个TIME_WAIT
,这样就占用了1280多个端口,端口的数量只有65535个,占用一个少一个,会严重的影响到后继的新连接,就需调整下Linux的TCP内核参数,让系统更快的释放TIME_WAIT
连接。
解决方法如下:
修改内核配置vim /etc/sysctl.conf
,加入以下内容:
1 | net.ipv4.tcp_syncookies = 1 #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭; |
然后执行
1 | /sbin/sysctl -p |
让参数生效。
参数说明:
1 | net.ipv4.tcp_keepalive_time = 1200 #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。 |