{"id":965,"date":"2026-10-30T18:00:00","date_gmt":"2026-10-30T18:00:00","guid":{"rendered":"https:\/\/vpslake.com\/blog\/?p=965"},"modified":"2026-10-30T18:00:00","modified_gmt":"2026-10-30T18:00:00","slug":"enable-bbr-centos-stream-10","status":"publish","type":"post","link":"https:\/\/vpslake.com\/blog\/2026\/10\/30\/enable-bbr-centos-stream-10\/","title":{"rendered":"How to Enable BBR on CentOS Stream 10 (Step-by-Step)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Enable BBR on CentOS Stream 10 to give new TCP connections a bandwidth-aware congestion-control algorithm and the <code>fq<\/code> packet scheduler. You can apply the settings immediately and make them survive a reboot in about five minutes, without opening a new firewall port.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>A CentOS Stream 10 VPS with a current 6.12-series kernel, or another kernel newer than 4.9.<\/li>\n\n\n<li>SSH access as <code>root<\/code>, or a normal user with working <code>sudo<\/code> privileges.<\/li>\n\n\n<li>Permission to load kernel modules and write configuration files below <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-level TCP setting.<\/li>\n\n\n<li>If you need the server first, use a <a href=\"https:\/\/vpslake.com\/buy-vps\">Linux VPS from VPSLake<\/a> and install CentOS Stream 10.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">BBR changes how TCP estimates a path and paces packets. It cannot increase the bandwidth limit on your plan, and its effect depends on the route, the remote peer, and the workload.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Confirm CentOS Stream 10 and inspect the current TCP settings<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check the release and running kernel before changing sysctl values so you do not tune a different operating system or an unexpected provider kernel.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/etc\/centos-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 line should identify CentOS Stream 10. A normal installation uses a 6.12-series kernel, while the current algorithm is commonly <code>cubic<\/code>; BBR may or may not appear in the available list yet.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CentOS Stream release 10 (Coughlan)\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\">Patch numbers and the available algorithm list vary with updates and the provider kernel. Do not change the kernel just to reproduce 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\">Load the module before selecting BBR so the sysctl command can find the algorithm during this 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\">The second command should now include <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 BBR was already listed, <code>modprobe<\/code> simply confirms that the module can be used. The module may not appear in <code>lsmod<\/code> on every kernel build, so the available-algorithm check is the important result.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Save BBR and <code>fq<\/code> for future boots<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use separate configuration files so the change is easy to audit or remove without overwriting unrelated system 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 modules-load file requests <code>tcp_bbr<\/code> at boot. The sysctl file selects BBR for new TCP connections and sets fair queueing as the default scheduler; the final command applies both values now.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/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\">CentOS Stream follows the Red Hat layout for runtime kernel parameters; see <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 RHEL 10 kernel-parameter documentation<\/a> for the <code>\/etc\/sysctl.d\/<\/code> approach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Apply <code>fq<\/code> to the interface carrying VPS traffic<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>net.core.default_qdisc<\/code> controls the default for interfaces created later, but an interface that is already up can retain its previous queueing discipline.<\/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\"\ntc qdisc show dev \"$MAIN_IFACE\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The first line should print the interface used by the default route, such as <code>ens3<\/code> or <code>eth0<\/code>. If the qdisc output shows <code>fq_codel<\/code> or another root scheduler, replace it for the current boot:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MAIN_IFACE=$(ip route show default | awk '\/^default\/ {print $5; exit}')\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\">A successful result contains <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 device name and queue details vary. This <code>tc<\/code> change can be lost when the interface is recreated or the server reboots. To store the per-interface setting in NetworkManager, identify the active connection and modify that 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 shown by the first command. Bringing the profile 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\/10\/html\/configuring_and_managing_networking\/linux-traffic-control\" target=\"_blank\" rel=\"noopener\">RHEL 10 traffic-control documentation<\/a> covers the <code>tc<\/code> and NetworkManager qdisc model.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Verify BBR on CentOS Stream 10<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run these checks after the settings have been applied. They confirm the active algorithm, the saved values, 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\">Look for <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> on the active device. These values affect new TCP connections, so reconnect SSH clients or restart long-lived services before comparing network behavior.<\/p>\n\n\n\n<aside class=\"vl-element vl-cta-banner\" aria-label=\"Tune CentOS Stream 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 CentOS Stream networking<\/h3>\n\t\t<p class=\"vl-cta-banner__text\">Run CentOS Stream 10 workloads on a VPS ready for persistent TCP 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 expose the BBR module, or its matching module package is missing. Install the extra modules package, reboot into the newest installed CentOS Stream kernel, and try again:<\/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<p class=\"wp-block-paragraph\">After reconnecting, run Step 2. If DNF cannot provide a package for the running kernel, the VPS may be using a provider-managed custom kernel; ask the provider for a standard CentOS Stream 10 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\">The sysctl file was loaded before BBR became available. Load the module, confirm that <code>bbr<\/code> appears in the available list, and apply the file again:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo modprobe tcp_bbr\nsysctl net.ipv4.tcp_available_congestion_control\nsudo sysctl -p \/etc\/sysctl.d\/90-tcp-bbr.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If the error returns 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 default scheduler setting does not replace the qdisc already attached to an existing interface. Run the <code>tc qdisc replace<\/code> command in Step 4 using the actual default-route interface, 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\">BBR works until the next reboot<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Check both configuration files and confirm that the rebooted system is using the same kernel family shown by <code>uname -r<\/code>. Reload the module and sysctl file manually; if the module still disappears, the provider kernel may not support automatic loading.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Does BBR increase the bandwidth of my VPS?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No. BBR changes TCP pacing and capacity estimation, but it cannot raise the plan\u2019s network limit or make a slow remote peer send faster. Judge the result with the application and routes you actually use.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Does BBR change UDP traffic?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No. <code>net.ipv4.tcp_congestion_control<\/code> applies to TCP. UDP applications need their own rate and congestion-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 required when <code>modprobe<\/code> and <code>sysctl -p<\/code> succeed; the running kernel changes immediately. The files under <code>\/etc\/modules-load.d\/<\/code> and <code>\/etc\/sysctl.d\/<\/code> make the configuration available after a later reboot.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How do I switch back to CUBIC?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Edit <code>\/etc\/sysctl.d\/90-tcp-bbr.conf<\/code>, change the congestion-control value to <code>cubic<\/code>, and run <code>sudo sysctl -p \/etc\/sysctl.d\/90-tcp-bbr.conf<\/code>. You can leave the module-load file in place because loading <code>tcp_bbr<\/code> 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 the bandwidth of my VPS?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"No. BBR changes TCP pacing and capacity estimation, but it cannot raise the plan\u2019s network limit or make a slow remote peer send faster. Judge the result with the application and routes you actually use.\"}}, {\"@type\": \"Question\", \"name\": \"Does BBR change UDP traffic?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"No. `net.ipv4.tcp_congestion_control` applies to TCP. UDP applications need their own rate and congestion-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 required when `modprobe` and `sysctl -p` succeed; the running kernel changes immediately. The files under `\/etc\/modules-load.d\/` and `\/etc\/sysctl.d\/` make the configuration available after a later reboot.\"}}, {\"@type\": \"Question\", \"name\": \"How do I switch back to CUBIC?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Edit `\/etc\/sysctl.d\/90-tcp-bbr.conf`, change the congestion-control value to `cubic`, and run `sudo sysctl -p \/etc\/sysctl.d\/90-tcp-bbr.conf`. You can leave the module-load file in place because loading `tcp_bbr` does not select it as the active algorithm.\"}}]}<\/script>\n\n","protected":false},"excerpt":{"rendered":"Enable BBR on CentOS Stream 10 with persistent kernel settings, fq queueing, live verification, and fixes for missing modules and qdisc errors.","protected":false},"author":1,"featured_media":966,"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":[113,110,114,115],"class_list":["post-965","post","type-post","status-publish","format-standard","has-post-thumbnail","category-guides","category-vps-hosting","tag-bbr","tag-centos-stream-10","tag-linux-networking","tag-vps-tuning","cs-entry"],"_links":{"self":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/965","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=965"}],"version-history":[{"count":1,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/965\/revisions"}],"predecessor-version":[{"id":3808,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/posts\/965\/revisions\/3808"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media\/966"}],"wp:attachment":[{"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/media?parent=965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/categories?post=965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vpslake.com\/blog\/wp-json\/wp\/v2\/tags?post=965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}