Linux大量的TCP TIME_WAIT解决办法

网络 · ruyi · 于 10个月前发布 · 926 次阅读

某台服务器发送告警,本地在产生大量的tcp sockets连接,上去看了下服务器,发现有很多的TIME_WAIT状态。 TIME_WAIT数量接近1W个了。

#/bin/netstat -nat|grep TIME_WAIT |wc -l
9494

上面的大量TIME_WAIT连接请求的是下面这个IP 10.128.6.39:3306,这个是我们的某台DB服务器。

#/bin/netstat -nat|grep TIME_WAIT 
tcp        0      0 ::ffff:10.128.2.87:19738    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19668    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19651    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19654    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19694    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19740    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19655    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19701    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19699    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19706    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19697    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19717    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19714    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19667    ::ffff:10.128.6.39:3306     TIME_WAIT   
tcp        0      0 ::ffff:10.128.2.87:19742    ::ffff:10.128.6.39:3306     TIME_WAIT

产生大量的TIME_WAIT的原因一般是某些程序连接mysql后没有close掉,或者没有使用长连接。而本地连接在不断的创建新连接,老的连接没有被释放掉,就会造成大量的TIME_WAIT。

上面的问题一方面通过优化程序来解决,另一方面可以通过调整内核参数解决,编辑内核文件

#vi /etc/sysctl.conf

加入以下内容:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.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连接数

#/bin/netstat -nat|grep TIME_WAIT |wc -l
55

发现大量的TIME_WAIT 已不存在,连接mysql进程的连接数占用率很快就降下来的。

本文由 ruyi 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。


本帖已经被管理员设置为: 精华帖 !
共收到 0 条回复 TIME_WAIT
没有找到数据。
回复本帖 (需要登录)