首页/系统/Linux 内核与性能调优速查/net.ipv4.tcp_slow_start_after_idle 空闲后慢启动
sysctl 内核参数72 条

net.ipv4.tcp_slow_start_after_idle 空闲后慢启动

默认开启(1):连接空闲超过 RTO 后拥塞窗口重置并重新慢启动,长肥管道上的长连接会因此吞吐骤降。

空闲后慢启动是什么

net.ipv4.tcp_slow_start_after_idle 默认开启(值为 1):当一条连接空闲时间超过重传超时后,发送方会把拥塞窗口重置到初始值,重新走一遍慢启动过程。这在互联网早期是必要的自我约束,因为空闲期间路径状况可能已经变化。但对跨机房的长连接来说,这种重置会让每次闲置后的第一批请求都要重新爬坡,表现为「长连接偶尔变慢」,例如整点触发的定时批量调用。

基本信息

参数net.ipv4.tcp_slow_start_after_idle
默认值1(空闲后重新慢启动)
触发条件连接空闲时间超过重传超时量级
影响对象新建立的连接与已建立的连接都适用,全局生效
适用倾向跨机房长连接、突发型接口服务可评估关闭
观测方式ss -ti 观察空闲前后的拥塞窗口变化

典型使用场景

  • 长连接偶发变慢:接口平时很快,闲置一段时间后第一批请求延迟明显
  • 定时任务批量调用:整点触发时所有连接都在爬坡,整体耗时拉长
  • 跨机房数据同步:链路上 RTT 大,慢启动爬坡的代价被放大
  • 压测与容量评估:空闲期会干扰压测结果的稳定性
  • 排障对照:临时关闭后对比同样场景的延迟分布,判断是否与该行为相关

查看与调整

查看与调整
sysctl net.ipv4.tcp_slow_start_after_idle      # 读当前设置
ss -ti | grep -m3 -E 'cwnd|ssthresh'           # 观察拥塞窗口与慢启动阈值
sysctl -w net.ipv4.tcp_slow_start_after_idle=0 # 临时关闭空闲重置
ss -ti state established '( dport = :8080 )' | head   # 针对特定目标的连接观察
ss -o state established | head                 # 一并看连接计时器

落盘与回读

落盘与回读
# /etc/sysctl.d/99-net-tuning.conf
net.ipv4.tcp_slow_start_after_idle = 0    # 关闭空闲后的窗口重置
# 回读命令:sysctl net.ipv4.tcp_slow_start_after_idle

判断线索

现象指向验证方式
闲置后第一批请求变慢拥塞窗口被重置对比空闲前后 ss -ti 的 cwnd 值
持续传输无异常与空闲无关问题在别处,勿归因于该参数
多个目标同时出现本机全局设置核对本机参数与链路 RTT
只有个别场出现业务调用模式差异按调用间隔分组统计延迟
关闭之后,空闲连接恢复发送时会直接沿用之前的窗口,行为更激进。它适合网络条件相对可控的内网与专线环境;在公网链路上,这一改动会让发送侧对路径变化的适应更迟钝,需要结合实际数据评估。
修改是全局的,影响所有新连接,包括那些不希望更激进的对端。建议先在一小组节点上验证,用延迟分布与重传率两项数据对比,确认收益后再推广。

易错点

  • 把长连接偶发变慢归因到应用或数据库:先看 ss -ti 在空闲前后的 cwnd 是否回到初始值,方向错了会白忙
  • 全局关闭却不做灰度:所有新连接都更激进,公网链路上的重传与丢包可能上升
  • 只看参数不看数据:用延迟分布与重传计数做前后对比,才有可信结论
  • 忽略业务调用间隔:间隔与重置条件的关系决定影响大小,应按真实调用模式分析
  • 在跨机房链路上照搬内网结论:RTT 越大慢启动爬坡代价越明显,取值需要重新评估

数据来源与参考

  • Linux 内核 Documentation/networking/ip-sysctl.rst
  • RFC 5681(TCP 拥塞控制)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌