{"id":963,"date":"2026-10-30T13:00:00","date_gmt":"2026-10-30T13:00:00","guid":{"rendered":"https:\/\/vpslake.com\/blog\/?p=963"},"modified":"2026-10-30T13:00:00","modified_gmt":"2026-10-30T13:00:00","slug":"enable-bbr-almalinux-9","status":"publish","type":"post","link":"https:\/\/vpslake.com\/blog\/2026\/10\/30\/enable-bbr-almalinux-9\/","title":{"rendered":"How to Enable BBR on AlmaLinux 9 (Step-by-Step)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Enable BBR on AlmaLinux 9 to give new TCP connections a modern congestion-control algorithm and the <code>fq<\/code> packet scheduler. You can apply the change without opening a port, then make it persistent in roughly five minutes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>AlmaLinux 9 on a VPS, running a 5.14-series kernel or another kernel newer than 4.9.<\/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 create files under <code>\/etc<\/code>; an unprivileged container may not allow either operation.<\/li>\n\n\n<li>No domain, web server, extra RAM, or extra disk is required because BBR is a kernel TCP setting.<\/li>\n\n\n<li>If you need the server first, choose a <a href=\"https:\/\/vpslake.com\/buy-vps\">Linux VPS from VPSLake<\/a> and install AlmaLinux 9.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Confirm AlmaLinux 9 and inspect TCP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check the release and running kernel before changing sysctl values so you know the commands are being applied to the expected operating system.<\/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 first line should identify AlmaLinux 9. The kernel should normally begin with <code>5.14<\/code>, although the complete suffix changes with updates. A typical server starts with <code>cubic<\/code>; <code>bbr<\/code> may already be listed if the provider&#8217;s kernel exposes it.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AlmaLinux release 9.x (Turquoise Kodkod)\n5.14.0-...el9_...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 release codename and available algorithms can differ between minor updates. Do not change the kernel just to reproduce the sample output.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Make BBR available to the running kernel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">BBR must be available before the sysctl can select it; on systems where it is a loadable module, <code>modprobe<\/code> activates it for the current boot.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo modprobe tcp_bbr\nsysctl net.ipv4.tcp_available_congestion_control<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Confirm that the last line contains <code>bbr<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>net.ipv4.tcp_available_congestion_control = reno cubic bbr<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If <code>bbr<\/code> was already in the list, the <code>modprobe<\/code> command simply leaves the existing support ready. Do not treat the absence of a <code>tcp_bbr<\/code> line in <code>lsmod<\/code> as failure: some kernels can provide the algorithm without exposing it as a separately listed module.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Save the BBR settings<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Keep the settings in a dedicated file so they are easy to audit or remove without changing 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\/90-tcp-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\/90-tcp-bbr.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The first file asks systemd to load BBR during later boots. The second selects BBR for TCP and sets <code>fq<\/code> as the default queueing discipline, while the final command applies both values immediately.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Successful output looks like this:<\/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 <a href=\"https:\/\/docs.redhat.com\/en\/documentation\/red_hat_enterprise_linux\/9\/html\/managing_monitoring_and_updating_the_kernel\/configuring-kernel-parameters-at-runtime\" target=\"_blank\" rel=\"noopener\">RHEL 9 kernel-parameter guide<\/a> documents the <code>\/etc\/sysctl.d\/<\/code> approach used by AlmaLinux&#8217;s compatible user space.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Check and, if needed, replace the live qdisc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Changing <code>net.core.default_qdisc<\/code> sets the default for interfaces created later; <code>tc<\/code> tells you which queueing discipline is attached to the interface that is already carrying traffic.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ip route show default\ntc qdisc show<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Find the device named after <code>dev<\/code> on the default route and check its <code>qdisc<\/code>. On EL9, <code>fq_codel<\/code> is common even after the default value changes. If the active device is <code>ens3<\/code>, replace <code>YOUR_INTERFACE<\/code> with <code>ens3<\/code> in this command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo 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\">The second command should contain <code>qdisc fq<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>qdisc fq 0: root refcnt 2 limit 10000p buckets 1024<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">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:<\/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\">Replace <code>YOUR_CONNECTION_NAME<\/code> 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&#8217;s <a href=\"https:\/\/docs.redhat.com\/en\/documentation\/red_hat_enterprise_linux\/9\/html\/configuring_and_managing_networking\/linux-traffic-control_configuring-and-managing-networking\" target=\"_blank\" rel=\"noopener\">RHEL 9 traffic-control guide<\/a> covers the <code>tc<\/code> and NetworkManager qdisc methods.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Verify BBR on AlmaLinux 9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/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\ngrep -Ev '^[[:space:]]*(#|$)' \/etc\/sysctl.d\/90-tcp-bbr.conf\ntc qdisc show dev \"$MAIN_IFACE\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You want <code>tcp_congestion_control = bbr<\/code>, <code>default_qdisc = fq<\/code>, <code>bbr<\/code> in the available list, both lines from <code>90-tcp-bbr.conf<\/code>, and <code>qdisc fq<\/code> for the interface. These controls affect TCP behavior, but enabling them alone is not a guarantee of faster traffic.<\/p>\n\n\n\n<aside class=\"vl-element vl-cta-banner\" aria-label=\"Tune AlmaLinux TCP\">\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 TCP<\/h3>\n\t\t<p class=\"vl-cta-banner__text\">Run AlmaLinux 9 workloads on a VPS ready for persistent kernel networking settings.<\/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 include the BBR module, or its matching module package is missing. Check whether the algorithm is already available with <code>sysctl net.ipv4.tcp_available_congestion_control<\/code>; if <code>bbr<\/code> is absent, install the matching extra kernel modules and reboot into the newest installed AlmaLinux kernel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo dnf install -y kernel-modules-extra-$(uname -r)\nsudo reboot<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/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\">The sysctl file was read before BBR became available, or the running kernel does not support it. Run <code>sudo modprobe tcp_bbr<\/code>, confirm that <code>bbr<\/code> appears in the available list, and reload the file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo sysctl -p \/etc\/sysctl.d\/90-tcp-bbr.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If the same error returns after a reboot, verify 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 default qdisc value does not necessarily replace the qdisc already attached to an existing interface. Apply <code>tc qdisc replace<\/code> from Step 4 with the real interface name, then save <code>root fq<\/code> in the active NetworkManager profile if it must survive link reactivation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">SSH disconnects after <code>nmcli connection up<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bringing the profile up temporarily drops the network path used by your SSH session. Wait for the connection to return, reconnect, and verify with <code>tc<\/code>; for a remote server where interruption is unacceptable, make the profile change through the VPS control panel console.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Will BBR improve every download or website?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No. BBR changes the sender&#8217;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.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Does BBR change existing TCP connections?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Is a firewall rule required for BBR?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How do I undo the change?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Remove the two BBR lines from <code>\/etc\/sysctl.d\/90-tcp-bbr.conf<\/code>, or change the congestion-control value to <code>cubic<\/code>, then run <code>sudo sysctl -p \/etc\/sysctl.d\/90-tcp-bbr.conf<\/code>. Remove <code>\/etc\/modules-load.d\/tcp-bbr.conf<\/code> only if you no longer want the module loaded automatically at boot.<\/p>\n\n\n\n<script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"FAQPage\", \"mainEntity\": [{\"@type\": \"Question\", \"name\": \"Will BBR improve every download or website?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"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.\"}}, {\"@type\": \"Question\", \"name\": \"Does BBR change existing TCP connections?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"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.\"}}, {\"@type\": \"Question\", \"name\": \"Is a firewall rule required for BBR?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"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.\"}}, {\"@type\": \"Question\", \"name\": \"How do I undo the change?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"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.\"}}]}<\/script>\n\n","protected":false},"excerpt":{"rendered":"Learn how to enable bbr on almalinux 9, persist TCP settings after reboot, inspect the live qdisc, and fix common kernel and SSH errors on your VPS.","protected":false},"author":1,"featured_media":964,"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":[95,113,114,115],"class_list":["post-963","post","type-post","status-publish","format-standard","has-post-thumbnail","category-guides","category-vps-hosting","tag-almalinux-9","tag-bbr","tag-linux-networking","tag-vps-tuning","cs-entry"],"_links":{"self":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/963","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=963"}],"version-history":[{"count":1,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/963\/revisions"}],"predecessor-version":[{"id":3802,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/963\/revisions\/3802"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media\/964"}],"wp:attachment":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media?parent=963"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/categories?post=963"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/tags?post=963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}