空闲后慢启动是什么
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 |
| 只有个别场出现 | 业务调用模式差异 | 按调用间隔分组统计延迟 |
关闭之后,空闲连接恢复发送时会直接沿用之前的窗口,行为更激进。它适合网络条件相对可控的内网与专线环境;在公网链路上,这一改动会让发送侧对路径变化的适应更迟钝,需要结合实际数据评估。
修改是全局的,影响所有新连接,包括那些不希望更激进的对端。建议先在一小组节点上验证,用延迟分布与重传率两项数据对比,确认收益后再推广。