Enable BBR on Rocky Linux 8 to use a modern TCP congestion-control algorithm with the fq packet scheduler. You can apply it to a fresh VPS in about five minutes, keep the setting after reboots, and confirm the queue attached to the live network interface.
Prerequisites
- A Rocky Linux 8 VPS, preferably fully updated, with a 4.9 or newer kernel. Rocky Linux 8 normally uses a 4.18-series kernel.
- SSH access as
root, or a normal account with workingsudoprivileges. - Permission to install kernel packages, load modules, write under
/etc, and change the network queueing discipline. An unprivileged container may not allow these operations. - No domain, web server, extra RAM, or extra disk is needed because BBR is a kernel-level TCP setting.
- If you need the server first, use a Linux VPS from VPSLake and install Rocky Linux 8.
BBR changes how TCP estimates available capacity and paces packets; it does not raise your VPS plan’s bandwidth limit. Your route, the remote peer, and the application determine whether it helps.
Step 1: Confirm Rocky Linux 8 and inspect the current TCP state
Identify the release and running kernel before installing a module so you do not mix packages for a different image or kernel.
cat /etc/rocky-release
uname -r
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control
The release should identify Rocky Linux 8, and the kernel should normally begin with 4.18. A typical installation starts with cubic; BBR may already be listed if the matching module is present.
Rocky Linux release 8.10 (Green Obsidian)
4.18.0-...el8_...x86_64
net.ipv4.tcp_available_congestion_control = reno cubic
net.ipv4.tcp_congestion_control = cubic
Minor versions, kernel suffixes, and the algorithm order vary. Keep the provider’s newer kernel if it is working; the important checks are that it is at least 4.9 and exposes BBR.
Step 2: Install and load the Rocky Linux BBR module
On the EL8 kernel, BBR can be supplied by the extra kernel modules package. Install the package that matches the kernel currently running, then load tcp_bbr before selecting it.
sudo dnf install -y "kernel-modules-extra-$(uname -r)"
sudo modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control
The final command should contain bbr:
net.ipv4.tcp_available_congestion_control = reno cubic bbr
If BBR was already available, the install confirms the module package and modprobe simply leaves the module ready. Using the exact running-kernel package avoids installing modules that cannot be used until a later reboot.
Step 3: Save BBR settings for future boots
Keep the module request and sysctl values in small, separate files so Rocky Linux can restore both pieces 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/99-rocky-bbr.conf >/dev/null <<'EOF'
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
sudo sysctl -p /etc/sysctl.d/99-rocky-bbr.conf
The first file asks the boot-time module loader to prepare BBR. The second selects BBR for new TCP connections and makes fq the default queueing discipline; the final command applies the two values immediately.
Successful output is:
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
The RHEL 8 networking documentation explains the BBR support in the compatible kernel, and Rocky Linux 8 follows the same configuration layout.
Step 4: Put fq on the interface already carrying traffic
Changing net.core.default_qdisc affects interfaces initialized later; inspect the existing default-route interface and replace its current root queue if it still uses fq_codel.
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 an interface such as ens3 or eth0. If the last command does not show qdisc fq, apply fq for the current boot:
sudo tc qdisc replace dev "$MAIN_IFACE" root fq
tc qdisc show dev "$MAIN_IFACE"
Look for a result containing qdisc fq:
ens3
qdisc fq 0: root refcnt 2 limit 10000p buckets 1024
To retain the per-interface queue when NetworkManager recreates the link, identify the active profile and save root fq there:
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. The final command can briefly interrupt SSH, so use the VPS control panel console or schedule this change during maintenance if the connection cannot drop.
Red Hat’s RHEL 8 traffic-control guide documents the temporary tc method and the persistent NetworkManager profile option.
Verify BBR on Rocky Linux 8
Run the complete check after the settings are applied. It confirms the active algorithm, saved files, module availability, and queue on the interface used by the default route.
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/99-rocky-bbr.conf
grep -Fx 'tcp_bbr' /etc/modules-load.d/tcp-bbr.conf
tc qdisc show dev "$MAIN_IFACE"
You want tcp_congestion_control = bbr, default_qdisc = fq, bbr in the available list, both assignments from 99-rocky-bbr.conf, the line tcp_bbr, and qdisc fq on the active device. These values apply to new TCP connections, so reconnect SSH or restart a long-running service before comparing traffic.
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
net.ipv4.tcp_available_congestion_control = reno cubic bbr
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
tcp_bbr
qdisc fq 0: root refcnt 2 limit 10000p buckets 1024
Troubleshooting
No match for argument: kernel-modules-extra-...
The repository metadata may not contain a module package for the older kernel currently booted, or the VPS may use a provider-built kernel. Install the generic package, reboot into the newest Rocky kernel, and retry Step 2:
sudo dnf install -y kernel-modules-extra
sudo reboot
After reconnecting, run uname -r, then sudo modprobe tcp_bbr. If the module is still unavailable, ask the provider for a standard Rocky Linux 8 kernel with BBR support instead of forcing an unrelated module package.
modprobe: FATAL: Module tcp_bbr not found
The running kernel still cannot see the BBR module. Check the available algorithms first; if bbr is absent, confirm that the kernel-modules-extra package matches uname -r, then reboot into the kernel for which it was installed.
rpm -q "kernel-modules-extra-$(uname -r)"
sysctl net.ipv4.tcp_available_congestion_control
sysctl: cannot set net.ipv4.tcp_congestion_control
The sysctl file was applied before BBR was registered. Load the module, verify that bbr appears, and apply the dedicated file again:
sudo modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control
sudo sysctl -p /etc/sysctl.d/99-rocky-bbr.conf
If the error returns after a reboot, check that /etc/modules-load.d/tcp-bbr.conf contains exactly tcp_bbr and that the file name has not been replaced by another image-management tool.
tc qdisc show still reports fq_codel
The default qdisc value does not replace the queue already attached to an existing interface. Repeat Step 4 with the real default-route device; if it changes back after a NetworkManager restart, save root fq in the active connection profile. If tc itself is missing, install the Rocky Linux iproute package first:
sudo dnf install -y iproute
FAQ
Does BBR require a firewall rule?
No. BBR changes TCP behavior inside the kernel and does not create a listening service or open an inbound port. Leave your existing SSH and application firewall rules as they are.
Why must the queue be fq instead of fq_codel?
BBR paces packets, and fq is designed to work with that pacing model. Rocky’s BBR guidance recommends explicitly using fq; setting the default alone may not change a queue already attached to a live interface.
Does BBR tune UDP traffic too?
No. net.ipv4.tcp_congestion_control applies only to TCP. UDP applications need their own rate-control behavior, so enabling BBR does not change their packet handling.
Can I return to CUBIC without rebooting?
Yes. Change the congestion-control value in /etc/sysctl.d/99-rocky-bbr.conf to cubic, then run sudo sysctl -p /etc/sysctl.d/99-rocky-bbr.conf. You can leave tcp_bbr in the modules-load file because loading the module does not make it the active algorithm.