等待状态在说什么
主动关闭连接的一方在最后会进入等待状态,持续约两倍报文最大生存时间(常见实现为六十秒左右),目的是处理延迟到达的旧报文,避免它们干扰后续使用同一端口的新连接。高并发短连接的服务里,这个状态会大量堆积并占用本地端口资源。判断是否属于问题时,关键看两点:状态集中在哪一侧,以及数量是否已经影响新建连接。它是协议机制的正常结果,不是错误。
基本信息
| 状态名 | TIME-WAIT |
|---|---|
| 持续时长 | 约两倍报文最大生存时间,常见实现为六十秒 |
| 产生方 | 主动关闭连接的一方 |
| 查看命令 | ss -tan state time-wait 或 netstat -an |
| 相关参数 | 端口复用与状态上限相关内核参数 |
典型使用场景
- 排查本地端口耗尽:确认是否由大量短连接堆积造成
- 区分责任方:确认是哪一侧主动关闭,堆在谁身上
- 评估连接池价值:短连接改造为复用后可显著减少该状态数量
- 核对参数调整效果:对比调整前后的状态数量
- 与客户端行为关联:客户端短连接多则客户端侧堆积
查看与评估
查看与评估
ss -tan state time-wait | wc -l # 总数量
ss -tan state time-wait | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -rn | head # 按本地端口分布
ss -s | head -5 # 总体状态概览
sysctl net.ipv4.tcp_tw_reuse net.ipv4.tcp_max_tw_buckets # 相关参数现状
cat /proc/sys/net/ipv4/ip_local_port_range # 可用本地端口范围观察项与含义
| 观察项 | 正常表现 | 异常提示 |
|---|---|---|
| 总量 | 与每秒新建连接数大致成比例 | 远超业务峰值说明短连接过多 |
| 本地端口分布 | 集中在少数服务端口 | 分散在高位端口说明它是客户端角色 |
| 所在主机 | 主动关闭方一侧 | 两侧都很多说明连接建立与关闭策略不一致 |
| 持续时间 | 约六十秒内自然消失 | 长时间不消失说明状态异常或统计口径有误 |
| 与新建失败的关系 | 端口充足时无影响 | 出现端口耗尽报错时才需要优化 |
该状态集中在主动关闭的一方:客户端发起关闭就堆在客户端,服务端主动关闭就堆在服务端。看到堆积先确认是哪一侧主动关闭,再谈优化方向。
调整相关内核参数会影响所有连接的行为,盲目调小存在旧报文串扰的风险。先量化数量与端口资源余量,确认确实影响新建连接后再考虑。
与端口资源对照
与端口资源对照
ss -tan state time-wait | wc -l
cat /proc/sys/net/ipv4/ip_local_port_range | awk '{print $2-$1}' # 可用端口数量
ss -tan state time-wait | awk '{print $4}' | cut -d: -f1 | sort | uniq -c # 涉及哪些本地地址判读要点
- 该状态是内核状态,抓包里看不到,必须用系统命令查看
- 数量与每秒新建连接数成正比,评估时先算业务峰值再判断是否偏高
- 出现端口耗尽类报错时才是真正需要处理的情况,此时优先考虑连接复用
- 两个方向都大量存在时,说明连接建立与关闭策略两侧不对称,值得一并梳理