TIME_WAIT 是 TCP 连接关闭过程中的一个正常状态,但当系统中出现大量 TIME_WAIT 连接时,可能会耗尽可用端口资源,影响新连接的建立。以下是针对这个问题的解决方案:
TIME_WAIT 状态会在主动关闭连接的一方持续 2*MSL (Maximum Segment Lifetime,通常为60秒)。大量 TIME_WAIT 通常出现在: - 高并发短连接场景 - 服务端主动关闭连接 - 连接频繁建立和关闭
# 编辑 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 后使用时需谨慎。
如果是负载均衡后的服务器: - 开启负载均衡器的持久连接(persistent connection) - 调整负载均衡器的连接超时时间
# 查看当前 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
tcp_tw_recycle
)在较新内核中可能已被移除或行为改变通过以上调整,可以有效减少系统中 TIME_WAIT 状态连接的数量,提高系统的连接处理能力。