首页/系统/Linux 内核与性能调优速查/net.ipv4.tcp_congestion_control 拥塞控制
sysctl 内核参数72 条

net.ipv4.tcp_congestion_control 拥塞控制

选择本机新连接使用的拥塞控制算法(默认 cubic);高延迟带一定丢包的长肥管道常改用 bbr 提升吞吐稳定性。

拥塞控制是什么

net.ipv4.tcp_congestion_control 指定本机新建立的 TCP 连接使用哪种拥塞控制算法。算法决定发送方如何根据 ACK、丢包与 RTT 调整拥塞窗口,直接左右吞吐与排队延迟。多数发行版默认 cubic(丢包驱动),高延迟、一定丢包率的长肥管道上常改用以带宽和 RTT 估计驱动的 bbr。该参数只影响新连接,已建立连接沿用创建时的算法。

基本信息

参数net.ipv4.tcp_congestion_control
常见默认值cubic(发行版与内核编译选项不同,以回读为准)
可用清单sysctl net.ipv4.tcp_available_congestion_control
允许集合net.ipv4.tcp_allowed_congestion_control 限制非特权用户可选项
生效范围连接创建时继承,已建立连接不受影响
依赖组件bbr 需要内核模块或内核内置支持,实际部署常搭 fq 队列规则

典型使用场景

  • 跨地域长肥管道:带宽时延积大、有轻微丢包时,cubic 会过度收敛,换 bbr 通常更稳
  • 跨境或移动网络出口:随机丢包较多的链路上希望吞吐不被丢包频繁腰斩
  • 对比压测:在同一链路上切换算法,用同样的并发与时长比较吞吐与 RTT 分布
  • 排障确认:怀疑算法不匹配时先看 ss -ti 里实际生效的算法,再决定是否调整
  • 反向定位:bbr 上线后延迟升高或公平性变差时,需要能快速切回 cubic 验证

启用 BBR

启用 BBR
sysctl net.ipv4.tcp_available_congestion_control   # 先确认内核提供哪些算法
modprobe tcp_bbr                                  # 内核 4.9 起提供;内置时可跳过
lsmod | grep bbr                                  # 确认模块已加载
sysctl -w net.ipv4.tcp_congestion_control=bbr     # 立即生效,作用于新建连接
sysctl -w net.core.default_qdisc=fq                # 配合队列规则,便于分片与 pacing
sysctl net.ipv4.tcp_congestion_control            # 回读确认

验证实际生效

验证实际生效
ss -ti | grep -m3 -E 'bbr|cubic'       # 每行末尾显示该连接使用的算法
ss -ti dst 10.0.0.5                    # 只看与特定对端的连接
nstat -az TcpExtTCPLostRetransmit | tail -1   # 观察重传类计数变化
sysctl -w net.ipv4.tcp_congestion_control=cubic    # 回退对照实验

算法与适用面

算法驱动依据适用与注意
cubic丢包事件驱动,三次函数式窗口增长通用默认值;高 RTT 加少量丢包时吞吐会明显下降
bbr估计瓶颈带宽与最小 RTT 来控制发送速率高延迟长肥管道表现好;极端丢包链路未必优于 cubic
reno经典加性增乘性减兼容与教学场景,高带宽链路上效率低
vegas 等以 RTT 变化为信号内核自带但发行版装载较少,选前先确认可用清单
容器与宿主机共享 network namespace 时,这个参数是全局生效的:在节点上改一次,所有共享该命名空间的容器一起受影响。先在目标命名空间内 sysctl 回读确认,避免在小范围里改了却影响了整机。
换算法属于生产变更,必须用真实链路数据验证:只看单向大文件吞吐会忽略公平性与排队延迟的影响。建议先在一部分节点或一个专线通道上灰度,保留一条可快速切回旧算法的命令。

持久化与回读

持久化与回读
# /etc/sysctl.d/99-net-tuning.conf
net.ipv4.tcp_congestion_control = bbr   # 新建连接使用 bbr
net.core.default_qdisc = fq              # 新建队列规则默认 fq
# 模块若未内置:/etc/modules-load.d/tcp_bbr.conf 内写 tcp_bbr,开机自动加载
同一台机器上不同连接可以跑不同算法:应用能用 setsockopt 的 TCP_CONGESTION 在单条连接上覆盖全局设置,容器与代理组件也可能自行指定。所以排查时以 ss -ti 里每条连接实际显示的算法为准,而不是只看 sysctl 的回读值。

易错点

  • 只改参数不确认模块与内核支持:tcp_available_congestion_control 里没有 bbr 时,写入会被拒绝或无效
  • 以为改了就对已有连接生效:算法在连接创建时确定,长连接服务需要重建连接才能用上新算法
  • 不做回退预案就全网切换:bbr 在部分链路上延迟或公平性表现变差,必须有灰度与快速切回的手段
  • 只看大文件下载速度就下结论:吞吐提升可能以排队延迟为代价,低延迟业务要一起量测
  • 忽略队列规则搭配:bbr 与 fq 的常见组合并非强制,但改 default_qdisc 只影响之后新建的 qdisc,需按设备确认

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/net.rst
  • Linux 内核 Documentation/networking/
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌