必须关闭tcp_slow_start_after_idle,因其默认值1会导致空闲连接重发时拥塞窗口重置为1–4 mss,使千兆带宽下起始吞吐骤降至10kb/s,需多个rtt恢复,严重影响数据库等短突发查询性能。

直接关闭 tcp_slow_start_after_idle 就能有效防止长连接空闲后速率骤降。它不是“优化”而是“禁用一个默认保守行为”,尤其适合数据库、API网关、微服务等使用连接池的稳定内网场景。
为什么必须关掉它
Linux 4.1+ 默认值为 1,意味着只要 TCP 连接空闲超过 1 秒(实际由内核判定),再次发数据时就会把拥塞窗口(cwnd)重置为初始值(通常仅 1–4 个 MSS),强制走慢启动流程。哪怕之前已跑满千兆带宽,空闲几十秒后再查一条语句,起始吞吐可能只有 10KB/s,要等多个 RTT 才能恢复——这对短突发查询极不友好。
如何确认并修改
- 查看当前值:sysctl net.ipv4.tcp_slow_start_after_idle
- 临时生效(立即生效,重启失效):sysctl -w net.ipv4.tcp_slow_start_after_idle=0
- 永久生效:将 net.ipv4.tcp_slow_start_after_idle = 0 写入 /etc/sysctl.conf 或 /etc/sysctl.d/99-mysql-tune.conf,再执行 sysctl -p
注意事项
- 该参数只影响已建立连接的空闲恢复行为,不影响新建连接的初始 cwnd
- 仅在稳定网络中推荐设为 0,比如同机房 MySQL 主从、ProxySQL 转发、K8s Pod 间通信;公网或蜂窝网络慎用
- 无需重启 MySQL 或应用,新建立的连接或重连后的连接即可受益
- 搭配 tcp_congestion_control=bbr 效果更稳,尤其跨可用区同步场景











