Enable BBR on Rocky Linux 9 to use a bandwidth-based TCP congestion-control algorithm with the fq packet scheduler. The change takes about five minutes on a normal VPS, survives reboots, and can be checked without opening a new network port.
Prerequisites
- Rocky Linux 9 with a current 5.14-series kernel or another kernel newer than 4.9.
- SSH access as
root, or a user that can run commands withsudo. - Permission to load kernel modules, change sysctl values, and manage the NetworkManager connection profile. Some unprivileged containers do not allow these operations.
- No domain, web server, extra disk, or special RAM allocation is needed because BBR is a kernel networking setting.
- If you need the server first, start with a Linux VPS from VPSLake and install Rocky Linux 9.
BBR changes how the server estimates the network path and paces TCP packets; it does not increase the bandwidth limit in your VPS plan. The remote peer, route quality, and application still determine the result.
Step 1: Check Rocky Linux and the current TCP settings
Confirm the operating system and running kernel before installing a module so you do not apply a package for a different kernel.
cat /etc/rocky-release
uname -r
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control
The release must identify Rocky Linux 9. A stock installation normally reports a 5.14 kernel, while cubic is commonly the active algorithm. bbr may already appear in the available list if the provider has loaded it.
Rocky Linux release 9.x (...)
5.14.0-...el9...x86_64
net.ipv4.tcp_available_congestion_control = reno cubic
net.ipv4.tcp_congestion_control = cubic
Kernel suffixes and the order of the algorithms vary after updates. Do not replace a working provider kernel just to match this sample.
Step 2: Install and load the BBR module
The kernel must register tcp_bbr before a sysctl can select it, so install the matching extra modules package and load the module for the current boot.
sudo dnf install -y "kernel-modules-extra-$(uname -r)"
sudo modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control
The final command should include bbr:
net.ipv4.tcp_available_congestion_control = reno cubic bbr
If bbr was already listed, modprobe simply confirms that it is ready. BBR is included in Linux kernels that support it, and its pacing works best with the fq scheduler; the BBR project FAQ provides background on the algorithm.
Step 3: Save BBR so it returns after reboot
Put the module request and sysctl values in dedicated files so later kernel updates can load BBR before the setting is applied.
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 tells systemd to load the module at boot. The second selects BBR for new TCP connections and sets fair queueing as the default scheduler; the final command applies both values immediately.
Successful output is:
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
Using /etc/sysctl.d/ instead of appending to the general /etc/sysctl.conf keeps this tuning easy to audit or remove. Rocky Linux follows the compatible RHEL 9 layout for persistent kernel parameters.
Step 4: Apply fq to the active network interface
The default qdisc value affects interfaces created later, but an already-running interface can still have fq_codel; inspect the interface carrying the default route.
MAIN_IFACE=$(ip -o route show default | awk '{print $5; exit}')
printf '%s\n' "$MAIN_IFACE"
tc qdisc show dev "$MAIN_IFACE"
The first command should print a device such as ens3 or eth0. If the last command does not contain qdisc fq, replace the live root queue:
sudo tc qdisc replace dev "$MAIN_IFACE" root fq
tc qdisc show dev "$MAIN_IFACE"
You should now see a line similar to this, with different counters or limits on some VPS plans:
qdisc fq 0: root refcnt 2 limit 10000p buckets 1024
The tc change lasts until the link is recreated or the server reboots. To make the per-interface setting persistent through NetworkManager, identify the active profile and update it:
nmcli -g GENERAL.CONNECTION device show "$MAIN_IFACE"
sudo nmcli connection modify "YOUR_CONNECTION_NAME" tc.qdiscs 'root fq'
Replace YOUR_CONNECTION_NAME with the profile printed by the first command. You can activate the profile immediately with sudo nmcli connection up "YOUR_CONNECTION_NAME", but that may interrupt SSH. Use the VPS control panel console if a brief disconnect would be unsafe. Red Hat documents the temporary and persistent qdisc methods in its RHEL 9 traffic-control guide.
Verify BBR on Rocky Linux 9
Run this check after applying the settings. It confirms the active algorithm, the saved configuration, module availability, and the queue attached to the default-route interface.
MAIN_IFACE=$(ip -o route show default | awk '{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"
Look for tcp_congestion_control = bbr, default_qdisc = fq, bbr in the available list, both lines from 99-rocky-bbr.conf, the line tcp_bbr, and qdisc fq on the active interface. Congestion control is selected when a TCP connection is created, so reconnect SSH or restart the service you are evaluating 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
modprobe: FATAL: Module tcp_bbr not found
The running kernel does not have the matching BBR module installed, or the VPS boots a custom provider kernel. Install the current kernel and extra modules, reboot into that kernel, then repeat Step 2:
sudo dnf install -y kernel kernel-modules-extra
sudo reboot
After reconnecting, check uname -r and run sudo modprobe tcp_bbr. If BBR is still absent, ask the provider for a standard Rocky Linux 9 kernel with BBR support rather than copying a module from another kernel release.
sysctl: cannot set net.ipv4.tcp_congestion_control
The sysctl file was applied before the module registered, or the running kernel does not expose BBR. Load the module, confirm it appears in the available list, 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 list never contains bbr, this is a kernel or module-package problem rather than a typo in the sysctl file.
tc qdisc show still reports fq_codel
net.core.default_qdisc = fq does not necessarily replace the queue already attached to a live interface. Run the Step 4 tc qdisc replace command using the actual default-route device, then save root fq in its active NetworkManager profile if the setting must survive link reactivation.
BBR changes back to cubic after reboot
Check that the module-load file exists and that another sysctl file is not selected later in boot:
grep -RnsE 'tcp_congestion_control|default_qdisc' /etc/sysctl.conf /etc/sysctl.d /usr/lib/sysctl.d 2>/dev/null
sudo modprobe tcp_bbr
sudo sysctl -p /etc/sysctl.d/99-rocky-bbr.conf
Remove or update a later conflicting cubic assignment instead of creating another BBR file. Confirm /etc/modules-load.d/tcp-bbr.conf contains exactly tcp_bbr.
FAQ
Does BBR increase my VPS bandwidth limit?
No. BBR changes TCP congestion control and packet pacing, but it cannot raise the port speed or transfer allowance assigned to the VPS. Test the application and remote destination that matter to you over several transfers.
Does BBR affect UDP applications?
No. The setting in this guide controls IPv4 TCP connections only. UDP programs use their own delivery and rate-control behavior.
Do I need to open a firewall port for BBR?
No. BBR is a kernel feature and does not create a listener, service, or inbound connection. Leave Rocky Linux firewall rules unchanged.
How do I switch back to CUBIC?
Change net.ipv4.tcp_congestion_control = bbr to cubic in /etc/sysctl.d/99-rocky-bbr.conf, then run sudo sysctl -p /etc/sysctl.d/99-rocky-bbr.conf. You can leave tcp_bbr in the module-load file; loading the module does not make it the active algorithm.