Linux服务器开启tcp_tw_recycle导致出现TIME_WAIT连接太多的问题

mysql所在的Linux服务器出现很卡的问题,查看发现mysql进程占用资源很高。

执行:netstat -an |grep  TIME_WAIT,发现系统出现了大量的TIME_WAIT状态的mysql连接。

排查内核相关优化参数。

vim /etc/sysctl.conf

# 是否开启TCP连接重用,不设置则系统默认关闭(0)。如果开启(1),允许将TIME-WAIT状态的Socket重新用于新的TCP连接,可降低系统TIME_WAIT状态的TCP端口连接的数量
net.ipv4.tcp_tw_reuse = 1

# 是否开启TCP连接中TIME-WAIT状态的Sockets的快速回收,不设置则系统默认关闭(0)
net.ipv4.tcp_tw_recycle = 1

# 是否开启SYN Cookies,不设置则系统默认关闭(0)。如果开启(1),当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击
net.ipv4.tcp_syncookies = 1

# 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,如果不设置默认为60
net.ipv4.tcp_fin_timeout = 30

# 当前系统开放的本机向外连接的源端口(本地端口)的范围:最小和最大端口的限制(同时适用于TCP和UDP连接)
# 不设置则系统默认为 32768到61000,对于繁忙的流量服务器,可适当增加随机端口范围
net.ipv4.ip_local_port_range = 1024    65000

# 系统的TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。一旦服务器端口全部被占用,服务就异常了。通过设置该参数,可以降低该问题出现的概率,争取解决时间
# 如果只有60000+个端口可用的情况下,可以配置为55000
net.ipv4.tcp_max_tw_buckets = 55000

说明:
net.ipv4.tcp_tw_recycle
1)打开该参数时,还需要同时开启net.ipv4.tcp_timestamps = 1,否则无效。不过系统默认情况下net.ipv4.tcp_timestamps是开启的。
2)打开该参数是,虽然可以快速回收处于TIME_WAIT状态的TCP Sockets(对Server端而言),减少系统中处于TIME_WAIT状态的TCP端口连接的数量。
3)如果在Client通过NAT访问Server的环境下,不推荐开启Server的net.ipv4.tcp_tw_recycle 这个参数。因为:
   如果开启该参数,对于NAT后面的Client设备来说是一场灾难,这将会导到NAT设备后面的Client连接Server不稳定(Client连接Server有些能成功,有些会失败)。
   也就是说,net.ipv4.tcp_tw_recycle 这个功能,是为“内部网络”(不存在NAT的情况)设计的,对于Server位于公网的环境则不宜使用。

net.ipv4.tcp_fin_timeout
1)这个参数用来设置对于本端断开的socket连接、TCP保持在FIN_WAIT_2状态的时间。对端可能会断开连接或一直不结束连接或不可预料的进程死亡。该参数如果不设置则系统默认值为60秒。
2)可以修改该参数,但需要注意,如果服务器部署负载很重的Web服务器,可能存在风险:内存将可能被大量无效数据报填满。FIN_WAIT_2 Sockets的危险性低于 FIN-WAIT-1,因为它们最多只吃1.5K的内存,但是它们存在时间更长。另外参考tcp_max_orphans。
3)如果在NAT环境下,降低该值,可以加快TCP连接回收。

很多服务器一般都会开启tcp_tw_recycle,加快TCP连接的快速回收。但如果在NAT的环境下,这可能会导致灾难,会导致部分TCP连接失败。如果发现系统存在大量TIME_WAIT状态的连接,可以尝试通过调整内核参数来解决。

但在NAT环境下,调整参数net.ipv4.tcp_tw_recycle 要慎重:
1)如果开启:可能会导致Client连接Server不稳定
2)如果关闭,又可能会出现TCP的连接数太多,出现大量的TIME-WAIT状态的TCP连接

实际环境中,根据自身的情况,调整这些参数。

 

我的是内网环境,最初没有开启tcp_tw_recycle,通过修改配置,开启以后,问题解决:

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 让参数生效。

调整以后,发现大量的TIME_WAIT消失,mysql进程的占用率很快就降下来的,服务器正常。

注意:关键还是要排查程序代码中是否存在遗漏mysql.colse()导致大量的mysql  TIME_WAIT的情况。
 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值