Autoscaling — Delay, Overshoot and Standing Headroom
Why a scaling loop with a delay must keep spare capacity it never uses, and exactly how long a system stays behind after a load step.
What the delay costs
Suppose the system has capacity and offered load steps from to at time , and that new capacity becomes available only at time . Then the backlog at time is
independent of the scaling policy.
How long the system stays behind
With capacity raised to at time , the backlog clears at
Key idea
Read the formula as a warning about timid scaling. Scaling to only just above makes the denominator small and the recovery time blow up: provisioning 10% above the new load when the step was 50% gives — with , , — which is . Overshooting to gives . Deliberate overshoot is how a scaler recovers quickly, and it is cheap because it is transient.
The headroom you must always carry
To absorb an instantaneous load step by a factor with no backlog at all, the pre-step utilisation must satisfy
So absorbing a doubling requires running at 50%; absorbing a 4× spike requires 25%. Combined with the utilisation wall — which already forbids running near 1 — this is the quantitative case against "scale to zero and react", and it explains why serving fleets look over-provisioned when measured by average utilisation alone.
Heuristic — a reasoning shortcut that predicts the right answer in the regimes discussed here. It is not a proof and can fail outside them.
Utilisation is bounded above by and saturates: at and it reads almost the same, while latency differs by a factor of . Queue depth and queueing delay are unbounded and grow monotonically with excess load, so they distinguish the two. A controller that targets queueing delay therefore has a usable error signal in exactly the regime where a utilisation-based controller has none.
Assumptions
This is an argument from the shape of the signals, not a theorem about a specific controller. Its force depends on the delay measurement being timely: a queueing-delay estimate averaged over a window longer than reintroduces the blindness it was meant to remove.
What this does not say
This page models capacity as a number that changes at time . For model serving it is not: a new replica must load tens of gigabytes of weights and warm its caches before it is useful, so there is a further interval during which the replica exists, consumes quota, and serves nothing — and if the load balancer routes to it on readiness rather than warmth, it will serve that traffic slowly. Weight-loading time is the dominant term in for LLM serving, which is why snapshotting and pre-warming pools matter more here than in a stateless web tier.
References
- PaperA. Gandhi, M. Harchol-Balter, R. Raghunathan, M. A. Kozuch (2012). AutoScale: Dynamic, Robust Capacity Management for Multi-Tier Data CentersStudies the setup-delay problem and argues for keeping idle capacity, consistent with the headroom corollary.
These works are cited as sources to read, not reproduced. All exposition, examples and problems on this site are written independently; where an argument is standard, the citation points to a canonical treatment.
Results stated on this page
- PropositionBacklog accumulated during the scaling delayproof includedA load step above capacity builds a backlog equal to the excess rate times the delay, whatever the controller does afterwards.
- TheoremRecovery time after a load stepproof includedTime to clear the backlog is the delay multiplied by the ratio of total capacity added to the surplus over the new load.
- CorollaryStanding headroom needed to absorb a stepproof includedTo absorb a load step of factor g without any backlog, steady-state utilisation must not exceed 1/g.
- HeuristicScale on queueing delay rather than utilisationUtilisation is a bounded signal that saturates before the SLO breaks, while queue depth keeps growing, making it the better controller input.