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 withsudo. - 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.