您的位置:首页 > 理论基础 > 计算机网络

TCP连接大量TIME_WAIT状态问题排查

2018-01-17 19:14 627 查看

TIME_WAIT连接过多

TIME_WAIT的产生

  TIMEWAIT是主动关闭的一方,在使用FIN|ACK|FIN|ACK四分组正常关闭TCP连接时产生的。TIMEWAIT状态本身和应用层的客户端或者服务器是没有关系的。服务器在处理客户端请求的时候,如果你的程序设计为服务器主动关闭,那么你才有可能需要关注这个TIMEWAIT状态过多的问题。如果你的服务器设计为被动关闭,那么你首先要关注的是CLOSE_WAIT。

TIME_WAIT状态的必要性

确保被关闭端有足够时间收到ACK,如果被关闭方没收到ACK,则会重发FIN,一来一去正好2个MSL;

有足够的时间不让当前连接和后面的连接混在一起(有些路由器会缓存IP数据包,如果连接被重用了,那么这些延迟收到的数据包可能会跟新连接混在一起)。

大量TIME_WAIT出现场景

  在高并发短连接的TCP服务器上,当服务器处理完请求后立刻按照主动正常关闭连接这个场景下,会出现大量socket处于TIMEWAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。

大量TIME_WAIT解决方案

缩短MSL时间。

增加可用端口数量。可用端口数量=单进程可打开的连接数量*机器数量。

MSL时间

  RFC793定义MSL为2分钟。

查看:sysctl -a | grep time | grep wait

修改:

vi /etc/sysctl.conf;

net.ipv4.tcp_fin_timeout = 30;

执行 /sbin/sysctl -p 让参数生效;

TIME_WAIT的重用和快速回收

打开方式:设置TCP参数 net.ipv4.tcp_tw_reuse = 1 和 net.ipv4.tcp_tw_recycle = 1;

注意:使用tcp_tw_reuse和tcp_tw_recycle解决TIME_WAIT过多问题是非常危险的,参考RFC

Allow to reuse TIME-WAIT sockets for new connections when it is safe from protocol viewpoint. Default value is 0. It should not be changed without advice/request of technical experts.

参考:http://blog.csdn.net/yusiguyuan/article/details/21445883
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: