首页/系统/Linux 内核与性能调优速查/net.ipv4.tcp_rto_min / tcp_rto_max
网络栈调优98 条

net.ipv4.tcp_rto_min / tcp_rto_max

RTO(重传超时)的上下限:默认下限 200ms、上限 120s;内核按 RTT 计算实际值并在区间内收缩。

什么是 RTO 上下限

RTO(Retransmission Timeout)是内核等待确认的超时值,它由 RTT 测量值动态推导,并受两个参数约束:tcp_rto_min 是下限(默认 200 毫秒),tcp_rto_max 是上限(默认 120 秒)。下限决定最快多久开始重传,上限决定退避能拉多长。它们属于专家级微调项,正常场景保持默认并改善链路质量,比改参数更能解决重传问题。

基本信息

参数路径net.ipv4.tcp_rto_min / net.ipv4.tcp_rto_max
默认值200ms / 120s
推导依据基于 RTT 与 RTT 方差的平滑估算
相关参数tcp_retries1/2、tcp_syn_retries、tcp_frto
生效范围内核全局,新连接生效
观测ss -tin 的 rto、rtt 字段

典型使用场景

  • 内网低延迟环境:评估是否因 RTO 下限过大导致故障感知偏慢
  • 弱网链路:确认重传退避是否拉得过长,影响恢复时间
  • 连接级排查:从 ss 读出实际 rto/rtt 值,与链路特征对比
  • 与其他重传参数联合评估,避免只改一项造成行为不一致
  • 理解内核行为以解释抓包里的重传间隔规律

查看与观测

查看与观测
sysctl net.ipv4.tcp_rto_min net.ipv4.tcp_rto_max 2>/dev/null
# 部分内核不导出这两个键,此时以 ss 观测实际值为准
ss -tin state established | head -4            # 关注 rto 与 rtt 字段
ss -tin | grep -m3 -o 'rto:[0-9]*'             # 单连接当前的 RTO
ss -tin | grep -m3 -o 'rtt:[0-9.]*/[0-9.]*'    # 平滑 RTT 与方差
nstat -az 2>/dev/null | grep -i 'timeout' | head

判读要点

观测值正常表现异常表现
rto随 RTT 稳定在小范围持续贴上限说明链路极不稳定
rtt与物理链路特征相符远高于预期可能是排队或跨区绕行
重传间隔按退避规律递增无规律或过密提示中间设备异常
超时次数低频偶发集中出现说明存在持续丢包
不同内核版本对这两个 sysctl 键的导出情况不同,读不到不代表参数不存在;用 ss -tin 观察实际 rto 值更直接,也避免依赖特定版本的行为。
把 RTO 下限调得过小会抬高无效重传的数量与带宽浪费,在本来就丢包的链路上会进一步恶化表现。
调参前先确认重传的真实成因:抓包与 nstat 计数可以区分链路丢包、重复报文与伪重传,三种情况的处置方向完全不同。

易错点

  • 把下限调得过小会抬高无效重传,反而恶化弱网链路,退避机制被绕过后更难恢复
  • 该组参数属于专家级微调,一般保持默认并优先改善链路质量,无序调整会掩盖真实问题
  • 只看参数不看 ss 实测值,无法判断内核当前实际使用的 RTO 是多少
  • 在部分内核上 sysctl 读不到这两个键,误判为系统异常;应以连接级实测值为准

数据来源与参考

  • Linux 内核 Documentation/networking/
  • Linux 内核源码 net/ipv4/tcp_input.c
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌