ISS
← Field Notes
AI & AGENTS
September 4, 2026 · AI & Agents · 4 min read

Why Scaling Infrastructure Fails Before Throughput Does

Most infrastructure doesn't fall over because it ran out of capacity. It falls over because the number of things you have to keep alive grew faster than your ability to reason about them.

There is a comfortable story we tell about scale: the system is fine until traffic arrives, and then throughput becomes the wall. Add machines, add replicas, add a cache, and the wall moves back. It is a story about capacity, and capacity is the part everybody instruments.

It is also, in my experience, almost never the thing that breaks first.

What breaks first is operational surface area: the count of independent things that must each be configured, patched, restarted, monitored, and understood. Throughput scales with hardware. Surface area scales with decisions, and nobody puts a dashboard on decisions.

The shape of the failure

Here is a concrete case. A fleet of small static sites, each one deployed the obvious way: its own container, its own image, its own restart policy, its own line in the process table. Individually, every one of these was correct. Each container was tiny, healthy, and doing its job.

Collectively they were a liability, and the liability had nothing to do with load. These are static sites. They serve a few kilobytes of HTML and never break a sweat. Throughput was never the question.

The question was that the host was running 187 containers, and roughly a third of them existed only to hand back files that never change. That is 187 units of "something could be misconfigured here." 187 images to keep current. 187 restart policies that all wake up together after a reboot and stampede the same few seconds of CPU. Every one of them was a place where a future 3 a.m. could start.

None of that shows up in a throughput graph. It shows up as the slow, ambient tax of a system that has more moving parts than it needs, right up until one of those parts moves wrong.

Consolidation is a capacity decision in disguise

The fix was boring, which is how you know it was the right one. Sixty-seven of those containers were replaced by one hardened static server, reading the same files from disk and routing every domain through the existing proxy by label. No user could tell the difference. Every site returned exactly what it returned before.

The running container count dropped from 187 to 123 in an afternoon, and the part that mattered was not the number. It was that a third of the fleet's operational surface area simply stopped existing. A third fewer images to patch. A third fewer things to restart. A third fewer places for a config to rot.

The interesting move is that this looks like a cleanup task and behaves like a capacity decision. You did not add headroom by buying it. You added it by no longer spending attention on things that did not deserve any. Attention is the scarce resource in operations, and it is the one that never appears in the capacity plan.

What actually scales

The teams that stay stable under growth are not the ones with the most capacity. They are the ones who keep the number of things-to-reason-about growing slower than the system itself. A few principles fall out of that, and they are the ones I keep coming back to:

  • Count your units, not just your load. If you cannot say how many independently-failing components you run, you are already past the point where you can reason about them. The number itself is a health metric.
  • Collapse anything that shares a lifecycle. Sites that all serve static files, deploy the same way, and never change independently do not need independent runtimes. Shared lifecycle is a signal to share infrastructure.
  • Preserve before you prune. Consolidation only feels safe when rollback is free. Every retired component in that migration was archived to a runnable image before it was removed, and the source was kept on disk. You move fast precisely because undo is cheap.
  • Boring wins. The change that removes a third of your surface area with zero user-visible effect will never be the exciting one in the room. It is almost always the one worth doing first.

The uncomfortable part

Most of the infrastructure I get called in to stabilize is not under-provisioned. It is over-articulated: too many services, too many special cases, too many things that were each individually reasonable and collectively unownable. The instinct under pressure is to add, because adding is legible and removing feels like risk.

But the systems that don't break under load are usually the ones that were kept deliberately small in the number of things you have to hold in your head at once. Throughput you can buy. Surface area you have to choose, over and over, against the constant temptation to add one more container that was, at the time, completely reasonable.


This is the first of an ongoing series of field notes on operating systems that don't fall over. If your infrastructure has grown more parts than owners, that's the kind of thing I fix.

Have something that needs building, or stabilizing?

These notes are the work log. The paid work runs through Moonshine Labs, my product and engineering studio. Tell us what you're building, or grab a call.

Work with us →
the studio: moonshinelabs.io