<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Blog - Konrad Kowalski (rootsher)</title>
<link>https://blog.rootsher.dev/en</link>
<atom:link href="https://blog.rootsher.dev/en/feed.xml" rel="self" type="application/rss+xml"/>
<description>Notes from the engine room: systems, reliability, tooling. Written when the problem turned out to be more interesting than the fix.</description>
<language>en-gb</language>
<lastBuildDate>Wed, 02 Sep 2026 09:00:00 GMT</lastBuildDate>
<item><title>Anatomy of a CPU problem: from an understated request to p99 latency</title><link>https://blog.rootsher.dev/en/anatomy-of-a-cpu-problem</link><guid isPermaLink="true">https://blog.rootsher.dev/en/anatomy-of-a-cpu-problem</guid><pubDate>Wed, 02 Sep 2026 09:00:00 GMT</pubDate><category>Capacity &amp; Performance</category><description>One incident end to end: a 500m request, no limit, no throttling, and p99 climbing from 35 to 180 ms. The whole path of the mechanism.</description></item><item><title>Noisy neighbor and CPU overcommit: when one Pod breaks another</title><link>https://blog.rootsher.dev/en/noisy-neighbor-and-cpu-overcommit</link><guid isPermaLink="true">https://blog.rootsher.dev/en/noisy-neighbor-and-cpu-overcommit</guid><pubDate>Tue, 25 Aug 2026 09:00:00 GMT</pubDate><category>Capacity &amp; Performance</category><description>Overcommit works until bursts become correlated. An understated request is not only about placement - it is a weaker position under contention.</description></item><item><title>How to debug CPU in Kubernetes without guessing</title><link>https://blog.rootsher.dev/en/debugging-cpu-in-kubernetes</link><guid isPermaLink="true">https://blog.rootsher.dev/en/debugging-cpu-in-kubernetes</guid><pubDate>Tue, 18 Aug 2026 09:00:00 GMT</pubDate><category>Observability</category><description>Usage, throttling, contention and pressure are four different phenomena. A single CPU chart settles none of them - you need an order of operations.</description></item><item><title>NUMA, SMT and cache: when hardware topology starts to matter</title><link>https://blog.rootsher.dev/en/numa-smt-and-cache</link><guid isPermaLink="true">https://blog.rootsher.dev/en/numa-smt-and-cache</guid><pubDate>Tue, 04 Aug 2026 09:00:00 GMT</pubDate><category>Computer Science</category><description>Two workloads can get the same CPU time and do different amounts of work. This is where the CPU abstraction ends and the physics of the machine begins.</description></item><item><title>Why 1 CPU does not mean one core</title><link>https://blog.rootsher.dev/en/one-cpu-is-not-one-core</link><guid isPermaLink="true">https://blog.rootsher.dev/en/one-cpu-is-not-one-core</guid><pubDate>Tue, 21 Jul 2026 09:00:00 GMT</pubDate><category>Containers</category><description>CPU time and CPU placement are two different mechanisms. A limit says how much you may consume; affinity and cpuset say where a task may execute.</description></item><item><title>Requests, Limits and QoS: how Kubernetes classifies Pods</title><link>https://blog.rootsher.dev/en/requests-limits-and-qos</link><guid isPermaLink="true">https://blog.rootsher.dev/en/requests-limits-and-qos</guid><pubDate>Tue, 07 Jul 2026 09:00:00 GMT</pubDate><category>Containers</category><description>A QoS class is the result of how requests and limits are configured, not a separate CPU allocation mechanism. Guaranteed is not a dedicated core.</description></item><item><title>PSI: how Linux measures real CPU pressure</title><link>https://blog.rootsher.dev/en/psi-cpu-pressure</link><guid isPermaLink="true">https://blog.rootsher.dev/en/psi-cpu-pressure</guid><pubDate>Tue, 23 Jun 2026 09:00:00 GMT</pubDate><category>Observability</category><description>Utilisation says how much CPU a workload got. PSI measures the time it lost because it wanted to execute and had nothing to execute on.</description></item><item><title>CPU Contention: when a process wants CPU and does not get it</title><link>https://blog.rootsher.dev/en/cpu-contention</link><guid isPermaLink="true">https://blog.rootsher.dev/en/cpu-contention</guid><pubDate>Tue, 09 Jun 2026 09:00:00 GMT</pubDate><category>Capacity &amp; Performance</category><description>With no limit at all a process can sit and wait. All it takes is runnable demand exceeding available capacity - and you only see it in latency.</description></item><item><title>CPU Limits and throttling: what a CPU limit really does</title><link>https://blog.rootsher.dev/en/cpu-limits-and-throttling</link><guid isPermaLink="true">https://blog.rootsher.dev/en/cpu-limits-and-throttling</guid><pubDate>Tue, 26 May 2026 09:00:00 GMT</pubDate><category>Containers</category><description>A limit does not pin a container to a core. It gives it a CPU-time budget accounted per period, and once that runs out the kernel throttles it.</description></item><item><title>CPU Requests in Kubernetes: what they really are</title><link>https://blog.rootsher.dev/en/cpu-requests-in-kubernetes</link><guid isPermaLink="true">https://blog.rootsher.dev/en/cpu-requests-in-kubernetes</guid><pubDate>Tue, 12 May 2026 09:00:00 GMT</pubDate><category>Containers</category><description>A request is a declaration of demand, not a ceiling. It feeds placement in kube-scheduler and CPU weight on the kernel side.</description></item><item><title>cgroups and CPU: how Linux splits the processor between groups of processes</title><link>https://blog.rootsher.dev/en/cgroups-and-cpu</link><guid isPermaLink="true">https://blog.rootsher.dev/en/cgroups-and-cpu</guid><pubDate>Tue, 28 Apr 2026 09:00:00 GMT</pubDate><category>Infrastructure</category><description>Group scheduling, cpu.weight and hierarchy - how the kernel divides CPU between groups of processes instead of individual tasks.</description></item><item><title>How Linux really gives a process CPU</title><link>https://blog.rootsher.dev/en/how-linux-gives-a-process-cpu</link><guid isPermaLink="true">https://blog.rootsher.dev/en/how-linux-gives-a-process-cpu</guid><pubDate>Tue, 14 Apr 2026 09:00:00 GMT</pubDate><category>Computer Science</category><description>A process does not "have CPU". It is ready to run, and the scheduler decides when it actually gets processor time.</description></item><item><title>CPU in Kubernetes from the kernel up</title><link>https://blog.rootsher.dev/en/cpu-in-kubernetes-from-the-kernel-up</link><guid isPermaLink="true">https://blog.rootsher.dev/en/cpu-in-kubernetes-from-the-kernel-up</guid><pubDate>Tue, 07 Apr 2026 09:00:00 GMT</pubDate><category>Capacity &amp; Performance</category><description>A CPU model built bottom-up: from runnable tasks and the scheduler, through cgroups, requests and limits, to throttling, contention, PSI and diagnostics.</description></item><item><title>Modern rendering is composition</title><link>https://blog.rootsher.dev/en/rendering-as-composition</link><guid isPermaLink="true">https://blog.rootsher.dev/en/rendering-as-composition</guid><pubDate>Tue, 11 Nov 2025 09:00:00 GMT</pubDate><category>Frontend</category><description>Rendering stopped being a single stage. It is the placement of work across time, space and runtimes, and the framework is a consequence of those decisions.</description></item><item><title>Server Components: moving the execution boundary</title><link>https://blog.rootsher.dev/en/server-components</link><guid isPermaLink="true">https://blog.rootsher.dev/en/server-components</guid><pubDate>Tue, 08 Jul 2025 09:00:00 GMT</pubDate><category>Frontend</category><description>The rendering boundary stops running through the page and starts running through the module graph. Some components never have a client-side implementation.</description></item><item><title>Resumability: what if we don't hydrate at all?</title><link>https://blog.rootsher.dev/en/resumability</link><guid isPermaLink="true">https://blog.rootsher.dev/en/resumability</guid><pubDate>Tue, 11 Mar 2025 09:00:00 GMT</pubDate><category>Frontend</category><description>The server records enough information that the client never rebuilds the component tree. Code loads because execution became necessary.</description></item><item><title>Islands architecture: interactive fragments in a mostly static document</title><link>https://blog.rootsher.dev/en/islands-architecture</link><guid isPermaLink="true">https://blog.rootsher.dev/en/islands-architecture</guid><pubDate>Tue, 12 Nov 2024 09:00:00 GMT</pubDate><category>Frontend</category><description>The starting point stops being the application. The page is a document, and only the fragments that truly need a client runtime get one.</description></item><item><title>Selective and progressive hydration: not everything deserves CPU now</title><link>https://blog.rootsher.dev/en/selective-and-progressive-hydration</link><guid isPermaLink="true">https://blog.rootsher.dev/en/selective-and-progressive-hydration</guid><pubDate>Tue, 09 Jul 2024 09:00:00 GMT</pubDate><category>Frontend</category><description>Hydration stops being one startup task. Client CPU becomes a resource allocated by priority and by the user's real intent.</description></item><item><title>Edge rendering: compute moved closer to the user</title><link>https://blog.rootsher.dev/en/edge-rendering</link><guid isPermaLink="true">https://blog.rootsher.dev/en/edge-rendering</guid><pubDate>Tue, 12 Mar 2024 09:00:00 GMT</pubDate><category>Frontend</category><description>Moving compute closer to the user only pays off when the data travels with it. Otherwise we shorten one hop and lengthen the rest.</description></item><item><title>Partial Prerendering: one page, several clocks</title><link>https://blog.rootsher.dev/en/partial-prerendering</link><guid isPermaLink="true">https://blog.rootsher.dev/en/partial-prerendering</guid><pubDate>Tue, 14 Nov 2023 09:00:00 GMT</pubDate><category>Frontend</category><description>The route stops being the unit of decision. A static shell is produced earlier, dynamic fragments arrive at request time or through the stream.</description></item><item><title>Streaming SSR: stop waiting for the whole tree</title><link>https://blog.rootsher.dev/en/streaming-ssr</link><guid isPermaLink="true">https://blog.rootsher.dev/en/streaming-ssr</guid><pubDate>Tue, 09 May 2023 09:00:00 GMT</pubDate><category>Frontend</category><description>The response stops being atomic. The server sends finished fragments and the slowest dependency no longer blocks the entire document.</description></item><item><title>Revalidation and ISR: static output that expires</title><link>https://blog.rootsher.dev/en/revalidation-and-isr</link><guid isPermaLink="true">https://blog.rootsher.dev/en/revalidation-and-isr</guid><pubDate>Tue, 10 Jan 2023 09:00:00 GMT</pubDate><category>Frontend</category><description>ISR is not a separate rendering category but a cache with controlled inconsistency: precomputed HTML, expiration and regeneration.</description></item><item><title>Deferred generation: don't build what nobody requests</title><link>https://blog.rootsher.dev/en/deferred-generation</link><guid isPermaLink="true">https://blog.rootsher.dev/en/deferred-generation</guid><pubDate>Tue, 13 Sep 2022 09:00:00 GMT</pubDate><category>Frontend</category><description>The request stops being the moment of rendering and becomes a trigger for materialising an artifact. The first user pays, everyone after gets a file.</description></item><item><title>SSG: rendering before the user exists</title><link>https://blog.rootsher.dev/en/static-site-generation</link><guid isPermaLink="true">https://blog.rootsher.dev/en/static-site-generation</guid><pubDate>Tue, 10 May 2022 09:00:00 GMT</pubDate><category>Frontend</category><description>Build-time rendering trades request cost for build cost. You pay once, serve cheaply, and start having a data freshness problem.</description></item><item><title>Hydration: connecting HTML with a working application</title><link>https://blog.rootsher.dev/en/hydration</link><guid isPermaLink="true">https://blog.rootsher.dev/en/hydration</guid><pubDate>Tue, 11 Jan 2022 09:00:00 GMT</pubDate><category>Frontend</category><description>The server sends the result of rendering, not the application. The browser has to rebuild the component tree and wire it to the existing DOM.</description></item><item><title>SSR returns: the server renders HTML again</title><link>https://blog.rootsher.dev/en/ssr-returns</link><guid isPermaLink="true">https://blog.rootsher.dev/en/ssr-returns</guid><pubDate>Tue, 14 Sep 2021 09:00:00 GMT</pubDate><category>Frontend</category><description>The server renders the first view not to make the frontend disappear, but to make content exist earlier. The rest of the cost stays on the client.</description></item><item><title>The cost of shipping the application to the browser</title><link>https://blog.rootsher.dev/en/the-cost-of-shipping-the-application</link><guid isPermaLink="true">https://blog.rootsher.dev/en/the-cost-of-shipping-the-application</guid><pubDate>Tue, 11 May 2021 09:00:00 GMT</pubDate><category>Frontend</category><description>Transfer size is the first cost, not the only one. What counts is the work the device must do before the application becomes usable.</description></item><item><title>SPA and CSR: when the browser took over the application</title><link>https://blog.rootsher.dev/en/spa-and-client-side-rendering</link><guid isPermaLink="true">https://blog.rootsher.dev/en/spa-and-client-side-rendering</guid><pubDate>Tue, 12 Jan 2021 09:00:00 GMT</pubDate><category>Frontend</category><description>The browser downloads the document once and manages screen transitions itself. The frontend stops being a presentation layer and becomes a long-lived runtime.</description></item><item><title>AJAX: the moment a page started behaving like an application</title><link>https://blog.rootsher.dev/en/ajax-and-the-first-dynamic-clients</link><guid isPermaLink="true">https://blog.rootsher.dev/en/ajax-and-the-first-dynamic-clients</guid><pubDate>Tue, 08 Sep 2020 09:00:00 GMT</pubDate><category>Frontend</category><description>A request stopped meaning navigation. The browser keeps the current document alive and decides for itself what to do with the server's answer.</description></item><item><title>Server-rendered web: before the frontend became an application</title><link>https://blog.rootsher.dev/en/server-rendered-web</link><guid isPermaLink="true">https://blog.rootsher.dev/en/server-rendered-web</guid><pubDate>Tue, 12 May 2020 09:00:00 GMT</pubDate><category>Frontend</category><description>The server assembled a full document for every request and the browser was a document renderer. A simple model, as long as the whole document could be the unit…</description></item>
</channel>
</rss>