I run a box that forwards a lot of long-fat-network traffic. Default cubic was leaving throughput on the table over high-RTT paths, so I moved to BBR. Notes to my future self.
Enabling it
cat >/etc/sysctl.d/99-net.conf <<'EOF'
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
sysctl --system
sysctl net.ipv4.tcp_congestion_control # => bbr
The fq qdisc matters: BBR paces packets and leans on fair-queuing to do it well.
What actually changed
On a ~150 ms path with mild loss, single-stream throughput went from ~18 Mbit/s to ~90+. BBR models the bottleneck bandwidth and min-RTT instead of treating every lost packet as congestion, so it doesn’t collapse on the first drop. The trade-off: it can be unfair to cubic flows sharing the same queue, so I wouldn’t deploy it blindly on a shared uplink.
The gotcha
fq paces everything, including high-rate UDP. If you push bursty UDP from the same host — say a QUIC server or a game backend — fair-queue pacing can throttle it in ways you didn’t intend. For those flows I move them to a separate interface or a different qdisc. As always: measure, don’t assume.