TIME_WAIT 总量上限是什么
net.ipv4.tcp_max_tw_buckets 限制系统中同时存在的 TIME_WAIT 套接字总数,默认 262144。它是保护性参数:超出之后内核会立即销毁部分 TIME_WAIT 套接字并打印告警日志,以换取系统的稳定运行,代价是失去协议规定的报文交错防护。这个上限的作用不是消灭 TIME_WAIT,而是在资源失控时给出兜底。真正需要减少 TIME_WAIT 时,方向是改用长连接、让客户端先关闭、或是用端口复用机制。
基本信息
| 参数 | net.ipv4.tcp_max_tw_buckets |
|---|---|
| 默认值 | 262144(以本机回读为准) |
| 超限日志 | dmesg 中出现 time wait bucket table overflow |
| 正常时长 | TIME_WAIT 由协议规定约为 2MSL,Linux 上约 60 秒 |
| 可观测数量 | ss -tan state time-wait | wc -l |
| 相关参数 | net.ipv4.ip_local_port_range 与 net.ipv4.tcp_tw_reuse |
典型使用场景
- 网关与代理类主机:短连接数量大,TIME_WAIT 容易累积到高位
- 日志告警处理:内核出现 bucket overflow 后评估是否需要处理
- 端口耗尽排查:TIME_WAIT 占用本地端口导致新建连接失败
- 容量评估:把 TIME_WAIT 峰值与端口池规模一起核对
- 避免误判:区分 TIME_WAIT 数量偏高与真正故障之间的差别
检查与处理
检查与处理
sysctl net.ipv4.tcp_max_tw_buckets # 读当前上限
ss -tan state time-wait | wc -l # 当前 TIME_WAIT 总量
ss -s | head # 各状态汇总
dmesg -T | grep -i 'time wait' | tail # 查溢出日志
sysctl net.ipv4.ip_local_port_range # 与出站端口池规模一起核对
nstat -az TcpExtTCPTimeWaitOverflow 2>/dev/null # 部分内核提供该计数现象与方向对照
| 现象 | 含义 | 处理方向 |
|---|---|---|
| TIME_WAIT 数量数万 | 短连接密集的正常结果 | 不一定需要处理,先看是否有端口耗尽 |
| bucket overflow 日志 | 总量触顶,内核强制销毁 | 评估连接模式,必要时适当提高上限 |
| Cannot assign requested address | 出站端口被占满 | 改连接复用、扩端口池或调整连接模式 |
| 目的地址集中 | 同一目标的短连接风暴 | 连接池化收益最大,优先从应用侧改造 |
下调这个值会让内核更早销毁 TIME_WAIT 套接字,削弱报文交错与延迟到达报文的防护能力。除非确实观察到溢出日志且连接数量巨大,否则不建议把它改小。
TIME_WAIT 数量本身不是故障指标:一台代理机上出现几万条 TIME_WAIT 属于正常工作状态。只有它与端口耗尽、建连失败同时出现时,才需要作为问题处理。