Linux 大量TIME_WAIT解决办法

发现存在大量TIME_WAIT状态的连接tcp 0 0 127.0.0.1:3306 127.0.0.1:41378 TIME_WAITtcp 0 0 127.0.0.1:3306 127.0.0.1:41379 TIME_WAITtcp 0 0 127.0.0.1:3306 127.0.0.1:39352 TIME_WAITtcp 0 0 127.0.0.1:3306 127.0.0.1:39350 TIME_WAITtcp 0 0 127.0.0.1:3306 127.0.0.1:35763 TIME_WAITtcp 0 0 127.0.0.1:3306 127.0.0.1:39372 TIME_WAITtcp 0 0 127.0.0.1:3306 127.0.0.1:39373 TIME_WAITtcp 0 0 127.0.0.1:3306 127.0.0.1:41176 TIME_WAIT通过调整内核参数解决vi /etc/sysctl.conf

编辑文件,加入以下内容:net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_fin_timeout = 30然后执行/sbin/sysctl -p让参数生效。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修改系統默认的TIMEOUT时间修改之后,再用命令查看TIME_WAIT连接数netstat -ae|grep “TIME_WAIT” |wc –l

发现大量的TIME_WAIT 已不存在,mysql进程的占用率很快就降下来的,网站访问正常。不过很多时候,出现大量的TIME_WAIT状态的连接,往往是因为网站程序代码中没有使用mysql.colse(),才导致大量的mysql TIME_WAIT. 如果你的服务器是Windows平台,可以修改下面的注册表键值:[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]”TcpTimedWaitDelay”=dword:0000001e

此值是TIME_WAIT状态的最长时间。缺省为240秒,最低为30秒,最高为300秒。建议为30秒。注释:(1,TCP结束的过程如下:

Server Client

————– FIN ————–> server: fin_wait_1

<————- ACK ————— client: close_wait server:fin_wait_2

<————- FIN ————— client发出fin之后就关闭

————– ACK ————-> server发出ack后进入time_wait状态

Time_Wait的默认时间是2倍的MLS,就是240秒钟。MLS是TCP片在网上的最长存活时间。TIME_Wait的主要作用是保证关闭的TCP端口不立即被使用。因为当网络存在延迟时,可能当某个端口被关闭后,,网络中还有一些重传的TCP片在发向这个端口,如果这个端口立即建立新的TCP连接,则可能会有影响。所以使用2倍的MSL时间来限制这个端口立即被使用。

现在的问题在于,4分钟的时间有点长。因此,Time_wait的影响,我想,首先每个TCP连接都各自有个数据结构,叫TCP Control Block.Time_wait的时候这个数据结构没有被释放。所以当有太多的TCP连接时,内存可能会被占用很多。

找一个让心里安静和干净的地方,自己变得跟水晶一般透明,

Linux 大量TIME_WAIT解决办法

相关文章:

你感兴趣的文章:

标签云: