拥塞控制是什么
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 的回读值。