TIME-WAIT状态连接过多问题解决

TIME-WAIT状态连接过多问题解决

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

问题

最近在 Zabbix Server 上启用了 zabbix-trapper 来接收 zabbix-sender 上报的数据,然后第二天查看监控发现 Zabbix Server 这台主机的 TIME-WAIT 连接异常的多。。。如下图:

image.png

我这里当前的监控环境中,大概有 20 台机器是使用 zabbix-sender 每一分钟向 Zabbix Server 上报监控数据的,所以 Zabbix Server 每分钟都会开启近 20 个连接用于 zabbix-trapper 接收数据,而这些连接的释放不及时导致大量的连接一直处于 TIME-WAIT 状态。。。

解决

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

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

可以先检查一些这些内核参数的当前状态:

$ sudo sysctl -a | egrep 'tcp_syncookies|tcp_tw_reuse|tcp_tw_recycle|tcp_fin_timeout'
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0

下面来修改一下这些内核参数,编辑文件 /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 让参数生效。

调整了这些参数后,隔几分钟检查监控,状态如下:

image.png

从常态 500+ 直接到了个位数。。给力。。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/resolve-tcp-timewat-too-many.html

Buy me a cup of coffee ☕.