大量TIME_WAIT连接的解决办法

Posted sforiz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大量TIME_WAIT连接的解决办法相关的知识,希望对你有一定的参考价值。

根据TCP协议的连接断开规定,发起socket主动关闭的一方,socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用。具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务。TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证。

解决:发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决。

# vi /etc/sysctl.conf  //加入以下内容,net.ipv4.tcp_syncookies默认就有,不需要再添加
# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

# The TIME-WAIT sockets for new connections can be reused
net.ipv4.tcp_tw_reuse = 1

# Enable fast recycling of TIME-WAIT sockets status
net.ipv4.tcp_tw_recycle = 1

# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 30

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

/sbin/sysctl -p
附录:

附录1.Linux参数说明
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理可防范少量SYN攻击,默认为0表示关闭。
net.ipv4.tcp_tw_reuse = 1 表示开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭。
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 修改系統默认的TIMEOUT时间,改为30s。

附录2.Windows设置下TIME_WAIT等待时间参数说明
在HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters,添加名为TcpTimedWaitDelay的
DWORD键,设置为30,最短30秒,以缩短TIME_WAIT的等待时间。

以上是关于大量TIME_WAIT连接的解决办法的主要内容,如果未能解决你的问题,请参考以下文章

大量TIME_WAIT连接的解决办法

nginx+php产生大量TIME_WAIT连接解决办法

linux 大量的TIME_WAIT解决办法

发现大量的TIME_WAIT解决办法

彻底理解并解决服务器出现大量TIME_WAIT

服务器TIME_WAIT和CLOSE_WAIT详解和解决办法