插件窝 干货文章 Linux 下大量TIME_WAIT 的解决办法

Linux 下大量TIME_WAIT 的解决办法

连接 WAIT TIME 关闭 633    来源:    2025-05-11

Linux 下大量 TIME_WAIT 状态的解决方案

TIME_WAIT 是 TCP 连接关闭过程中的一个正常状态,但当系统中出现大量 TIME_WAIT 连接时,可能会耗尽可用端口资源,影响新连接的建立。以下是针对这个问题的解决方案:

原因分析

TIME_WAIT 状态会在主动关闭连接的一方持续 2*MSL (Maximum Segment Lifetime,通常为60秒)。大量 TIME_WAIT 通常出现在: - 高并发短连接场景 - 服务端主动关闭连接 - 连接频繁建立和关闭

解决方案

1. 调整内核参数

# 编辑 sysctl.conf 文件
sudo vi /etc/sysctl.conf

添加或修改以下参数:

# 启用 TIME_WAIT 重用
net.ipv4.tcp_tw_reuse = 1

# 启用 TIME_WAIT 快速回收
net.ipv4.tcp_tw_recycle = 1

# 增加可用本地端口范围
net.ipv4.ip_local_port_range = 1024 65535

# 增大系统同时保持 TIME_WAIT 的最大数量
net.ipv4.tcp_max_tw_buckets = 2000000

# 减少 FIN_WAIT2 状态的超时时间
net.ipv4.tcp_fin_timeout = 30

# 增大 SYN 队列长度
net.ipv4.tcp_max_syn_backlog = 8192

# 增大系统文件描述符限制
fs.file-max = 1000000

应用修改:

sudo sysctl -p

注意:在某些内核版本中,tcp_tw_recycle 可能与 NAT 环境不兼容,可能导致连接问题。在云环境或 NAT 后使用时需谨慎。

2. 优化应用程序

  • 使用连接池:对于数据库等后端服务,使用连接池减少连接建立和关闭频率
  • 长连接替代短连接:尽可能使用长连接
  • 调整关闭策略:让客户端而不是服务端主动关闭连接

3. 负载均衡配置

如果是负载均衡后的服务器: - 开启负载均衡器的持久连接(persistent connection) - 调整负载均衡器的连接超时时间

4. 监控与维护

# 查看当前 TIME_WAIT 连接数
ss -s | grep -i time-wait
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

# 查看各IP的TIME_WAIT连接数
netstat -n | grep TIME_WAIT | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr

注意事项

  1. 修改内核参数前建议先在测试环境验证
  2. 生产环境调整应逐步进行,观察系统稳定性
  3. 某些参数(如tcp_tw_recycle)在较新内核中可能已被移除或行为改变
  4. 对于容器环境,需要在宿主机和容器内同时调整

通过以上调整,可以有效减少系统中 TIME_WAIT 状态连接的数量,提高系统的连接处理能力。