拥塞控制换到 BBR 的一次对照记录

2026-10-11 · 网络

同一条链路,同一台机器,只换拥塞控制算法,吞吐能差一个量级——前提是链路上确实有丢包。

先量清楚再动手

三步:单程时延(ping 只给 RTT)、丢包率(mtr 看逐跳)、以及 接收端的实际吞吐。三者缺一不可,只盯着 iperf3 的数字容易得出错误结论。

sysctl net.ipv4.tcp_congestion_control net.core.default_qdisc
# net.ipv4.tcp_congestion_control = cubic
# net.core.default_qdisc = fq

切换与验证

modprobe tcp_bbr
cat >> /etc/sysctl.d/99-bbr.conf <<'EOF'
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
sysctl --system

注意 default_qdisc 要设成 fq:BBR 依赖 pacing,而 pacing 由 qdisc 提供。 配成 fq_codel 也能跑,但吞吐曲线会抖。

结果与边界

对照测试里,链路 0.2% 丢包、RTT 30 ms 左右时,BBR 的吞吐大约是 cubic 的 3–4 倍; 把丢包降到接近 0 之后,两者差距基本消失。也就是说 BBR 治的是丢包带来的吞吐塌陷, 不是“更快的魔法”。

如果换完之后没变化,先怀疑三件事:算法没真的生效(看 ss -ti)、 瓶颈在别处的队列(网卡/tc)、或者链路上根本没有可感知的丢包。

另外,BBR 的公平性在共享瓶颈上不如 cubic,如果这条链路还要跑实时业务,最好先小流量灰度。