{"id":1386,"date":"2026-10-13T22:35:37","date_gmt":"2026-10-13T22:35:37","guid":{"rendered":"https:\/\/virtualserversvps.com\/blog\/?p=1386"},"modified":"2026-10-13T22:35:37","modified_gmt":"2026-10-13T22:35:37","slug":"vps-tcp-bbr-congestion-control-benchmarks","status":"publish","type":"post","link":"https:\/\/virtualserversvps.com\/blog\/vps-tcp-bbr-congestion-control-benchmarks\/","title":{"rendered":"TCP BBR vs CUBIC on a VPS: A Reproducible Benchmark Methodology"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Switching a VPS to BBR is a two-line change that people either swear by or claim does nothing. The truth is measured: BBR helps most on links with loss and latency, and changes almost nothing on a clean low-latency LAN. This is a methodology to decide for <em>your<\/em> VPS instead of copying a blog post.<\/p><h2 class=\"wp-block-heading\">Prerequisites and the congestion control modules<\/h2><pre class=\"wp-block-code\"><code>sysctl net.ipv4.tcp_available_congestion_control\n# default on modern kernels includes bbr\nlsmod | grep tcp_bbr || modprobe tcp_bbr\nsysctl -w net.core.default_qdisc=fq\nsysctl -w net.ipv4.tcp_congestion_control=bbr\n# persist in \/etc\/sysctl.d\/99-bbr.conf<\/code><\/pre><p class=\"wp-block-paragraph\"><code>fq<\/code> (fair queueing) is the pacing qdisc BBR depends on. Without it BBR still works but loses its pacing advantage. Verify the effective setting after applying:<\/p><pre class=\"wp-block-code\"><code>sysctl net.ipv4.tcp_congestion_control net.core.default_qdisc\n# net.ipv4.tcp_congestion_control = bbr\n# net.core.default_qdisc = fq<\/code><\/pre><h2 class=\"wp-block-heading\">Design the test before you touch anything<\/h2><ul class=\"wp-block-list\"><li>Fix variables: same client, same server, same time of day, same payload size.<\/li><li>Test both directions separately (upload and download).<\/li><li>Measure at least three metrics: throughput, RTT, and retransmits.<\/li><li>Repeat each run 5x and take the median \u2014 single runs are noise.<\/li><\/ul><p class=\"wp-block-paragraph\">For a fair comparison, benchmark the same link twice: once with CUBIC, once with BBR, changing only <code>tcp_congestion_control<\/code>.<\/p><pre class=\"wp-block-code\"><code># server side: keep iperf3 listening\n iperf3 -s\n\n# client, CUBIC run (revert first)\nsysctl -w net.ipv4.tcp_congestion_control=cubic\niperf3 -c SERVER_IP -t 30 -R --json &gt; cubic_reverse.json\n\n# client, BBR run\nsysctl -w net.ipv4.tcp_congestion_control=bbr\niperf3 -c SERVER_IP -t 30 -R --json &gt; bbr_reverse.json<\/code><\/pre><h2 class=\"wp-block-heading\">Reading the results, not just the Mbps number<\/h2><figure class=\"wp-block-table\"><table><thead><tr><th>Metric<\/th><th>Where it shows up<\/th><th>What it tells you<\/th><\/tr><\/thead><tbody><tr><td>Throughput<\/td><td>iperf3 sum bits\/sec<\/td><td>Raw goodput \u2014 but a clean link shows little difference<\/td><\/tr><tr><td>RTT<\/td><td>&#8211;json end.sum_rtt<\/td><td>BBR&#8217;s model reacts to RTT; sanity-check path latency<\/td><\/tr><tr><td>Retransmits<\/td><td>TCPRetransmits \/ ss -ti<\/td><td>Loss on the path is where BBR usually wins<\/td><\/tr><tr><td>Delivery rate<\/td><td>ss -ti &#8216;bw =&#8217;<\/td><td>Per-socket estimate of achieved rate<\/td><\/tr><\/tbody><\/table><\/figure><p class=\"wp-block-paragraph\">If your link has effectively zero loss, expect CUBIC and BBR within a few percent \u2014 the change is not worth the risk of an untested qdisc. If you see retransmits on the path (common on long-haul or congested uplinks), BBR typically recovers more throughput because it does not interpret loss as a hard capacity signal.<\/p><h2 class=\"wp-block-heading\">Confirm at the socket level<\/h2><pre class=\"wp-block-code\"><code># watch per-connection congestion state and delivery rate\nss -ti dst SERVER_IP\n# look for: bbr  cwnd:..  rtt:..  bw:..<\/code><\/pre><p class=\"wp-block-paragraph\">A BBR socket reports <code>bbr<\/code> as the algorithm and exposes <code>bw<\/code> (delivery rate). If you still see <code>cubic<\/code>, your sysctl was not applied to new sockets \u2014 existing connections keep their original algorithm.<\/p><h2 class=\"wp-block-heading\">Caveats specific to VPS hosts<\/h2><ul class=\"wp-block-list\"><li>Bufferbloat elsewhere on the path can mask BBR&#8217;s benefit; fix the queue first if local (see fq_codel\/CAKE).<\/li><li>BBR is sender-side; you control only your VPS, not the remote peer.<\/li><li>BBR competes differently with loss-based flows sharing the same bottleneck \u2014 do not assume you win every time.<\/li><li>CPU-sensitive: on a single-vCPU box, high-rate BBR can cost measurable CPU versus CUBIC.<\/li><\/ul><h2 class=\"wp-block-heading\">Running the benchmark across real latency<\/h2><p class=\"wp-block-paragraph\">iperf3 on a LAN tells you almost nothing about a WAN path. To make the test meaningful, inject latency and loss so the difference between algorithms has room to show. <code>tc netem<\/code> on a test interface lets you reproduce a realistic path deterministically:<\/p><pre class=\"wp-block-code\"><code># on a test host, add 100ms RTT and 1% loss outbound\nsudo tc qdisc add dev eth0 root netem delay 50ms loss 1%\n\n# now repeat the CUBIC and BBR iperf3 runs\nsudo tc qdisc del dev eth0 root   # remove when done<\/code><\/pre><p class=\"wp-block-paragraph\">With 50ms one-way delay and 1% loss, CUBIC typically backs off hard on each loss event while BBR holds throughput closer to the path&#8217;s capacity. That is the scenario where the change pays for itself \u2014 and the scenario a clean LAN test would never reveal.<\/p><h2 class=\"wp-block-heading\">Turning results into a decision<\/h2><figure class=\"wp-block-table\"><table><thead><tr><th>Your path looks like<\/th><th>Expected BBR gain<\/th><th>Recommendation<\/th><\/tr><\/thead><tbody><tr><td>Clean LAN \/ loopback<\/td><td>~0%<\/td><td>Leave CUBIC; no benefit, added complexity<\/td><\/tr><tr><td>Low RTT, no loss<\/td><td>&lt;5%<\/td><td>Not worth changing on a production box<\/td><\/tr><tr><td>High RTT + loss<\/td><td>Often 20\u2013200%<\/td><td>Enable BBR + fq and re-measure<\/td><\/tr><tr><td>Shared bottleneck, many flows<\/td><td>Variable<\/td><td>Test under realistic contention before committing<\/td><\/tr><\/tbody><\/table><\/figure><p class=\"wp-block-paragraph\">Roll it out the way you would any other kernel tuning: on one host, measured before and after, with a rollback command ready. To revert, set <code>net.ipv4.tcp_congestion_control=cubic<\/code> and remove the <code>default_qdisc<\/code> line, then confirm new sockets report the old algorithm.<\/p><p class=\"wp-block-paragraph\">Change one dial at a time, measure the same path before and after, and keep a note of the kernel version \u2014 BBR&#8217;s behaviour has evolved. For a workload where every millisecond of TTFB counts, combine this with latency reduction work at the edge rather than tuning the transport in isolation \u2014 the <a href=\"https:\/\/virtualserversvps.com\/blog\/reducing-vps-latency-ttfb-cdn-edge-caching\/\">TTFB and edge-caching approach<\/a> stacks well with a tuned transport.<\/p><p class=\"wp-block-paragraph\">On a modest cloud instance, this is one of the few kernel changes with a large, repeatable upside on real-world traffic, provided you validate it on a path that actually has loss. Skip the validation and you are just hoping.<\/p>","protected":false},"excerpt":{"rendered":"<p>Switching a VPS to BBR is a two-line change that people either swear by or claim does nothing. The truth is measured: BBR helps most on links with loss and&#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":2,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1386","post","type-post","status-publish","format-standard","hentry","category-vps-guides-tutorials"],"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 vs CUBIC on a VPS: A Reproducible Benchmark Methodology - Virtual Servers VPS Blog<\/title>\n<meta name=\"description\" content=\"Switching a VPS to BBR is a two-line change that people either swear by or claim does nothing. The truth is measured: BBR helps most on links with loss\" \/>\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\/vps-tcp-bbr-congestion-control-benchmarks\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TCP BBR vs CUBIC on a VPS: A Reproducible Benchmark Methodology\" \/>\n<meta property=\"og:description\" content=\"TCP BBR vs CUBIC on a VPS: A Reproducible Benchmark Methodology\" \/>\n<meta property=\"og:url\" content=\"https:\/\/virtualserversvps.com\/blog\/vps-tcp-bbr-congestion-control-benchmarks\/\" \/>\n<meta property=\"og:site_name\" content=\"Virtual Servers VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-13T22:35:37+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=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/vps-tcp-bbr-congestion-control-benchmarks\/\",\"url\":\"https:\/\/virtualserversvps.com\/blog\/vps-tcp-bbr-congestion-control-benchmarks\/\",\"name\":\"TCP BBR vs CUBIC on a VPS: A Reproducible Benchmark Methodology - Virtual Servers VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#website\"},\"datePublished\":\"2026-10-13T22:35:37+00:00\",\"author\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0\"},\"description\":\"Switching a VPS to BBR is a two-line change that people either swear by or claim does nothing. The truth is measured: BBR helps most on links with loss\",\"breadcrumb\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/vps-tcp-bbr-congestion-control-benchmarks\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/virtualserversvps.com\/blog\/vps-tcp-bbr-congestion-control-benchmarks\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/vps-tcp-bbr-congestion-control-benchmarks\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/virtualserversvps.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TCP BBR vs CUBIC on a VPS: A Reproducible Benchmark Methodology\"}]},{\"@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 vs CUBIC on a VPS: A Reproducible Benchmark Methodology - Virtual Servers VPS Blog","description":"Switching a VPS to BBR is a two-line change that people either swear by or claim does nothing. The truth is measured: BBR helps most on links with loss","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\/vps-tcp-bbr-congestion-control-benchmarks\/","og_locale":"en_US","og_type":"article","og_title":"TCP BBR vs CUBIC on a VPS: A Reproducible Benchmark Methodology","og_description":"TCP BBR vs CUBIC on a VPS: A Reproducible Benchmark Methodology","og_url":"https:\/\/virtualserversvps.com\/blog\/vps-tcp-bbr-congestion-control-benchmarks\/","og_site_name":"Virtual Servers VPS Blog","article_published_time":"2026-10-13T22:35:37+00:00","author":"Virtual-Servers-Vps-Editor","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Virtual-Servers-Vps-Editor","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/virtualserversvps.com\/blog\/vps-tcp-bbr-congestion-control-benchmarks\/","url":"https:\/\/virtualserversvps.com\/blog\/vps-tcp-bbr-congestion-control-benchmarks\/","name":"TCP BBR vs CUBIC on a VPS: A Reproducible Benchmark Methodology - Virtual Servers VPS Blog","isPartOf":{"@id":"https:\/\/virtualserversvps.com\/blog\/#website"},"datePublished":"2026-10-13T22:35:37+00:00","author":{"@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0"},"description":"Switching a VPS to BBR is a two-line change that people either swear by or claim does nothing. The truth is measured: BBR helps most on links with loss","breadcrumb":{"@id":"https:\/\/virtualserversvps.com\/blog\/vps-tcp-bbr-congestion-control-benchmarks\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/virtualserversvps.com\/blog\/vps-tcp-bbr-congestion-control-benchmarks\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/virtualserversvps.com\/blog\/vps-tcp-bbr-congestion-control-benchmarks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/virtualserversvps.com\/blog\/"},{"@type":"ListItem","position":2,"name":"TCP BBR vs CUBIC on a VPS: A Reproducible Benchmark Methodology"}]},{"@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\/1386","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=1386"}],"version-history":[{"count":2,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1386\/revisions"}],"predecessor-version":[{"id":1395,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1386\/revisions\/1395"}],"wp:attachment":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/media?parent=1386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/categories?post=1386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/tags?post=1386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}