网络栈调优98 条

TIME-WAIT 堆积诊断

短连接服务出现大量 TIME-WAIT 时, 先量化数量与端口分布, 再判断是否真的影响端口可用性, 避免盲目关闭时间等待。

TIME-WAIT 堆积怎么看

短连接服务出现大量 TIME-WAIT 时,先量化数量与端口分布,再判断是否真的影响端口可用性。TIME-WAIT 是 TCP 主动关闭方必须停留的状态,持续 2 倍 MSL,Linux 上约 60 秒,用于确保最后确认能到达并让旧报文在网络中消散。它是协议规定的正常状态而不是故障:只有出现端口耗尽(bind 报 EADDRINUSE)或内存被明显占用时才需要处理,而且应优先从连接复用与长连接入手。

基本信息

查看命令ss -tan state time-wait
统计数量ss -tan state time-wait | wc -l
停留时长2 × MSL,Linux 约 60 秒,由内核固定
缓解参数net.ipv4.tcp_tw_reuse(只影响自己的出站连接)
端口范围net.ipv4.ip_local_port_range

典型使用场景

  • 服务绑定固定端口失败,报 EADDRINUSE
  • 短连接压测后本地端口被占用殆尽
  • 代理层与上游之间大量短连接,连接数居高不下
  • 评估是否应改为连接池或长连接
  • 排查连接数异常统计中 TIME-WAIT 的贡献比例

计数与分布

计数与分布
ss -tan state time-wait | wc -l                     # 总量
ss -tan state time-wait | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -rn | head
cat /proc/sys/net/ipv4/ip_local_port_range           # 可用端口范围
sysctl net.ipv4.tcp_tw_reuse                         # 是否允许复用出站连接
ss -s | head -12                                     # 全局状态汇总
ss -tan state time-wait | awk '$4 ~ /:80$/ {c++} END {print c}'   # 某本地端口上的数量

分布读法

观察点现象结论
本端端口集中TIME-WAIT 集中在少数本地端口主动关闭方是本地服务
对端端口集中对端端口固定、本端分散上游是短连接客户端或代理
数量周期性升降呈锯齿变化与固定的建连节奏对应
端口接近范围上限新连接开始失败本地端口即将耗尽,需立刻处理
TIME-WAIT 占用的是四元组而不只是端口号,端口耗尽通常出现在频繁向同一目标建连的场景。
tcp_tw_reuse 只能复用本机发起的出站连接,对入站连接不起作用,也无法解决大量入站短连接带来的压力。

易错点

  • 把数量高直接当故障:应用没有报错却去调参数,属于无谓变更
  • 忘记 tcp_tw_reuse 只作用于出站连接:入站场景调了看不到效果
  • 直接关闭时间等待机制:绕过协议规定会带来旧报文串扰与连接误复用风险,Linux 上通常不建议
  • 只看总数不看端口分布:无法判断是本地主动关闭还是上游短连接造成
  • 不优先改长连接与连接池:治标不治本,端口压力会随流量继续上涨

数据来源与参考

  • man ss
  • Linux Documentation/networking/ip-sysctl.txt
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌