首页/系统/Linux 内核与性能调优速查/net.ipv4.tcp_max_tw_buckets TIME_WAIT 总量
sysctl 内核参数72 条

net.ipv4.tcp_max_tw_buckets TIME_WAIT 总量

TIME_WAIT 状态套接字的总量上限,超出后内核会立即销毁并打印告警;默认 262144,属于保护性参数。

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 属于正常工作状态。只有它与端口耗尽、建连失败同时出现时,才需要作为问题处理。

易错点

  • 看到 TIME_WAIT 数量大就立刻调参:先确认是否伴随建连失败与溢出日志
  • 把上限调小来「解决」TIME_WAIT:削弱的是协议防护,问题被掩盖而非解决
  • 忽略出站端口池规模:端口耗尽往往与端口范围设置共同决定
  • 不清楚是谁在持有 TIME_WAIT:先确认连接方向,客户端与服务端的处理方式不同
  • 在日志里漏看溢出告警:内核对溢出会明确打印,采集应包含 dmesg 或内核日志

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/net.rst
  • man 7 tcp
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌