TCP: time wait bucket table overflow问题解决

新上的服务器发生两次负载过高,而不能访问其网站的问题,因为是新上阿里云的ECS,第一次出现这个问题没太在意重启了下就好了(比起服务器在机房打电话重启方便多了),第二次放生的时候查看了下日志有大量的TCP: time wait bucket table overflow。

解决方法:

修改vim /etc/sysctl.conf
net.ipv4.tcp_max_tw_buckets = 50000 
调大timewait 的数量
net.ipv4.tcp_fin_timeout = 10  
如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2 状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180 秒,3你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2 的危险性比FIN-WAIT-1 要小,因为它最多只能吃掉1.5K 内存,但是它们的生存期长些。
net.ipv4.tcp_tw_recycle= 1   
启用timewait 快速回收
net.ipv4.tcp_tw_reuse = 1    
开启重用,允许将TIME-WAIT sockets 重新用于新的TCP 连接
保存设置
sysctl -p

解决过程:

这个问题第一次遇到,上网搜了下,整理了一下直接复制过来。

 

TIME_WAIT的产生条件:主动关闭方在发送四次挥手的最后一个ACK会变为TIME_WAIT状态,保留次状态的时间为两个MSL(linux里一个MSL为30s,是不可配置的)

TIME_WAIT两个MSL的作用:可靠安全的关闭TCP连接。比如网络拥塞,主动方最后一个ACK被动方没收到,这时被动方会对FIN开启TCP重传,发送多个FIN包,在这时尚未关闭的TIME_WAIT就会把这些尾巴问题处理掉,不至于对新连接及其它服务产生影响。

TIME_WAIT占用的资源:少量内存(查资料大概4K)和一个fd。

TIME_WAIT关闭的危害:

1、  网络情况不好时,如果主动方无TIME_WAIT等待,关闭前个连接后,主动方与被动方又建立起新的TCP连接,这时被动方重传或延时过来的FIN包过来后会直接影响新的TCP连接;

2、  同样网络情况不好并且无TIME_WAIT等待,关闭连接后无新连接,当接收到被动方重传或延迟的FIN包后,会给被动方回一个RST包,可能会影响被动方其它的服务连接。

TCP: time wait bucket table overflow产生原因及影响:原因是超过了linux系统tw数量的阀值。危害是超过阀值后﹐系统会把多余的time-wait socket 删除掉,并且显示警告信息,如果是NAT网络环境又存在大量访问,会产生各种连接不稳定断开的情况。

 

posted @ 2017-12-07 11:53  王嘉喆  阅读(494)  评论(0编辑  收藏  举报