{"id":934,"date":"2026-08-20T22:50:54","date_gmt":"2026-08-20T22:50:54","guid":{"rendered":"https:\/\/virtualserversvps.com\/blog\/?p=934"},"modified":"2026-08-20T22:50:54","modified_gmt":"2026-08-20T22:50:54","slug":"tcp-bbr-vps-congestion-control","status":"publish","type":"post","link":"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/","title":{"rendered":"TCP BBR on a VPS: Enabling Modern Congestion Control for Faster Transfers"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">If your VPS transfers large files slowly, or throughput collapses whenever the network drops a packet, the default TCP congestion control algorithm is a likely culprit. Most Linux distributions still ship CUBIC, which was designed for a world where packet loss meant congestion. On modern high-bandwidth links, BBR \u2014 Google&#8217;s Bottleneck Bandwidth and Round-trip propagation time algorithm \u2014 models the actual bottleneck instead of treating every dropped packet as a signal to halve the sending rate. This article explains how to enable BBR on a VPS, how to verify it is active, and what results to expect on real workloads.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What BBR Changes Under the Hood<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">CUBIC probes for available bandwidth by increasing the send rate until packets drop, then backs off. BBR instead measures the bottleneck bandwidth and the minimum round-trip time continuously, and paces the sender to match. The practical effect: BBR keeps the pipe full without relying on loss as a signal, which produces dramatically better throughput on links with bufferbloat, on long-distance routes, and when other tenants on the same uplink cause occasional drops. The trade-off is slightly more bandwidth consumed by retransmissions in some loss-heavy scenarios, and no benefit at all if your bottleneck is local CPU or disk rather than the network.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Check Your Kernel First<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">BBR requires kernel 4.9+ as a module and 4.13+ for the <code>fq<\/code> qdisc integration. Almost every VPS image in production in 2026 \u2014 Ubuntu 22.04\/24.04, Debian 12, Rocky 9, AlmaLinux 9 \u2014 ships a kernel well past that. Verify what you have before changing anything:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>uname -r\n# BBR available as a module?\nmodinfo tcp_bbr | head -5\n# current congestion control\nsysctl net.ipv4.tcp_congestion_control<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If <code>modinfo tcp_bbr<\/code> returns nothing, your kernel was built without it \u2014 this is rare on mainstream distros but possible on heavily customized provider kernels. In that case the only options are a distro kernel update or a provider change; <a href=\"https:\/\/virtualserversvps.com\/#providers\">the kernel and feature details in our provider comparison table<\/a> are worth checking before you commit to a VPS plan if you plan to run network-heavy workloads.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Enable BBR and the fq Qdisc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">BBR is designed to work with the <code>fq<\/code> (fair queue) qdisc, which handles pacing. Enable both at runtime first, then make them permanent:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>modprobe tcp_bbr\nsysctl -w net.core.default_qdisc=fq\nsysctl -w net.ipv4.tcp_congestion_control=bbr<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To make the change survive a reboot, write it to <code>\/etc\/sysctl.d\/<\/code> and load the module at boot:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"net.core.default_qdisc=fq\" &gt;&gt; \/etc\/sysctl.d\/99-bbr.conf\necho \"net.ipv4.tcp_congestion_control=bbr\" &gt;&gt; \/etc\/sysctl.d\/99-bbr.conf\necho \"tcp_bbr\" &gt; \/etc\/modules-load.d\/bbr.conf\nsysctl --system<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Confirm the change took effect:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sysctl net.ipv4.tcp_congestion_control\n# expected: net.ipv4.tcp_congestion_control = bbr\nsysctl net.core.default_qdisc\n# expected: net.core.default_qdisc = fq\nss -Tin | head -10   # shows the congestion control in use per connection<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>ss -Tin<\/code> output lists <code>cubic<\/code> or <code>bbr<\/code> in the third column for established connections. Existing connections keep their old algorithm; new connections use BBR immediately. If you see <code>bbr<\/code> there, the kernel is using it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Measure the Difference with iperf3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Never enable a kernel setting on faith \u2014 measure it. iperf3 is the standard tool for this, and you need a second server to test against (any VPS or a cloud instance works; a second VPS from a different provider gives the most honest cross-network numbers):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># on the remote test server\napt install -y iperf3 &amp;&amp; iperf3 -s\n# on your VPS, against CUBIC first\nsysctl -w net.ipv4.tcp_congestion_control=cubic\niperf3 -c REMOTE_IP -t 30 -P 4\n# then against BBR\nsysctl -w net.ipv4.tcp_congestion_control=bbr\niperf3 -c REMOTE_IP -t 30 -P 4<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In a typical test on a 1 Gbps VPS with an overseas peer, expect something like:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Algorithm<\/th><th>Throughput (4 streams)<\/th><th>Retransmits<\/th><\/tr><\/thead><tbody><tr><td>CUBIC<\/td><td>340-420 Mbps<\/td><td>2.1%<\/td><\/tr><tr><td>BBR<\/td><td>780-920 Mbps<\/td><td>3.4%<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The throughput gain of 2-3x on lossy or high-latency paths is typical; on a clean local link with zero loss, CUBIC and BBR are close, and the difference will be small. That is expected \u2014 BBR shines exactly where packet loss or bufferbloat exists, which is most real-world inter-provider traffic. If your test shows no improvement, your bottleneck is not congestion control, and you should look at CPU, disk, or the provider&#8217;s bandwidth cap instead.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Real-World Workloads That Benefit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The biggest wins show up in three places:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Large file transfers<\/strong> \u2014 backups, database dumps, media delivery. A backup job that took 40 minutes under CUBIC often completes in 15-20 minutes with BBR on the same pipe.<\/li>\n<li><strong>Cross-continental traffic<\/strong> \u2014 any route with high latency and occasional loss. BBR&#8217;s pacing keeps the window full despite the RTT.<\/li>\n<li><strong>Busy uplinks<\/strong> \u2014 a VPS sharing a provider uplink with noisy neighbors sees far less throughput collapse, because BBR does not halve the rate on every drop.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Workloads that see little benefit: localhost traffic (no network path to optimize), single-stream tests below the bottleneck (BBR adds nothing if CUBIC already saturates), and CPU-bound transfers where the application cannot generate enough data to fill the pipe. Enable BBR and then decide with numbers \u2014 if your iperf3 result is flat, keep it anyway, because it costs nothing and helps the bursty moments.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Interaction with Other Network Settings<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">BBR works alongside, not instead of, the rest of your network tuning. Raise the socket buffers so the larger windows BBR opens are actually usable:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sysctl -w net.core.rmem_max=16777216\nsysctl -w net.core.wmem_max=16777216\nsysctl -w net.ipv4.tcp_rmem=\"4096 87380 16777216\"\nsysctl -w net.ipv4.tcp_wmem=\"4096 65536 16777216\"\nsysctl -w net.ipv4.tcp_slow_start_after_idle=0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>tcp_slow_start_after_idle=0<\/code> stops the congestion window from collapsing when a connection goes idle, which matters for APIs with frequent short bursts. Do not combine BBR with aggressive <code>tcp_congestion_control<\/code> hacks like setting it per-route unless you have a specific reason; the global setting covers new connections and is what most guides \u2014 <a href=\"https:\/\/virtualserversvps.com\/#faq\">including the ones you will find in the FAQ on our main site<\/a> \u2014 recommend. Also note that BBR is a sender-side algorithm: both endpoints do not need it, only the side that sends the bulk data does. Enabling it on your VPS helps outbound transfers (backups, media, API responses) immediately, even if the client runs CUBIC.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rolling Back Is One Command<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you ever see a regression, reverting is trivial:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sysctl -w net.ipv4.tcp_congestion_control=cubic\nrm \/etc\/sysctl.d\/99-bbr.conf \/etc\/modules-load.d\/bbr.conf\nsysctl --system<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">There is no persistent state to clean up; the algorithm is selected per new connection at the kernel level. In my experience across dozens of VPS setups, the only reason to revert is a specific workload that measurably regresses \u2014 and the iperf3 comparison above will tell you that within ten minutes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>BBR requires kernel 4.9+; check with <code>modinfo tcp_bbr<\/code>.<\/li>\n<li>Enable with <code>net.ipv4.tcp_congestion_control=bbr<\/code> plus <code>net.core.default_qdisc=fq<\/code>.<\/li>\n<li>Persist via <code>\/etc\/sysctl.d\/99-bbr.conf<\/code> and a modules-load entry.<\/li>\n<li>Verify with <code>sysctl<\/code> and <code>ss -Tin<\/code>; quantify with iperf3 against a second server.<\/li>\n<li>Expect 2-3x throughput on lossy or long-distance paths, and no change on clean local links.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">TCP BBR is one of the few kernel changes that delivers a measurable, immediate speedup for outbound transfers on a VPS, with essentially zero downside and a one-command rollback. Enable it, measure it, and keep it \u2014 your backup windows and media transfers will thank you. For guidance on choosing a VPS plan with the bandwidth and network quality to match your transfer volumes, <a href=\"https:\/\/virtualserversvps.com\/#providers\">see the provider comparison table<\/a> and <a href=\"https:\/\/virtualserversvps.com\/#features\">features overview on our main site<\/a>.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>If your VPS transfers large files slowly, or throughput collapses whenever the network drops a packet, the default TCP congestion control algorithm is a likely culprit. Most Linux distributions still&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":1,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-934","post","type-post","status-publish","format-standard","hentry","category-performance-optimization"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>TCP BBR on a VPS: Enabling Modern Congestion Control for Faster Transfers - Virtual Servers VPS Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TCP BBR on a VPS: Enabling Modern Congestion Control for Faster Transfers\" \/>\n<meta property=\"og:description\" content=\"TCP BBR on a VPS: Enabling Modern Congestion Control for Faster Transfers\" \/>\n<meta property=\"og:url\" content=\"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/\" \/>\n<meta property=\"og:site_name\" content=\"Virtual Servers VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-20T22:50:54+00:00\" \/>\n<meta name=\"author\" content=\"Virtual-Servers-Vps-Editor\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Virtual-Servers-Vps-Editor\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/\",\"url\":\"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/\",\"name\":\"TCP BBR on a VPS: Enabling Modern Congestion Control for Faster Transfers - Virtual Servers VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#website\"},\"datePublished\":\"2026-08-20T22:50:54+00:00\",\"author\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0\"},\"breadcrumb\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/virtualserversvps.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TCP BBR on a VPS: Enabling Modern Congestion Control for Faster Transfers\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#website\",\"url\":\"https:\/\/virtualserversvps.com\/blog\/\",\"name\":\"Virtual Servers VPS Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/virtualserversvps.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0\",\"name\":\"Virtual-Servers-Vps-Editor\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g\",\"caption\":\"Virtual-Servers-Vps-Editor\"},\"sameAs\":[\"https:\/\/virtualserversvps.com\/blog\"],\"url\":\"https:\/\/virtualserversvps.com\/blog\/author\/virtualserversvps\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"TCP BBR on a VPS: Enabling Modern Congestion Control for Faster Transfers - Virtual Servers VPS Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/","og_locale":"en_US","og_type":"article","og_title":"TCP BBR on a VPS: Enabling Modern Congestion Control for Faster Transfers","og_description":"TCP BBR on a VPS: Enabling Modern Congestion Control for Faster Transfers","og_url":"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/","og_site_name":"Virtual Servers VPS Blog","article_published_time":"2026-08-20T22:50:54+00:00","author":"Virtual-Servers-Vps-Editor","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Virtual-Servers-Vps-Editor","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/","url":"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/","name":"TCP BBR on a VPS: Enabling Modern Congestion Control for Faster Transfers - Virtual Servers VPS Blog","isPartOf":{"@id":"https:\/\/virtualserversvps.com\/blog\/#website"},"datePublished":"2026-08-20T22:50:54+00:00","author":{"@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0"},"breadcrumb":{"@id":"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/virtualserversvps.com\/blog\/tcp-bbr-vps-congestion-control\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/virtualserversvps.com\/blog\/"},{"@type":"ListItem","position":2,"name":"TCP BBR on a VPS: Enabling Modern Congestion Control for Faster Transfers"}]},{"@type":"WebSite","@id":"https:\/\/virtualserversvps.com\/blog\/#website","url":"https:\/\/virtualserversvps.com\/blog\/","name":"Virtual Servers VPS Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/virtualserversvps.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0","name":"Virtual-Servers-Vps-Editor","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g","caption":"Virtual-Servers-Vps-Editor"},"sameAs":["https:\/\/virtualserversvps.com\/blog"],"url":"https:\/\/virtualserversvps.com\/blog\/author\/virtualserversvps\/"}]}},"_links":{"self":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/934","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/comments?post=934"}],"version-history":[{"count":2,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/934\/revisions"}],"predecessor-version":[{"id":937,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/934\/revisions\/937"}],"wp:attachment":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/media?parent=934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/categories?post=934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/tags?post=934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}