{"id":959,"date":"2026-10-30T03:00:00","date_gmt":"2026-10-30T03:00:00","guid":{"rendered":"https:\/\/vpslake.com\/blog\/?p=959"},"modified":"2026-10-30T03:00:00","modified_gmt":"2026-10-30T03:00:00","slug":"enable-bbr-almalinux-10","status":"publish","type":"post","link":"https:\/\/vpslake.com\/blog\/2026\/10\/30\/enable-bbr-almalinux-10\/","title":{"rendered":"How to Enable BBR on AlmaLinux 10 (Step-by-Step)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Enable BBR on AlmaLinux 10 to use a modern TCP congestion-control algorithm with the <code>fq<\/code> packet scheduler. You can apply the change immediately and make it survive reboots in about five minutes, without changing your firewall or application ports.<\/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 10 VPS with a kernel version of 4.9 or newer; the standard AlmaLinux 10 kernel is in the 6.12 series.<\/li>\n\n\n<li>SSH access as <code>root<\/code>, or a normal account that can run commands with <code>sudo<\/code>.<\/li>\n\n\n<li>Permission to load kernel modules and write files under <code>\/etc<\/code>; a restricted container may not provide either capability.<\/li>\n\n\n<li>No domain, web server, or open inbound port is required because BBR changes outbound and inbound TCP behavior at the kernel level.<\/li>\n\n\n<li>If you need a server, use a <a href=\"https:\/\/vpslake.com\/buy-vps\">Linux VPS from VPSLake<\/a> with AlmaLinux 10 installed.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">BBR is a TCP congestion-control algorithm, not a bandwidth upgrade. It can make better use of a path under congestion, but the result depends on the network, peer, and workload.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Check AlmaLinux, the kernel, and the current TCP algorithm<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Confirm the release and running kernel first so you do not apply the procedure to a different operating system or an unexpected provider kernel.<\/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\">On AlmaLinux 10, the release line should begin with <code>AlmaLinux release 10<\/code>, and the kernel should normally begin with <code>6.12<\/code>. A new installation commonly reports <code>cubic<\/code> as the current algorithm and may not list <code>bbr<\/code> until its module is loaded.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AlmaLinux release 10.x\n6.12.0-...el10_...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 exact kernel suffix changes as AlmaLinux publishes updates. Do not downgrade just to match an example version.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Load the BBR kernel module<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Loading <code>tcp_bbr<\/code> makes the algorithm available to the running kernel; doing this before applying the sysctl file prevents a setting failure on systems where BBR 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\">You should now see <code>bbr<\/code> in the available algorithms and a <code>tcp_bbr<\/code> line from <code>lsmod<\/code>:<\/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\">If <code>bbr<\/code> was already listed, <code>modprobe<\/code> simply confirms that the module is ready. The module size and usage count can differ between kernel builds.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Save BBR and the <code>fq<\/code> scheduler permanently<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Put this small configuration in its own file so it is easy to audit or remove and does not overwrite 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 default queueing discipline recommended with BBR; <code>sysctl -p<\/code> applies both values now.<\/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<p class=\"wp-block-paragraph\">The <code>\/etc\/sysctl.d\/<\/code> method follows the RHEL-compatible AlmaLinux layout described in <a href=\"https:\/\/docs.redhat.com\/en\/documentation\/red_hat_enterprise_linux\/10\/html\/managing_monitoring_and_updating_the_kernel\/configuring-kernel-parameters-at-runtime\" target=\"_blank\" rel=\"noopener\">Red Hat\u2019s kernel-parameter documentation<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Check the queueing discipline on the active interfaces<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>net.core.default_qdisc<\/code> defines the default scheduler, while <code>tc<\/code> shows what an existing network interface is using right now.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tc qdisc show<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Look for <code>qdisc fq<\/code> on the interface that carries VPS traffic, for example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>qdisc fq 0: dev eth0 root refcnt 2 limit 10000p buckets 1024 orphan_mask 1023<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Interface names vary, so do not assume <code>eth0<\/code>. If the active device still shows <code>fq_codel<\/code> or another root qdisc, identify the device with <code>ip -br link<\/code> and apply <code>fq<\/code> for the current boot:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ip -br link\nsudo tc qdisc replace dev YOUR_INTERFACE root fq\ntc qdisc show dev YOUR_INTERFACE<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace <code>YOUR_INTERFACE<\/code> with the real device name, such as <code>ens3<\/code>; the command changes only the root qdisc on that interface. To retain a deliberate per-interface qdisc across NetworkManager reactivations, use the active connection name shown by <code>nmcli connection show --active<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nmcli connection show --active\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\">The connection restart can briefly interrupt SSH, so use the VPS control panel\u2019s console if you cannot risk losing your SSH session.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Verify BBR on AlmaLinux 10<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run one final check for the selected algorithm, the available module, the saved file, and the live qdisc. This proves the setting is active rather than merely present in a configuration file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sysctl 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<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A successful result includes <code>tcp_congestion_control = bbr<\/code>, <code>default_qdisc = fq<\/code>, <code>bbr<\/code> in the available list, the <code>tcp_bbr<\/code> module, and <code>qdisc fq<\/code> on the active interface. The kernel setting governs new TCP connections; reconnect clients or restart long-lived services before comparing behavior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the kernel meanings of <code>tcp_available_congestion_control<\/code> and <code>tcp_congestion_control<\/code>, see the <a href=\"https:\/\/docs.kernel.org\/networking\/ip-sysctl.html\" target=\"_blank\" rel=\"noopener\">Linux kernel IP sysctl reference<\/a>. Enabling BBR does not guarantee faster everyday traffic, so compare the actual application with representative peers instead of relying on a single speed test.<\/p>\n\n\n\n<aside class=\"vl-element vl-cta-banner\" aria-label=\"Tune your network stack\">\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 your network stack<\/h3>\n\t\t<p class=\"vl-cta-banner__text\">Run AlmaLinux 10 workloads on a VPS ready for secure kernel-level tuning.<\/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 running kernel does not have the BBR module available, or the matching kernel module package is missing. Update the AlmaLinux kernel packages, reboot into the newest installed kernel, and run <code>sudo modprobe tcp_bbr<\/code> again; if the VPS uses a provider-supplied custom kernel, ask the provider to expose a standard AlmaLinux kernel with BBR support.<\/p>\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\">This usually means BBR was not loaded before the setting was applied. Run <code>sudo modprobe tcp_bbr<\/code>, confirm that <code>bbr<\/code> appears in <code>sysctl net.ipv4.tcp_available_congestion_control<\/code>, then reload <code>sudo sysctl -p \/etc\/sysctl.d\/99-bbr.conf<\/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 default value did not replace the qdisc already attached to the interface. Apply <code>sudo tc qdisc replace dev YOUR_INTERFACE root fq<\/code> using the real interface name, then use the NetworkManager commands in Step 4 if that per-interface choice must survive a connection restart.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">BBR disappears after reboot<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check that <code>\/etc\/modules-load.d\/tcp_bbr.conf<\/code> contains exactly <code>tcp_bbr<\/code> and that <code>\/etc\/sysctl.d\/99-bbr.conf<\/code> contains both settings. After correcting either file, run <code>sudo modprobe tcp_bbr<\/code> and <code>sudo sysctl -p \/etc\/sysctl.d\/99-bbr.conf<\/code>; a managed or custom kernel may also prevent module loading at boot.<\/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 how TCP estimates capacity and paces traffic; it cannot raise the provider\u2019s network limit or improve a congested remote peer. Its effect should be judged with the application and routes you actually use.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Is BBR used for UDP traffic?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No. These settings select a TCP congestion-control algorithm. UDP applications need their own congestion and rate-control behavior, so enabling BBR does not tune them.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Do I need to reboot after enabling BBR?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No reboot is needed for the current session after <code>modprobe<\/code> and <code>sysctl -p<\/code> succeed. The module-load file and sysctl file make the configuration available again after a reboot.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I return to CUBIC?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Change <code>net.ipv4.tcp_congestion_control = bbr<\/code> to <code>cubic<\/code> in <code>\/etc\/sysctl.d\/99-bbr.conf<\/code>, run <code>sudo sysctl -p \/etc\/sysctl.d\/99-bbr.conf<\/code>, and verify with <code>sysctl net.ipv4.tcp_congestion_control<\/code>. You can leave the BBR module-load file in place because loading the module does not select it.<\/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 how TCP estimates capacity and paces traffic; it cannot raise the provider\u2019s network limit or improve a congested remote peer. Its effect should be judged with the application and routes you actually use.\"}}, {\"@type\": \"Question\", \"name\": \"Is BBR used for UDP traffic?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"No. These settings select a TCP congestion-control algorithm. UDP applications need their own congestion and rate-control behavior, so enabling BBR does not tune them.\"}}, {\"@type\": \"Question\", \"name\": \"Do I need to reboot after enabling BBR?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"No reboot is needed for the current session after `modprobe` and `sysctl -p` succeed. The module-load file and sysctl file make the configuration available again after a reboot.\"}}, {\"@type\": \"Question\", \"name\": \"Can I return to CUBIC?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Yes. Change `net.ipv4.tcp_congestion_control = bbr` to `cubic` in `\/etc\/sysctl.d\/99-bbr.conf`, run `sudo sysctl -p \/etc\/sysctl.d\/99-bbr.conf`, and verify with `sysctl net.ipv4.tcp_congestion_control`. You can leave the BBR module-load file in place because loading the module does not select it.\"}}]}<\/script>\n\n","protected":false},"excerpt":{"rendered":"Learn how to enable bbr on almalinux 10 with persistent kernel settings, fq queueing, verification commands, and common VPS fixes for reboot-safe tuning.","protected":false},"author":1,"featured_media":960,"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":[91,113,114,115],"class_list":["post-959","post","type-post","status-publish","format-standard","has-post-thumbnail","category-guides","category-vps-hosting","tag-almalinux-10","tag-bbr","tag-linux-networking","tag-vps-tuning","cs-entry"],"_links":{"self":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/959","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=959"}],"version-history":[{"count":1,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/959\/revisions"}],"predecessor-version":[{"id":3796,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/959\/revisions\/3796"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media\/960"}],"wp:attachment":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media?parent=959"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/categories?post=959"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/tags?post=959"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}