{"id":244478,"date":"2026-05-12T09:04:00","date_gmt":"2026-05-12T13:04:00","guid":{"rendered":"https:\/\/news-you-need.com\/index.php\/2026\/05\/12\/when-idle-isnt-idle-how-a-linux-kernel-optimization-became-a-quic-bug\/"},"modified":"2026-05-12T12:25:09","modified_gmt":"2026-05-12T16:25:09","slug":"when-idle-isnt-idle-how-a-linux-kernel-optimization-became-a-quic-bug","status":"publish","type":"post","link":"https:\/\/news-you-need.com\/index.php\/2026\/05\/12\/when-idle-isnt-idle-how-a-linux-kernel-optimization-became-a-quic-bug\/","title":{"rendered":"When &#8220;idle&#8221; isn&#8217;t idle: how a Linux kernel optimization became a QUIC bug"},"content":{"rendered":"<p><a href=\"https:\/\/blog.cloudflare.com\/quic-death-spiral-fix\/\">When &#8220;idle&#8221; isn&#8217;t idle: how a Linux kernel optimization became a QUIC bug<\/a><\/p>\n<p><a href=\"https:\/\/blog.cloudflare.com\/quic-death-spiral-fix\/\">https:\/\/blog.cloudflare.com\/quic-death-spiral-fix\/<\/a><\/p>\n<p>Publish Date: <a href=\"publish_date]\">2026-05-12 09:04:00<\/a><\/p>\n<p>Source Domain: <a href=\"blog.cloudflare.com\">blog.cloudflare.com<\/a><\/p>\n<p>CUBIC, standardized in RFC 9438, is the default congestion controller in Linux, and as a result governs how most TCP and QUIC connections on the public Internet probe for available bandwidth, back off when they detect loss, and recover afterward. At Cloudflare, our open-source implementation of QUIC, quiche, uses CUBIC as its default congestion controller, meaning this code is in the critical path for a significant share of the traffic we serve.<\/p>\n<p>In this post, we\u2019ll tell the story of a bug in which CUBIC&#8217;s congestion window (cwnd) gets permanently pinned at its minimum and never recovers from a congestion collapse event.<\/p>\n<p>The story starts with a Linux kernel change aimed at bringing CUBIC into line with the app-limited exclusion described in RFC 9438 \u00a74.2-12 \u2014 a fix to a real problem in TCP that, when ported to our QUIC implementation, surfaced unexpected behaviors in quiche. It has a happy ending: an elegant (near-)one-line fix that broke the cycle.<\/p>\n<h2 id=\"cubics-logic-in-a-nutshell\">CUBIC&#8217;s logic in a nutshell<\/h2>\n<p>Before we dive into the core problem, a quick refresher on CCAs may help to set the stage.<\/p>\n<p>The central knob a CCA turns is the congestion window (cwnd): the sender-side cap on how many bytes can be in flight (sent but not yet acknowledged) at any moment. A larger cwnd lets the sender push more data per round trip; a smaller cwnd throttles it. Every loss-based CCA, CUBIC included, is ultimately a policy for how to grow cwnd when the network looks healthy and how to shrink it when it doesn&#8217;t.<\/p>\n<p>In essence, CCAs aim to maximize data transfer by inferring the &#8220;available bandwidth&#8221; of the network; because no one wants to pay for a 1 Gbps subscription and only use a fraction of it. The family of loss-based algorithms, to which CUBIC belongs, operate on a fundamental premise: (1) if there is no packet loss, increase the sending rate (i.e. increase the bandwidth utilization); (2) if there is loss, loss-based algorithms assume that the network&#8217;s capacity has&#8230;<\/p>\n<p><a href=\"https:\/\/blog.cloudflare.com\/quic-death-spiral-fix\/\">Source<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>When &#8220;idle&#8221; isn&#8217;t idle: how a Linux kernel optimization became a QUIC bug https:\/\/blog.cloudflare.com\/quic-death-spiral-fix\/ Publish&#8230;<\/p>\n","protected":false},"author":1,"featured_media":244480,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/cf-assets.www.cloudflare.com\/zkvhlag99gkb\/42x9UUV0RORhrj931PDGj6\/cc8f8122d0bc8aa482d40fa3579e9b5c\/When_-idle-_isn-t_idle-_how_a_Linux_kernel_optimization_became_a_QUIC_bug-OG.png","fifu_image_alt":"","footnotes":""},"categories":[48],"tags":[71],"class_list":["post-244478","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","tag-linux"],"_links":{"self":[{"href":"https:\/\/news-you-need.com\/index.php\/wp-json\/wp\/v2\/posts\/244478"}],"collection":[{"href":"https:\/\/news-you-need.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/news-you-need.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/news-you-need.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/news-you-need.com\/index.php\/wp-json\/wp\/v2\/comments?post=244478"}],"version-history":[{"count":1,"href":"https:\/\/news-you-need.com\/index.php\/wp-json\/wp\/v2\/posts\/244478\/revisions"}],"predecessor-version":[{"id":244481,"href":"https:\/\/news-you-need.com\/index.php\/wp-json\/wp\/v2\/posts\/244478\/revisions\/244481"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/news-you-need.com\/index.php\/wp-json\/wp\/v2\/media\/244480"}],"wp:attachment":[{"href":"https:\/\/news-you-need.com\/index.php\/wp-json\/wp\/v2\/media?parent=244478"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/news-you-need.com\/index.php\/wp-json\/wp\/v2\/categories?post=244478"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/news-you-need.com\/index.php\/wp-json\/wp\/v2\/tags?post=244478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}