How to Enable BBR on CentOS Stream 10 (Step-by-Step)

Enable BBR on CentOS Stream 10 with persistent kernel settings, fq queueing, live verification, and fixes for missing modules and qdisc errors.
A cyan network path arcs around a server rack and glowing speed gauge on a midnight-blue background.

Enable BBR on CentOS Stream 10 to give new TCP connections a bandwidth-aware congestion-control algorithm and the fq packet scheduler. You can apply the settings immediately and make them survive a reboot in about five minutes, without opening a new firewall port.

Prerequisites

  • A CentOS Stream 10 VPS with a current 6.12-series kernel, or another kernel newer than 4.9.
  • SSH access as root, or a normal user with working sudo privileges.
  • Permission to load kernel modules and write configuration files below /etc; a restricted container may not provide either capability.
  • No domain, web server, extra RAM, or extra disk space is required because BBR is a kernel-level TCP setting.
  • If you need the server first, use a Linux VPS from VPSLake and install CentOS Stream 10.

BBR changes how TCP estimates a path and paces packets. It cannot increase the bandwidth limit on your plan, and its effect depends on the route, the remote peer, and the workload.

Step 1: Confirm CentOS Stream 10 and inspect the current TCP settings

Check the release and running kernel before changing sysctl values so you do not tune a different operating system or an unexpected provider kernel.

cat /etc/centos-release
uname -r
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control

The release line should identify CentOS Stream 10. A normal installation uses a 6.12-series kernel, while the current algorithm is commonly cubic; BBR may or may not appear in the available list yet.

CentOS Stream release 10 (Coughlan)
6.12.0-...el10_...x86_64
net.ipv4.tcp_available_congestion_control = reno cubic
net.ipv4.tcp_congestion_control = cubic

Patch numbers and the available algorithm list vary with updates and the provider kernel. Do not change the kernel just to reproduce the sample output.

Step 2: Load BBR into the running kernel

Load the module before selecting BBR so the sysctl command can find the algorithm during this boot.

sudo modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control

The second command should now include bbr:

net.ipv4.tcp_available_congestion_control = reno cubic bbr

If BBR was already listed, modprobe simply confirms that the module can be used. The module may not appear in lsmod on every kernel build, so the available-algorithm check is the important result.

Step 3: Save BBR and fq for future boots

Use separate configuration files so the change is easy to audit or remove without overwriting unrelated system tuning.

sudo tee /etc/modules-load.d/tcp-bbr.conf >/dev/null <<'EOF'
tcp_bbr
EOF
sudo tee /etc/sysctl.d/90-tcp-bbr.conf >/dev/null <<'EOF'
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
sudo sysctl -p /etc/sysctl.d/90-tcp-bbr.conf

The modules-load file requests tcp_bbr at boot. The sysctl file selects BBR for new TCP connections and sets fair queueing as the default scheduler; the final command applies both values now.

Expected output:

net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

CentOS Stream follows the Red Hat layout for runtime kernel parameters; see Red Hat’s RHEL 10 kernel-parameter documentation for the /etc/sysctl.d/ approach.

Step 4: Apply fq to the interface carrying VPS traffic

net.core.default_qdisc controls the default for interfaces created later, but an interface that is already up can retain its previous queueing discipline.

MAIN_IFACE=$(ip route show default | awk '/^default/ {print $5; exit}')
printf '%s\n' "$MAIN_IFACE"
tc qdisc show dev "$MAIN_IFACE"

The first line should print the interface used by the default route, such as ens3 or eth0. If the qdisc output shows fq_codel or another root scheduler, replace it for the current boot:

MAIN_IFACE=$(ip route show default | awk '/^default/ {print $5; exit}')
sudo tc qdisc replace dev "$MAIN_IFACE" root fq
tc qdisc show dev "$MAIN_IFACE"

A successful result contains qdisc fq:

ens3
qdisc fq 0: root refcnt 2 limit 10000p buckets 1024

The device name and queue details vary. This tc change can be lost when the interface is recreated or the server reboots. To store the per-interface setting in NetworkManager, identify the active connection and modify that profile:

nmcli connection show --active
sudo nmcli connection modify "YOUR_CONNECTION_NAME" tc.qdiscs "root fq"
sudo nmcli connection up "YOUR_CONNECTION_NAME"

Replace YOUR_CONNECTION_NAME with the profile name shown by the first command. Bringing the profile up can briefly interrupt SSH, so use the VPS control panel’s console if you cannot risk losing the session. Red Hat’s RHEL 10 traffic-control documentation covers the tc and NetworkManager qdisc model.

Verify BBR on CentOS Stream 10

Run these checks after the settings have been applied. They confirm the active algorithm, the saved values, BBR availability, and the scheduler on the main interface.

MAIN_IFACE=$(ip route show default | awk '/^default/ {print $5; exit}')
sysctl net.ipv4.tcp_congestion_control net.core.default_qdisc
sysctl net.ipv4.tcp_available_congestion_control
grep -Ev '^[[:space:]]*(#|$)' /etc/sysctl.d/90-tcp-bbr.conf
tc qdisc show dev "$MAIN_IFACE"

Look for tcp_congestion_control = bbr, default_qdisc = fq, bbr in the available list, both lines from 90-tcp-bbr.conf, and qdisc fq on the active device. These values affect new TCP connections, so reconnect SSH clients or restart long-lived services before comparing network behavior.

Troubleshooting

modprobe: FATAL: Module tcp_bbr not found

The running kernel does not expose the BBR module, or its matching module package is missing. Install the extra modules package, reboot into the newest installed CentOS Stream kernel, and try again:

sudo dnf install -y kernel-modules-extra
sudo reboot

After reconnecting, run Step 2. If DNF cannot provide a package for the running kernel, the VPS may be using a provider-managed custom kernel; ask the provider for a standard CentOS Stream 10 kernel with BBR support.

sysctl: cannot set net.ipv4.tcp_congestion_control

The sysctl file was loaded before BBR became available. Load the module, confirm that bbr appears in the available list, and apply the file again:

sudo modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control
sudo sysctl -p /etc/sysctl.d/90-tcp-bbr.conf

If the error returns after every reboot, check that /etc/modules-load.d/tcp-bbr.conf contains exactly tcp_bbr.

tc qdisc show still reports fq_codel

The default scheduler setting does not replace the qdisc already attached to an existing interface. Run the tc qdisc replace command in Step 4 using the actual default-route interface, then save root fq in the active NetworkManager profile if it must survive link reactivation.

BBR works until the next reboot

Check both configuration files and confirm that the rebooted system is using the same kernel family shown by uname -r. Reload the module and sysctl file manually; if the module still disappears, the provider kernel may not support automatic loading.

FAQ

Does BBR increase the bandwidth of my VPS?

No. BBR changes TCP pacing and capacity estimation, but it cannot raise the plan’s network limit or make a slow remote peer send faster. Judge the result with the application and routes you actually use.

Does BBR change UDP traffic?

No. net.ipv4.tcp_congestion_control applies to TCP. UDP applications need their own rate and congestion-control behavior, so enabling BBR does not tune them.

Do I need to reboot after enabling BBR?

No reboot is required when modprobe and sysctl -p succeed; the running kernel changes immediately. The files under /etc/modules-load.d/ and /etc/sysctl.d/ make the configuration available after a later reboot.

How do I switch back to CUBIC?

Edit /etc/sysctl.d/90-tcp-bbr.conf, change the congestion-control value to cubic, and run sudo sysctl -p /etc/sysctl.d/90-tcp-bbr.conf. You can leave the module-load file in place because loading tcp_bbr does not select it as the active algorithm.

Samrat Ghosh
Written by

Samrat Ghosh

Founder & Infrastructure Engineer

Samrat Ghosh is the founder of VPSLake, where he builds and runs the remote desktop and VPS hosting infrastructure the company is built on. He writes hands-on guides about RDP, Windows Server, VPS management and secure remote access - the practical documentation he wishes had…

Previous Article

DDoS Protected Dedicated Server: What It Covers

Next Article

Keep Programs Running After Closing RDP: Safe Steps

Write a Comment

Leave a Comment

Your email address will not be published. Required fields are marked *

Subscribe to our Newsletter

Subscribe to our email newsletter to get the latest posts delivered right to your email.
Pure inspiration, zero spam ✨