TIME-WAIT 堆积怎么看
回收态是主动关闭连接的一方在发完最后确认后停留的状态,默认持续两个报文最大生存时间,Linux 下约 60 秒。它的存在不是缺陷:这段时间让迟到的报文不会串到新建的连接上,也让对端有机会重发最后确认。需要判断的是数量级与趋势——高频短连接的服务端出现数万条回收态属常态,客户端侧堆积并伴随端口分配失败才是要处置的信号。看数量的同时要看它随时间的变化:能自然回落说明只是关闭速率高,持续单向增长才需要动。
基本信息
| 适用平台 | Linux,查看用 iproute2 的连接工具,参数用 sysctl 或内核统计文件 |
|---|---|
| 状态含义 | 主动关闭方的正常回收态,默认停留约 60 秒 |
| 常见场景 | 短连接请求量高、本机端口不够用、无法分配请求地址 |
| 判定方法 | 回收态数量与主动关闭速率成正比,观察是否随时间回落 |
| 容量参考 | 本地端口池默认约 2.8 万个,用内核参数查看实际范围 |
| 交叉确认 | 配合汇总连接统计与内核套接字统计文件核对总量与趋势 |
典型使用场景
- 客户端报无法分配请求地址时,先量化本机回收态数量
- 高并发短连接服务:判断堆积是自然结果还是连接复用不足
- 判定方向:服务端主动关闭时回收态挂在服务端口上,不影响端口耗尽
- 优化前后对比:改用长连接或连接复用后,观察数量是否明显下降
- 容量评估:用请求速率与关闭速率估算稳态数量,提前发现端口池不足
- 变更前留基线:调整参数或架构前记录数量与速率,事后才有对比依据
量化与分布
量化与分布
ss -Htan state time-wait | wc -l # 回收态总量
ss -Htan state time-wait | awk '{print $4}' | awk -F: '{print $NF}' | sort | uniq -c | sort -rn | head # 按本地端口聚合
ss -s # 汇总视图,同时看其它状态
sysctl net.ipv4.ip_local_port_range # 本地端口池范围
sysctl net.ipv4.tcp_fin_timeout # 关闭相关超时参数
cat /proc/net/sockstat # 内核统计的套接字使用情况
watch -n 5 'ss -Htan state time-wait | wc -l' # 观察数量是否持续单向增长现象与处置方向
| 现象 | 含义 | 处置方向 |
|---|---|---|
| 数量随时间回落 | 短连接密集但关闭速率稳定 | 正常,无需处理 |
| 数量持续单向增长 | 主动关闭速率高于回收速率 | 查端口池剩余与连接复用配置 |
| 报无法分配请求地址 | 四元组用尽,无法新建出向连接 | 扩大端口范围、启用连接复用、改长连接 |
| 服务端口上大量回收态 | 服务端主动关闭短连接 | 不影响端口耗尽,考虑长连接或优雅关闭 |
| 回收态与应用超时同时出现 | 超时机制导致频繁主动关闭 | 核对上下游超时配置差异 |
| 高峰过后出现数量峰值 | 短连接集中关闭的自然结果 | 记录峰值基线,观察是否在低位回落 |
回收态占用的是四元组(源地址、源端口、目的地址、目的端口),只要四元组不重复就不影响新建连接。真正会被耗尽的是客户端侧的本地端口池,而不是服务端的监听端口。
对回收态的处置要谨慎:调整复用相关参数影响的是全机所有出向连接,可能带来旧报文干扰新连接的风险。优先从应用侧改连接复用与长连接,只有在量化确认端口池不足后才考虑参数调整,并保留改动前的基线数据。