在检查服务器时,发现有很多连接超时情况出现,用netstat命令查看,tcp的time_wait状态较多,需要进行优化。

1、 看一下现在time_wait的数量

         netstat -an | grep TIME_WAIT | wc -l

2、发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,在 /etc/sysctl.conf中加入

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

         net.ipv4.tcp_fin_timeout=30    (修改系統默认的 TIMEOUT 时间)

      然后执行 /sbin/sysctl -p 让参数生效。

 3、看看系统的tcp参数情况

         sysctl -a|grep tcp

        修改生效后,time_wait数会明显下降。

TIME_WAIT状态存在的理由:

        主动关闭的Socket端会进入TIME_WAIT状态,并且持续2MSL时间长度,MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间将在网络中消失。MSL在RFC   1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒,因而,TIME_WAIT状态一般维持在1-4分钟。

        明明就已经主动关闭连接了为啥还要保持资源一段时间呢?这个是TCP/IP的设计者规定的,主要出于以下两个方面的考虑:

1、防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)

2、可靠的关闭TCP连接。在主动关 闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst  而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。另外这么设计TIME_WAIT  会定时的回收资源,并不会占用很大资源的,除非短时间内接受大量请求或者受到攻击


不过也有大型互联网公司服务器专家建议:tcp_tw_recycle 有坑! 建议关闭(设为0)! tcp_tw_recycle = 0

blob.png