乐趣区

centos系统大量time wait占用的解决

统计在一台前端机上高峰时间 TCP 连接的情况,统计命令:netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
除了 ESTABLISHED,可以看到连接数比较多的几个状态是:FIN_WAIT1, TIME_WAIT, CLOSE_WAIT, SYN_RECV 和 LAST_ACK;下面的文章就这几个状态的产生条件、对系统的影响以及处理方式进行简单描述。
发现存在大量 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.
根据 TCP 协议定义的 3 次握手断开连接规定, 发起 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 不会受到之前残留的延迟重发报文影响的机制, 是必要的逻辑保证.
在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters, 添加名为 TcpTimedWaitDelay 的
DWORD 键, 设置为 60, 以缩短 TIME_WAIT 的等待时间
http://kerry.blog.51cto.com/1…
修改之后,再用
netstat -ae|grep mysql
tcp 0 0 aaaa:50408 192.168.12.13:mysql ESTABLISHED nobody 3224651tcp 0 0 aaaa:50417 192.168.12.13:mysql ESTABLISHED nobody 3224673tcp 0 0 aaaa:50419 192.168.12.13:mysql ESTABLISHED nobody 3224675
发现大量的 TIME_WAIT 已不存在,mysql 进程的占用率很快就降下来的,各网站访问正常!!
以上只是暂时的解决方法,最后仔细巡查发现是前天新上线的一个系统,程序代码中没有使用 mysql.colse(),才导致大量的 mysql TIME_WAIT

退出移动版