net.ipv4.tcp_rto_min是linux内核≥4.10支持的tcp重传超时下限参数(毫秒),默认200ms,在rtt

net.ipv4.tcp_rto_min 是一个真实存在、被主流 Linux 内核(≥ 4.10,尤其在 5.x/6.x 中稳定支持)所接纳的调优参数,用于设定 TCP 重传超时(RTO)的下限值(单位:毫秒)。它对内网低延迟、高可靠场景(如微服务间通信、数据库主从同步、RPC 调用)非常关键——默认值通常为 200ms,但在 RTT 稳定在 0.2–1ms 的千兆/万兆内网中,这个下限明显偏高,会导致小包丢包后重传过慢,人为拉长响应延迟。
下面直接讲清楚怎么用、为什么调、调多少才合适:
✅ 明确作用:控制最小重传等待时间
TCP 的 RTO 会根据实测 RTT 动态计算(典型公式为 RTO = RTT + 4×RTTVAR),但不会低于 tcp_rto_min。也就是说:
- 即使你网络 RTT 只有 0.3ms,RTO 也不会低于你设的
tcp_rto_min; - 设太小(如 1ms)可能引发误重传(噪声、调度抖动被当成丢包);
- 设太大(如保持默认 200ms)则在内网丢包时“干等”太久,小流延迟飙升。
? 正确设置方法(内网推荐值)
内网环境(交换机直连、无公网路由、RTT
-
net.ipv4.tcp_rto_min = 5(单位毫秒)——适合万兆+低延迟交换环境 -
net.ipv4.tcp_rto_min = 10——适合千兆骨干、普通数据中心内网 - 不建议低于 3ms,内核底层计时器精度和调度延迟会使其失效甚至反效果
执行命令(临时生效):
sudo sysctl -w net.ipv4.tcp_rto_min=10
永久生效(写入配置):
echo 'net.ipv4.tcp_rto_min = 10' | sudo tee -a /etc/sysctl.conf sudo sysctl -p
⚠️ 配套必须检查的参数(单独调 rto_min 效果有限)
仅改 tcp_rto_min 不够,需确保以下基础机制正常工作:
-
net.ipv4.tcp_sack = 1:启用选择性确认,精准定位丢包位置,避免整段重传 -
net.ipv4.tcp_dsack = 1:检测重复包,辅助判断是否是虚假超时 -
net.ipv4.tcp_frto = 2:启用 F-RTO 算法,在超时后快速判断是否真丢包,减少冗余重传 -
net.ipv4.tcp_slow_start_after_idle = 0:防止空闲后 cwnd 归零,维持小流发送节奏
这些可一并加入 /etc/sysctl.conf:
net.ipv4.tcp_sack = 1 net.ipv4.tcp_dsack = 1 net.ipv4.tcp_frto = 2 net.ipv4.tcp_slow_start_after_idle = 0
? 验证是否生效
-
查看当前值:
sysctl net.ipv4.tcp_rto_min
-
抓包观察实际 RTO 行为(需主动制造单包丢弃,例如用
tc):# 在客户端侧丢第 3 个 SYN 后的数据包(模拟轻度丢包) tc qdisc add dev eth0 root netem loss 0.1% 50% # 然后用 curl 或 telnet 测试连接建立/小请求,用 wireshark 观察重传间隔
-
检查连接级 RTO(需已建立连接):
ss -i sport = :8080 # 查看某端口连接的 rto 值(单位毫秒,ss 输出中的 rto=xxx)
不复杂但容易忽略











