{"id":961,"date":"2026-10-30T09:00:00","date_gmt":"2026-10-30T09:00:00","guid":{"rendered":"https:\/\/vpslake.com\/blog\/?p=961"},"modified":"2026-10-30T09:00:00","modified_gmt":"2026-10-30T09:00:00","slug":"enable-bbr-almalinux-8","status":"publish","type":"post","link":"https:\/\/vpslake.com\/blog\/2026\/10\/30\/enable-bbr-almalinux-8\/","title":{"rendered":"How to Enable BBR on AlmaLinux 8 (Step-by-Step)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Enable BBR on AlmaLinux 8 to use a modern TCP congestion-control algorithm with the <code>fq<\/code> packet scheduler. The change takes about five minutes, applies without opening a new firewall port, and can be made persistent across reboots.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>An AlmaLinux 8 VPS with a 4.9 or newer kernel; the standard AlmaLinux 8 kernel is in the 4.18 series.<\/li>\n\n\n<li>SSH access as <code>root<\/code>, or a normal account with working <code>sudo<\/code> privileges.<\/li>\n\n\n<li>Permission to load kernel modules and write under <code>\/etc<\/code>; a restricted container may not provide either capability.<\/li>\n\n\n<li>No domain, web server, extra RAM, or extra disk space is required because BBR is a kernel networking setting.<\/li>\n\n\n<li>If you need a server, start with a <a href=\"https:\/\/vpslake.com\/buy-vps\">Linux VPS from VPSLake<\/a> and install AlmaLinux 8.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">BBR controls how TCP sends traffic; it does not increase your VPS plan\u2019s bandwidth limit. Its effect depends on the route, the remote peer, and the application using TCP.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Confirm the release, kernel, and current algorithm<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check the running environment first so you do not tune a different distribution or a provider-supplied kernel unexpectedly.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/etc\/almalinux-release\nuname -r\nsysctl net.ipv4.tcp_available_congestion_control\nsysctl net.ipv4.tcp_congestion_control<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The release should begin with <code>AlmaLinux release 8<\/code>, and the kernel should normally begin with <code>4.18<\/code>. A fresh system commonly uses <code>cubic<\/code>; <code>bbr<\/code> may already be present in the available list, or it may appear after its module is loaded.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AlmaLinux release 8.10 (Cerulean Leopard)\n4.18.0-...el8_...x86_64\nnet.ipv4.tcp_available_congestion_control = reno cubic\nnet.ipv4.tcp_congestion_control = cubic<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The patch number and release name can vary with updates. Do not change the running kernel merely to match the sample output.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Load BBR into the running kernel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>tcp_bbr<\/code> module makes BBR available now; loading it before applying the sysctl avoids a setting failure on systems where the algorithm is modular.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo modprobe tcp_bbr\nsysctl net.ipv4.tcp_available_congestion_control\nlsmod | grep '^tcp_bbr'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A successful check includes <code>bbr<\/code> and a loaded-module line similar to this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>net.ipv4.tcp_available_congestion_control = reno cubic bbr\ntcp_bbr                20480  0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The module size is not fixed, so only the module name matters. If <code>bbr<\/code> was already listed, <code>modprobe<\/code> simply confirms that it can be used.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Save the module and TCP settings permanently<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use dedicated configuration files so the BBR change is easy to inspect or remove without modifying unrelated kernel tuning.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tee \/etc\/modules-load.d\/tcp_bbr.conf &gt;\/dev\/null &lt;&lt;'EOF'\ntcp_bbr\nEOF\nsudo tee \/etc\/sysctl.d\/99-bbr.conf &gt;\/dev\/null &lt;&lt;'EOF'\nnet.core.default_qdisc = fq\nnet.ipv4.tcp_congestion_control = bbr\nEOF\nsudo sysctl -p \/etc\/sysctl.d\/99-bbr.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The first file asks systemd to load BBR during future boots. The second selects BBR for new TCP connections and sets the fair-queueing scheduler recommended for it. The final command applies this file immediately.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Expected output is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>net.core.default_qdisc = fq\nnet.ipv4.tcp_congestion_control = bbr<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Put <code>fq<\/code> on the active network interface<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>net.core.default_qdisc<\/code> sets the default for newly created interfaces, while a VPS interface that already exists may still be using <code>fq_codel<\/code>; inspect and update that device explicitly.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MAIN_IFACE=$(ip route show default | awk '\/^default\/ {print $5; exit}')\nprintf '%s\\n' \"$MAIN_IFACE\"\nsudo tc qdisc replace dev \"$MAIN_IFACE\" root fq\ntc qdisc show dev \"$MAIN_IFACE\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The first line should print the interface carrying the default route, such as <code>ens3<\/code>. The final check should show <code>qdisc fq<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ens3\nqdisc fq 0: root refcnt 2 limit 10000p buckets 1024<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The interface name, counters, and queue limits vary. The <code>tc<\/code> change lasts until the interface is recreated or the server reboots. To retain it through NetworkManager reactivation, get the active connection name and set its qdisc profile:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MAIN_IFACE=$(ip route show default | awk '\/^default\/ {print $5; exit}')\nnmcli -g GENERAL.CONNECTION device show \"$MAIN_IFACE\"\nsudo nmcli connection modify \"YOUR_CONNECTION_NAME\" tc.qdiscs \"root fq\"\nsudo nmcli connection up \"YOUR_CONNECTION_NAME\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace <code>YOUR_CONNECTION_NAME<\/code> with the name printed by the first command. Bringing the connection up can briefly interrupt SSH, so use the VPS control panel\u2019s console if you cannot risk losing the session. Red Hat\u2019s <a href=\"https:\/\/docs.redhat.com\/en\/documentation\/red_hat_enterprise_linux\/8\/html\/configuring_and_managing_networking\/linux-traffic-control_configuring-and-managing-networking\" target=\"_blank\" rel=\"noopener\">RHEL 8 traffic-control guide<\/a> describes the same <code>tc<\/code> and NetworkManager methods.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Verify BBR on AlmaLinux 8<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run these checks together to prove that the running kernel, saved settings, loaded module, and active interface all agree.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MAIN_IFACE=$(ip route show default | awk '\/^default\/ {print $5; exit}')\nsysctl net.ipv4.tcp_congestion_control net.core.default_qdisc\nsysctl net.ipv4.tcp_available_congestion_control\nlsmod | grep '^tcp_bbr'\ngrep -Ev '^[[:space:]]*(#|$)' \/etc\/sysctl.d\/99-bbr.conf\ntc qdisc show dev \"$MAIN_IFACE\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Look for <code>tcp_congestion_control = bbr<\/code>, <code>default_qdisc = fq<\/code>, <code>bbr<\/code> in the available list, a <code>tcp_bbr<\/code> module line, and <code>qdisc fq<\/code> on the active device. These settings affect new TCP connections, so reconnect a client or restart a long-lived service before comparing behavior. The <a href=\"https:\/\/docs.kernel.org\/networking\/ip-sysctl.html\" target=\"_blank\" rel=\"noopener\">Linux kernel IP sysctl reference<\/a> explains the relevant TCP parameters.<\/p>\n\n\n\n<aside class=\"vl-element vl-cta-banner\" aria-label=\"Tune AlmaLinux networking\">\n\t<div class=\"vl-cta-banner__content\">\n\t\t<p class=\"vl-cta-banner__eyebrow\">Linux VPS<\/p>\n\t\t<h3 class=\"vl-cta-banner__title\">Tune AlmaLinux networking<\/h3>\n\t\t<p class=\"vl-cta-banner__text\">Use AlmaLinux 8 with kernel-level TCP tuning for network-sensitive workloads.<\/p>\n\t<\/div>\n\t<a class=\"vl-cta-banner__button\" href=\"\/buy-vps\" aria-label=\"View Linux VPS plans\">View Linux VPS plans<\/a>\n<\/aside>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><code>modprobe: FATAL: Module tcp_bbr not found<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The matching kernel module package is missing, or the VPS is running a custom kernel without BBR support. Install the extra modules for the current kernel and try again:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo dnf install -y kernel-modules-extra-$(uname -r)\nsudo modprobe tcp_bbr<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If DNF cannot find that exact package, install the generic package, reboot into the newest installed kernel, and rerun Step 2:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo dnf install -y kernel-modules-extra\nsudo reboot<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><code>sysctl: cannot set net.ipv4.tcp_congestion_control<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">BBR was not available when the sysctl file was read. Run <code>sudo modprobe tcp_bbr<\/code>, confirm that <code>bbr<\/code> appears in <code>sysctl net.ipv4.tcp_available_congestion_control<\/code>, and then reload the saved file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo sysctl -p \/etc\/sysctl.d\/99-bbr.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If the module disappears after every reboot, check that <code>\/etc\/modules-load.d\/tcp_bbr.conf<\/code> contains exactly <code>tcp_bbr<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>tc qdisc show<\/code> still reports <code>fq_codel<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The sysctl changed the default but did not replace the qdisc already attached to the existing interface. Re-run Step 4 with the real interface name, then store <code>root fq<\/code> in the active NetworkManager connection profile if the setting must survive a connection restart.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">BBR is active now but missing after reboot<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check both files and confirm that the VPS boots the same kernel you inspected with <code>uname -r<\/code>. A provider-managed or custom kernel may ignore the module-load request; in that case, install and select a standard AlmaLinux 8 kernel or ask the provider to expose BBR support.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Does BBR increase my VPS bandwidth?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No. BBR changes TCP\u2019s pacing and capacity estimate, but it cannot raise the network limit attached to your VPS or make a slow remote peer send faster. Measure the application and routes you actually use rather than expecting a universal speed increase.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Does enabling BBR affect UDP traffic?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No. The setting selects a congestion-control algorithm for TCP. UDP applications need their own rate and congestion controls, so they do not use <code>net.ipv4.tcp_congestion_control<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Do I have to reboot after enabling BBR?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No reboot is needed when <code>modprobe<\/code> and <code>sysctl -p<\/code> succeed; the running kernel changes immediately. The files in <code>\/etc\/modules-load.d\/<\/code> and <code>\/etc\/sysctl.d\/<\/code> make the configuration available again after a reboot.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I switch back to CUBIC?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Edit <code>\/etc\/sysctl.d\/99-bbr.conf<\/code>, change the value to <code>net.ipv4.tcp_congestion_control = cubic<\/code>, and run <code>sudo sysctl -p \/etc\/sysctl.d\/99-bbr.conf<\/code>. You can leave <code>tcp_bbr<\/code> in the module-load file because loading a module does not select it as the active algorithm.<\/p>\n\n\n\n<script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"FAQPage\", \"mainEntity\": [{\"@type\": \"Question\", \"name\": \"Does BBR increase my VPS bandwidth?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"No. BBR changes TCP\u2019s pacing and capacity estimate, but it cannot raise the network limit attached to your VPS or make a slow remote peer send faster. Measure the application and routes you actually use rather than expecting a universal speed increase.\"}}, {\"@type\": \"Question\", \"name\": \"Does enabling BBR affect UDP traffic?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"No. The setting selects a congestion-control algorithm for TCP. UDP applications need their own rate and congestion controls, so they do not use `net.ipv4.tcp_congestion_control`.\"}}, {\"@type\": \"Question\", \"name\": \"Do I have to reboot after enabling BBR?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"No reboot is needed when `modprobe` and `sysctl -p` succeed; the running kernel changes immediately. The files in `\/etc\/modules-load.d\/` and `\/etc\/sysctl.d\/` make the configuration available again after a reboot.\"}}, {\"@type\": \"Question\", \"name\": \"Can I switch back to CUBIC?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Yes. Edit `\/etc\/sysctl.d\/99-bbr.conf`, change the value to `net.ipv4.tcp_congestion_control = cubic`, and run `sudo sysctl -p \/etc\/sysctl.d\/99-bbr.conf`. You can leave `tcp_bbr` in the module-load file because loading a module does not select it as the active algorithm.\"}}]}<\/script>\n\n","protected":false},"excerpt":{"rendered":"Learn how to enable bbr on almalinux 8 with persistent kernel settings, the fq scheduler, interface checks, and fixes for common VPS errors.","protected":false},"author":1,"featured_media":962,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_singular_sidebar":"","csco_page_header_type":"","csco_page_load_nextpost":"","footnotes":""},"categories":[5,9],"tags":[94,113,114,115],"class_list":["post-961","post","type-post","status-publish","format-standard","has-post-thumbnail","category-guides","category-vps-hosting","tag-almalinux-8","tag-bbr","tag-linux-networking","tag-vps-tuning","cs-entry"],"_links":{"self":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/961","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/comments?post=961"}],"version-history":[{"count":1,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/961\/revisions"}],"predecessor-version":[{"id":3801,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/961\/revisions\/3801"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media\/962"}],"wp:attachment":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media?parent=961"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/categories?post=961"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/tags?post=961"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}