net.ipv4.tcp_max_tw_buckets 是 time_wait socket 的全局硬上限,达到后内核静默丢弃新 syn 包;默认值 32768,高并发下易触发,建议设为 262144 并配合 tcp_fin_timeout、tw_reuse 等优化。

直接修改 net.ipv4.tcp_max_tw_buckets 就能限制系统中 TIME_WAIT socket 的全局硬上限,但关键不是“设得越大越好”,而是要结合实际连接模式、内存资源和丢包表现来合理设定。
理解 tcp_max_tw_buckets 的真实作用
这个参数不是“建议值”,而是内核的强制拦截阈值:当当前存活的 TIME_WAIT socket 数量达到该值,内核会静默丢弃所有新进的 SYN 包——客户端收不到 SYN-ACK,服务端日志里也看不到连接建立痕迹,表现为“突然连不上”。它不返回 RST,也不报错,就是彻底忽略。
- 该限制与端口范围、内存大小无关,只看实时 TIME_WAIT 计数
- 不是性能瓶颈的“征兆”,而是连接拒绝的“开关”
- 默认值通常为 32768(不同内核版本略有差异),在高并发短连接场景下极易触达
查看与临时调整方法
先确认当前值和真实占用情况,再动手修改:
- 查当前值:
cat /proc/sys/net/ipv4/tcp_max_tw_buckets - 查真实 TIME_WAIT 数:
ss -s | grep -i "tw"(注意加-o和-n才准确) - 临时调大(重启失效):
echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets - 临时调小(用于测试阈值敏感性):
echo 16384 > /proc/sys/net/ipv4/tcp_max_tw_buckets
永久生效与配置建议
编辑 /etc/sysctl.conf,添加或修改这一行:
然后执行 sysctl -p 加载。但注意:
- 不推荐盲目设到百万级——哈希表查找开销上升,新建连接延迟反而增加
- 262144 是较稳妥的生产常用值,兼顾容量与性能
- 若频繁逼近该值,说明更应优化连接生命周期(如缩短
tcp_fin_timeout或推动客户端主动断连),而非一味扩容
配合其他参数协同优化
单改 tcp_max_tw_buckets 治标不治本。必须同步考虑:
-
net.ipv4.tcp_fin_timeout = 30:让 TIME_WAIT 最多存 30 秒,加速释放 -
net.ipv4.tcp_tw_reuse = 1:仅对本机作为客户端发起连接有效,不能缓解服务端被动关闭产生的 TIME_WAIT -
net.ipv4.ip_local_port_range = 1024 65000:扩大可用端口范围,缓解端口耗尽 - Nginx/Apache 等反向代理层启用
keepalive_timeout或设置Connection: close,把 TIME_WAIT 推给下游客户端











