ss 显示 5 万 TIME_WAIT,如何调整内核参数并验证无副作用
解读
- 场景定位:国内互联网后端服务普遍采用短连接(HTTP/1.1、RPC、MQ、Redis 连接池)+ 高并发压测,TIME_WAIT 暴涨是常态。
- 风险阈值:5 万在 16 G 内存、4C 的容器里已占约 300 M 内存(每个 TIME_WAIT 约 6–7 k 内核结构+TCP 控制块),继续增长会触发“Cannot assign requested address”或 OOM。
- 面试考点:能否给出“可灰度、可回滚、可观测”的闭环方案,而不是简单 echo 几个参数。
- 合规要求:国内生产变更必须走“三级变更”流程,需提前准备观测指标与回滚脚本,否则 0 分。
知识点
- TIME_WAIT 产生条件:主动关闭方在收到对端 FIN 后进入,持续 2MSL(Linux 默认 60 s)。
- 内核参数语义
net.ipv4.tcp_tw_reuse:仅对出站连接生效,需同时满足时间戳、NAT 无五元组冲突,仍受 2MSL 约束。
net.ipv4.tcp_tw_recycle:已废弃(Linux 4.12 移除),在 NAT 场景会导致“连接漂移”丢包。
net.ipv4.tcp_max_tw_buckets:硬上限,超过直接丢弃 TW 套接字,无 2MSL 等待,业务无感知,但会丢 FIN 重传。
net.ipv4.ip_local_port_range:决定单 IP 对外连接并发上限;端口耗尽会报 EADDRNOTAVAIL。
net.ipv4.tcp_timestamps:reuse 依赖项,关闭则 reuse 失效。
net.core.somaxconn / net.ipv4.tcp_max_syn_backlog:与并发建链相关,需同步评估。 - 观测指标:
ss -ant | awk ‘/^TIME-WAIT/ {sum++} END{print sum}’
nstat -az | grep TcpExtTWRecycled
sar -n SOCK,tcp 1
/proc/net/sockstat 的 TW 字段 - 副作用:
tw_buckets 过小 → 丢 FIN → 对端重传 3–5 次才释放,拉长连接生命周期。
reuse 在 NAT 环境重用五元组 → 新连接 SEQ 错乱 → RST 断开。
端口范围调大 → 与防火墙 conntrack 表冲突,导致 nf_conntrack: table full。 - 灰度策略:
按 Set 维度灰度,先 1%,再 10%,再全量;每阶段观察 24 h。
回滚脚本提前写入 Ansible Tag,30 s 内可回滚。
答案
步骤 1:确认是否真需优化
压测场景:若 5 万 TW 在 30 s 内爬升后稳定,且端口利用率 < 50%,可接受。
业务场景:若持续 5 万并伴随“Cannot assign requested address”,必须优化。
步骤 2:给出最小改动组合(Linux 3.10+,CentOS 7/8、Alibaba Cloud Linux 2/3 验证通过)
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
echo "4096 65000" > /proc/sys/net/ipv4/ip_local_port_range
保持 tcp_timestamps=1
绝不开启 tcp_tw_recycle
步骤 3:持久化
vim /etc/sysctl.d/99-time_wait.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 262144
net.ipv4.ip_local_port_range = 4096 65000
sysctl -p /etc/sysctl.d/99-time_wait.conf
步骤 4:验证无副作用
- 指标观测:
tw 数量:watch 'ss -ant | grep TIME-WAIT | wc -l'
丢包:nstat -az | grep -E 'TcpExtTWKilled|TcpExtTWRecycled' 应保持稳定
重传:sar -n ETCP 1 中的 retrans/s 无突增 - 业务验证:
在灰度集群跑 30 min 全链路压测,QPS、P99、错误率与基线差异 < 2%
长连接服务(MySQL、Redis)无“connection reset by peer”告警 - 回滚演练:
直接 rm /etc/sysctl.d/99-time_wait.conf && sysctl -p,tw 数量 60 s 内回到原水平,业务无感知
步骤 5:输出报告
包含:基线 TW 曲线、变更后曲线、端口利用率、重传率、回滚耗时、结论“可全量”。
拓展思考
- 云原生环境:
容器共享宿主机协议栈,TW 计数在宿主机 /proc/net/sockstat,需把参数打在宿主机而非 Pod。
使用 Terway ENI 模式时,每个 Pod 有独立 IP,可单独调 port_range,避免争抢。 - 短连接改造:
评估是否可切 HTTP/2、QUIC、RPC 长连接池,把 5 万 TW 降到 5 千,比调参更彻底。 - 内核热升级:
阿里龙蜥 ANCK 5.10 提供 tcp_tw_timeout 可调,缩短 2MSL 到 15 s,灰度方式同上。 - 监控闭环:
将 TW 数量、端口耗尽事件、TcpExtTWKilled 纳入 Prometheus + Grafana,告警阈值=端口范围*0.8,提前预警。