Appearance
Day 22: 大量断开与 TIME_WAIT 冲击 (Mass Disconnect & TIME_WAIT Shock)
所属阶段:阶段 6 — 百万长连接
今日目标
50 万连接同时断开,观测 TIME_WAIT 堆积现象。这是从长连接视角第一次看到 TIME_WAIT,为阶段 7(短连接专题)做预热。
实验
bash
# 当前有 100 万连接
# 关闭一半的客户端进程
kill <client_pid_for_500k_conns>预期现象
bash
watch -n 1 'ss -s'
# 瞬间出现大量 TIME_WAIT 状态
# Total: 1000000
# TCP: 500000 (estab 500000, closed 0, timewait 500000, ...)观测
bash
# TIME_WAIT 连接数
ss -tan state time-wait | wc -l
# 随时间衰减
# TIME_WAIT 默认 60 秒
# 观测 TW 数量从 50 万 → 0 的过程(约 60 秒线性减少)TIME_WAIT 的作用
TIME_WAIT 是 TCP 协议的正常状态,不是 bug:
- 确保最后的 ACK 能被对方收到(如果对方没收到会重发 FIN)
- 防止旧连接的数据包被新连接误收(2MSL = 2×30s = 60s)
长连接 vs 短连接场景
| 场景 | TIME_WAIT 影响 | 严重性 |
|---|---|---|
| 长连接 | 连接长期保持,断开时产生少量 TW | 低 |
| 短连接 | 每次请求都建连+断连,TW 持续累积 | 高 |
长连接场景下,50 万 TW 堆积只在"批量断开"的瞬间出现,且 60 秒后自动消失。这是可接受的。
但短连接场景下,如果每秒都有大量连接断开,TW 会持续高位运行——这才是阶段 7 要解决的核心问题。
关键指标记录
| 指标 | 值 |
|---|---|
| 断开连接数 | 50 万 |
| TW 峰值 | ~50 万 |
| TW 持续时间 | ~60 秒 |
| 系统是否正常 | 正常(只是观察,不做处理) |
一句话总结:TIME_WAIT 是"好问题"——它说明你的 TCP 连接正常关闭了。长连接偶尔产生 TW 无大碍,但短连接每秒都在产生 TW,那就是阶段 7 要解决的真正灾难。