How to Enable BBR on AlmaLinux 9 (Step-by-Step)

Learn how to enable bbr on almalinux 9, persist TCP settings after reboot, inspect the live qdisc, and fix common kernel and SSH errors on your VPS.
A luminous blue network route curves around a server rack and cyan speed gauge on a midnight-blue background.

Enable BBR on AlmaLinux 9 to give new TCP connections a modern congestion-control algorithm and the fq packet scheduler. You can apply the change without opening a port, then make it persistent in roughly five minutes.

Prerequisites

  • AlmaLinux 9 on a VPS, running a 5.14-series kernel or another kernel newer than 4.9.
  • SSH access as root, or a normal account that can run commands with sudo.
  • Permission to load kernel modules and create files under /etc; an unprivileged container may not allow either operation.
  • No domain, web server, extra RAM, or extra disk is required because BBR is a kernel TCP setting.
  • If you need the server first, choose a Linux VPS from VPSLake and install AlmaLinux 9.

BBR does not raise the bandwidth limit on your VPS. It changes how TCP estimates the path and paces packets, so the result depends on the route, the remote peer, and the application.

Step 1: Confirm AlmaLinux 9 and inspect TCP

Check the release and running kernel before changing sysctl values so you know the commands are being applied to the expected operating system.

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

The first line should identify AlmaLinux 9. The kernel should normally begin with 5.14, although the complete suffix changes with updates. A typical server starts with cubic; bbr may already be listed if the provider’s kernel exposes it.

AlmaLinux release 9.x (Turquoise Kodkod)
5.14.0-...el9_...x86_64
net.ipv4.tcp_available_congestion_control = reno cubic
net.ipv4.tcp_congestion_control = cubic

The release codename and available algorithms can differ between minor updates. Do not change the kernel just to reproduce the sample output.

Step 2: Make BBR available to the running kernel

BBR must be available before the sysctl can select it; on systems where it is a loadable module, modprobe activates it for the current boot.

sudo modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control

Confirm that the last line contains bbr:

net.ipv4.tcp_available_congestion_control = reno cubic bbr

If bbr was already in the list, the modprobe command simply leaves the existing support ready. Do not treat the absence of a tcp_bbr line in lsmod as failure: some kernels can provide the algorithm without exposing it as a separately listed module.

Step 3: Save the BBR settings

Keep the settings in a dedicated file so they are easy to audit or remove without changing unrelated kernel 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 first file asks systemd to load BBR during later boots. The second selects BBR for TCP and sets fq as the default queueing discipline, while the final command applies both values immediately.

Successful output looks like this:

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

The RHEL 9 kernel-parameter guide documents the /etc/sysctl.d/ approach used by AlmaLinux’s compatible user space.

Step 4: Check and, if needed, replace the live qdisc

Changing net.core.default_qdisc sets the default for interfaces created later; tc tells you which queueing discipline is attached to the interface that is already carrying traffic.

ip route show default
tc qdisc show

Find the device named after dev on the default route and check its qdisc. On EL9, fq_codel is common even after the default value changes. If the active device is ens3, replace YOUR_INTERFACE with ens3 in this command:

sudo tc qdisc replace dev YOUR_INTERFACE root fq
tc qdisc show dev YOUR_INTERFACE

The second command should contain qdisc fq:

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

This runtime change is lost when the interface is recreated or the server reboots. To store it in the NetworkManager connection profile, first identify the active 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 printed by the first command. Reconnecting the profile can briefly interrupt SSH, so use the VPS control panel console if you cannot risk losing the session. Red Hat’s RHEL 9 traffic-control guide covers the tc and NetworkManager qdisc methods.

Verify BBR on AlmaLinux 9

Run the checks below after reconnecting SSH or restarting a long-lived service. They confirm the active TCP algorithm, the saved file, 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"

You want tcp_congestion_control = bbr, default_qdisc = fq, bbr in the available list, both lines from 90-tcp-bbr.conf, and qdisc fq for the interface. These controls affect TCP behavior, but enabling them alone is not a guarantee of faster traffic.

Troubleshooting

modprobe: FATAL: Module tcp_bbr not found

The running kernel does not include the BBR module, or its matching module package is missing. Check whether the algorithm is already available with sysctl net.ipv4.tcp_available_congestion_control; if bbr is absent, install the matching extra kernel modules and reboot into the newest installed AlmaLinux kernel:

sudo dnf install -y kernel-modules-extra-$(uname -r)
sudo reboot

After reconnecting, run Step 2 again. If DNF cannot find a matching package, the VPS may be using a provider-managed custom kernel; ask the provider for a standard AlmaLinux 9 kernel with BBR support rather than forcing an unrelated kernel package.

sysctl: cannot set net.ipv4.tcp_congestion_control

The sysctl file was read before BBR became available, or the running kernel does not support it. Run sudo modprobe tcp_bbr, confirm that bbr appears in the available list, and reload the file:

sudo sysctl -p /etc/sysctl.d/90-tcp-bbr.conf

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

tc qdisc show still reports fq_codel

The default qdisc value does not necessarily replace the qdisc already attached to an existing interface. Apply tc qdisc replace from Step 4 with the real interface name, then save root fq in the active NetworkManager profile if it must survive link reactivation.

SSH disconnects after nmcli connection up

Bringing the profile up temporarily drops the network path used by your SSH session. Wait for the connection to return, reconnect, and verify with tc; for a remote server where interruption is unacceptable, make the profile change through the VPS control panel console.

FAQ

Will BBR improve every download or website?

No. BBR changes the sender’s TCP behavior, but the peer, route, server limits, and file size still control the result. Compare the actual service over several runs instead of assuming that a single speed test proves a benefit.

Does BBR change existing TCP connections?

The setting is used when TCP connections are created. Reconnect SSH clients and restart persistent services before evaluating the change; already-open sessions may continue with their original congestion-control state.

Is a firewall rule required for BBR?

No. BBR does not create a listening service or add an inbound port, so there is no new firewall rule to allow. Keep your existing SSH and application firewall policy unchanged.

How do I undo the change?

Remove the two BBR lines from /etc/sysctl.d/90-tcp-bbr.conf, or change the congestion-control value to cubic, then run sudo sysctl -p /etc/sysctl.d/90-tcp-bbr.conf. Remove /etc/modules-load.d/tcp-bbr.conf only if you no longer want the module loaded automatically at boot.

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

How to Enable BBR on AlmaLinux 8 (Step-by-Step)

Next Article

DDoS Protected Dedicated Server: What It Covers

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 ✨