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 只能复用本机发起的出站连接,对入站连接不起作用,也无法解决大量入站短连接带来的压力。