新上的服务器发生两次负载过高,而不能访问其网站的问题,因为是新上阿里云的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网络环境又存在大量访问,会产生各种连接不稳定断开的情况。