Adding capacity under fire  / field guide
Practitioner field guide · September 2026

Autoscaling fails at the moment you bought it for

The mechanism sold as the answer to demand spikes keeps failing during them, in ways that Netflix wrote down in 2013 and that Slack, AWS, Datadog, Robinhood and Coinbase have re-demonstrated since. This guide reconstructs how spike-surviving systems actually get capacity in place, and gives you the conditions under which reactive scaling is the wrong tool for the very event it is named after.

27 primary sources 12 organisations 6 published incidents Evidence through October 2025 Read: 31 min
01

The territory

The problem, stated without naming a product: when demand rises faster than the capacity behind a service, something must add capacity before queues and timeouts turn the surge into an outage. The record of who wins that race, and how, is unusually public.

284M
Requests per minute at Shopify's edge, BFCM 2024 peak: the rehearsed spike
10–45 min
Instance startup time Netflix measured when it concluded reactive scaling arrives too late
1,200
Servers Slack's autoscaler requested in 14 minutes mid-outage; most never served
13%
Of provisioned CPU actually used across clusters of 50+ CPUs: the price of distrusting elasticity

Start with the surprise, because it reframes everything below. In November 2013, Netflix published the Scryer post, listing the failure modes of reactive autoscaling: instances take 10 to 45 minutes to come up, so capacity arrives after the spike; and an outage makes traffic drop, which "triggers a down scale event, leaving the system under provisioned to handle the ensuing retry storm". Eight years later, on 4 January 2021, Slack's postmortem describes exactly that script running in production: network degradation made web-server CPU drop, automated downscaling shut healthy web servers off in the middle of the incident, and the panicked scale-up that followed buried the provisioning service. The failure mode was published, named and mitigated at one company before most of the industry had adopted the tool that exhibits it.

The second thing the record shows: the teams facing the largest, most predictable spikes do not scale into them. Shopify submits capacity estimates to its cloud providers months ahead and rehearses the scale-up under names like Mayday and Oktoberfest; Netflix built prediction because reaction was too slow; and the newest-generation Kubernetes autoscaler, Karpenter, is adding static capacity and capacity buffers because its users keep asking for ways to not autoscale. Reactive scaling is the tool for the gentle slope: diurnal curves, gradual growth, cost recovery after the peak. For the cliff, production systems use headroom bought in advance, prediction, and load shedding, in that order.

Scope: this guide covers compute capacity under demand surge, meaning the loop from load signal to serving instance, at the VM and container level. It deliberately does not cover scaling stateful stores (a separate dig in this collection covers live resharding), queue backlog management, retry-storm dynamics (also covered separately), serverless cold starts, or GPU/LLM capacity, which has its own economics.

Figure 1 · Four ways the surge beats the autoscaler

A surge arrives:
market open, TV ad, first Monday back,
or the retry storm after an outage

The loop is too slow
capacity lands after the cliff

The signal inverts
failure looks like idleness

Scale-up is a change
adding servers breaks things

The platform below is finite
quota, rate limits, control planes

Robinhood 2020
Coinbase 2022

Slack 2021
Netflix's 2013 warning

AWS Kinesis 2020
Slack provision-service 2021

Datadog 2023
AWS us-east-1 2025

A surge arrives:
market open, TV ad, first Monday back,
or the retry storm after an outage

The loop is too slow
capacity lands after the cliff

The signal inverts
failure looks like idleness

Scale-up is a change
adding servers breaks things

The platform below is finite
quota, rate limits, control planes

Robinhood 2020
Coinbase 2022

Slack 2021
Netflix's 2013 warning

AWS Kinesis 2020
Slack provision-service 2021

Datadog 2023
AWS us-east-1 2025

Every published incident in this guide lands in one of four failure classes, and three of the four have nothing to do with reacting too slowly. Sources: Slack 2021, AWS 2020, Datadog 2023, AWS 2025.
Diagram source
02

How surge-surviving capacity is actually built

No single company runs the whole reference shape below, but every component appears in at least two published systems, and the divergences are themselves decisions (section 03).

Figure 2 · Reference architecture: five planes, two of which most teams skip

Actuation plane

Decision plane

Signal plane

minutes

seconds

protects

Metrics pipeline
scrape ~10s, aggregate ~1min

Forecast + event calendar
(Scryer, BFCM plan)

Reactive controller
(HPA, ASG policy)

Velocity + stabilization policy
(KEP-853 behavior, cooldowns)

Warm pool / capacity buffer /
static floor

Cloud control plane
(quota, API rate limits)

Serving fleet

Admission control + shedding:
the bridge while capacity arrives

Actuation plane

Decision plane

Signal plane

minutes

seconds

protects

Metrics pipeline
scrape ~10s, aggregate ~1min

Forecast + event calendar
(Scryer, BFCM plan)

Reactive controller
(HPA, ASG policy)

Velocity + stabilization policy
(KEP-853 behavior, cooldowns)

Warm pool / capacity buffer /
static floor

Cloud control plane
(quota, API rate limits)

Serving fleet

Admission control + shedding:
the bridge while capacity arrives

The reactive path (signal, decision, actuation) is what vendors sell. The forecast input and the protection path are what the surge survivors add. Reconstructed from Netflix, Shopify, Kubernetes SIG Autoscaling and AWS.
Diagram source

The signal plane is slower than most architects assume. In stock Kubernetes, kubelet scrapes CPU every 10 seconds, Metrics Server collects every minute, the HPA evaluates every 30 seconds and then backs off; the Cluster Autoscaler FAQ puts the honest total at "up to 3 minutes before pods are added or deleted, but usually it's closer to 1 minute". That is the input delay before any decision exists. The systems that survive spikes add a second input that has no delay at all: a calendar. Shopify's capacity planning starts from forecast models and merchant growth projections and, critically, is communicated to the cloud providers early so the physical machines exist in the right regions. Netflix's Scryer generated a per-minute plan from traffic history and drove scaling ahead of need. Prediction here is not exotic machine learning; the highest-value forecast in the record is "Black Friday is on November 28" and "US markets open at 9:30".

The decision plane is where the industry spent a decade arguing, and section 03 covers the argument. The load-bearing point: velocity and stabilization policy (how fast up, how fast down, how long to distrust a dip) is a separate concern from the target-tracking math, and it is per-application, because a checkout tier and a batch fleet have opposite risk profiles. Kubernetes only conceded this in v1.18 (2020) with the behavior field, whose first user story is titled "Scale Up As Fast As Possible" and explicitly accepts false positives on the way up.

The actuation plane is a supply chain, not a function call. A scale-out decision traverses the cloud control plane (which enforces quotas and API rate limits), instance provisioning (the Cluster Autoscaler's measured figure is 3 to 4 minutes on GCE from request to schedulable node), then your own bootstrap: config management, secret issuance, cache warming. Slack's January 2021 outage is the canonical demonstration that this last stage is a production dependency with its own capacity: 1,200 instances were created and "most of them were not fully provisioned and were not serving", because provision-service itself ran over the same degraded network it was trying to route around. Warm pools attack the middle of the chain: AWS claims pre-initialised stopped instances serve "in as low as 30 seconds" (a vendor figure, from the 2021 launch); Karpenter's capacity-buffers RFC generalises the same idea inside Kubernetes after the community requested it at least five times.

The protection path is the component that reframes the whole problem. Capacity cannot arrive in seconds; admission control can act in seconds. When Coinbase's Super Bowl QR code produced 20 million hits on the landing page in a minute, six times anything they had load-tested, what stabilised the site was throttling, not scaling. The architecture conclusion, stated plainly: shedding is the fast path and scaling is the slow path, and a design that has only the slow path has decided, implicitly, to fail closed for everyone instead of degrading for some. (This guide's sibling on queue backlogs covers the shedding mechanics.)

Finally, validation. Facebook's Kraken paper (OSDI 2016) describes continuously load-testing production by shifting live user traffic between data centers, because synthetic tests kept lying about real capacity; the paper credits the practice with over 20% hardware-utilization improvement across three years. Shopify runs the same loop yearly with its Genghis load generator and named scale-up rehearsals. Inferred, but hard to avoid: a scale-up path that has never been exercised at full size is untested code on the critical path, and the incidents in section 04 are what its first execution looks like.

Figure 3 · The reactive pipeline, with its measured delays

Load rises

Scrape + aggregate: 10s to 1min

HPA decision: 30s cycle, up to 3min effective

Cluster Autoscaler: under 30 to 60s (SLO)

Node provisioning: 3 to 4min on GCE
(10 to 45min on EC2 as of 2013)

Bootstrap + warm-up: your code, unmeasured

Capacity serves

Load rises

Scrape + aggregate: 10s to 1min

HPA decision: 30s cycle, up to 3min effective

Cluster Autoscaler: under 30 to 60s (SLO)

Node provisioning: 3 to 4min on GCE
(10 to 45min on EC2 as of 2013)

Bootstrap + warm-up: your code, unmeasured

Capacity serves

Sum the stages and the floor of fully reactive scaling is minutes even when everything works; Netflix's 2013 measurement of 10 to 45 minutes for instance startup made the same point a decade earlier. Figures from the Cluster Autoscaler FAQ (checked 2026-09) and Netflix, 2013.
Diagram source
03

The decisions that matter

Each block is a fork the sources actually argued about, with the condition that flips the answer. The middle one contains a rare artefact: a maintainer position held for three years, recorded in rejected pull requests, then reversed.

Do you scale into a known spike, or provision ahead of it?

Chosen by the spike-exposed
  • Pre-provision to a forecast and rehearse: Shopify files capacity estimates with cloud providers ahead of BFCM and runs named scale-up drills (source)
  • Predict and scale ahead of need: Netflix's Scryer, 2013 (source)
Rejected
  • Trusting reactive scaling for the event itself; Netflix's stated reason is provisioning lag of 10 to 45 minutes against spikes that ramp in minutes
  • Coinbase's load tests bounded at prior benchmarks; the real spike was 6x that (source)
Flips when
  • The ramp is slower than your measured signal-to-serving lead time (diurnal curves, gradual growth): reactive scaling is then the cheaper answer, and the pre-provisioned floor becomes pure waste

Is scaling velocity an API contract, or an implementation detail?

Held 2016–2019
  • PR #32408 (by an HPA maintainer) and PR #34424 both closed unmerged: "scale-up/scale-down windows are internal details of the autoscaling algorithm, so, we don't want to expose it in the API"
  • In #56335: "the forbidden window is an implementation detail that we really shouldn't need at all, so we shouldn't expose it as a knob"
Reversed 2019–2020
  • KEP-853: "users cannot influence scale velocity, and that is a problem for many applications"; shipped as the per-HPA behavior field in v1.18
  • Same maintainers, conceding: "the problem of arbitrary forbidden periods and 2x limit on scale-up is still there and needs to be addressed"
Flips when
  • It doesn't flip back; the transferable rule is that how fast to add and shed capacity encodes business risk (checkout vs batch), and policy that encodes business risk belongs in the interface, however untidy that makes the algorithm

When the world looks broken, should the autoscaler act or freeze?

Freeze (fail static)
  • Cluster Autoscaler halts all operations when more than 45% of nodes (or 3) are unready (FAQ)
  • Slack's incident argues for gating scale-down on health: CPU fell because the network broke, not because load fell (postmortem)
Act (keep scaling)
  • Datadog's cluster-autoscalers correctly kept adding nodes to replace a 60%-lost fleet, up to the 6,000-node cluster maximum, and still had to be manually disabled when the churn saturated Vault (recovery deep dive)
Flips when
  • The anomaly is loss of capacity (nodes gone): act. The anomaly is loss of signal (metrics or dependencies degraded, fleet intact): freeze, especially the scale-down direction. Distinguishing the two requires a health signal independent of the load signal, which is the real design requirement

Figure 4 · Choosing a capacity strategy for a given surge

yes

no

yes

no

yes

no

Is the surge scheduled
or announceable?

Pre-provision to forecast,
file quota early, rehearse
the scale-up (Shopify)

Can the ramp outrun your
measured end-to-end
lead time?

Hold standing headroom,
shed overflow at admission
(Coinbase)

Can your load signal invert
under partial failure?

Reactive scaling, scale-down
gated on independent health
+ stabilization (KEP-853)

Reactive scaling with
velocity caps and a
tested static floor

yes

no

yes

no

yes

no

Is the surge scheduled
or announceable?

Pre-provision to forecast,
file quota early, rehearse
the scale-up (Shopify)

Can the ramp outrun your
measured end-to-end
lead time?

Hold standing headroom,
shed overflow at admission
(Coinbase)

Can your load signal invert
under partial failure?

Reactive scaling, scale-down
gated on independent health
+ stabilization (KEP-853)

Reactive scaling with
velocity caps and a
tested static floor

Terminal nodes are actions, and the first question is about your calendar, not your tooling. Synthesised from the decisions above; the lead-time test comes from the measured delays in Figure 3.
Diagram source
DecisionCommon choiceAlternativeBecauseEvidence
Scaling signalCPU utilisationConcurrency, queue depth, request rateCPU is universal but inverts under dependency failure; Slack ran a CPU-based scale-down and a thread-count scale-up simultaneously during one incidentSlack, 2021
Headroom targetRun hot, reclaim slack (Google Autopilot: 23% slack vs 46% manual)Run cold into known peaks (Shopify BFCM)Slack reclaimed is money; but headroom must exceed what can arrive inside your lead timeAutopilot, 2020 · Shopify
Launch latencyWarm pools / capacity buffersFaster boot, bigger instancesPre-initialised instances cut minutes of bootstrap to a claimed 30 seconds; buffers moved into the autoscaler itself after repeated user demandAWS, 2021 · Karpenter RFC
Static floorPure elasticity, min-replicas onlyExplicit static capacity in the autoscalerKarpenter is adding static NodePools for "performance-critical applications where just-in-time provisioning latency is unacceptable"Karpenter design
Scaling decision logicBuilt-in strategiesPluggable business logicAirbnb outgrew the five built-in expanders and contributed a gRPC plug-point rather than forkingCA proposal · Airbnb, 2022
Overflow handlingQueue and wait for capacityAdmission control and shedCapacity arrives in minutes; throttling acts in seconds and kept Coinbase partially up at 6x tested loadCoinbase, 2022
04

What broke in production

Six published incidents, grouped by the four failure classes of Figure 1. Notice how rarely "the autoscaler reacted too slowly" is the root cause; the deeper pattern is that the capacity machinery itself became the failing system.

The signal inverts, and scale-up is a change

Postmortem

Slack, 4 January 2021: scaled down during the outage

AssumptionLow CPU means low load; the managed network (AWS Transit Gateway) scales transparently; the provisioning path is always available.
What happenedCold client caches on the first Monday of the year drove unusual load; a Transit Gateway saturated and AWS had to scale it manually. Packet loss made web servers block on backends, CPU fell, and automated downscaling shut serving web servers off. A second signal (waiting threads) triggered a 1,200-server scale-up in 14 minutes that overwhelmed provision-service, itself running over the same degraded network.
Blast radiusHours of global unavailability on the year's first working day; monitoring dashboards were degraded at the same time.
FixSlack reports pre-scaling of network capacity ahead of known annual patterns and hardening of the provisioning path; AWS reported reviewing TGW scaling algorithms.
Design ruleScale-down must be gated on a health signal independent of the load signal, because under partial failure the load signal reads as idleness. And the provisioning path is tier-0: it must not share fate with what it repairs.
Sourceslack.engineering, Feb 2021; independent analysis by Hochstein
Postmortem

AWS Kinesis, 25 November 2020: the capacity add was the outage

AssumptionAdding front-end servers is a routine, safe operation.
What happenedA small capacity addition (63 minutes of adding servers, finishing 3:47 AM PST) pushed every front-end server past an OS thread limit, because the fleet's all-to-all communication mesh used one thread per peer. AWS's summary: the addition "caused all of the servers in the fleet to exceed the maximum number of threads allowed by an operating system configuration".
Blast radiusRoughly 17 hours; Cognito, CloudWatch and dependent customer services degraded across us-east-1. Recovery was slow precisely because front-end servers had to be brought back gradually.
FixAWS reported moving to larger front-end servers (fewer peers per mesh) and accelerating cellularization of the front-end fleet.
Design ruleFleet size is an input to per-node resource consumption wherever any all-to-all pattern exists; scale-up needs the same canary treatment as a code deploy, because it is one.

Figure 5 · Slack, 4 January 2021: two autoscaling policies fire in opposite directions

provision-serviceAutoscaling policiesWeb tierAWS TransitGatewayprovision-serviceAutoscaling policiesWeb tierAWS TransitGateway~7am PST: cold-cache surge,TGW saturates, packets dropinstances created but neverfully provisioned, not servingbackend calls slow, threads blockCPU utilisation fallsscale DOWN, healthy serversremovedwaiting-thread count risesscale UP, 1,200 instances, 7:01to 7:15config + AWS API calls cross the same saturated networkweb tier stays under capacity for hours
provision-serviceAutoscaling policiesWeb tierAWS TransitGatewayprovision-serviceAutoscaling policiesWeb tierAWS TransitGateway~7am PST: cold-cache surge,TGW saturates, packets dropinstances created but neverfully provisioned, not servingbackend calls slow, threads blockCPU utilisation fallsscale DOWN, healthy serversremovedwaiting-thread count risesscale UP, 1,200 instances, 7:01to 7:15config + AWS API calls cross the same saturated networkweb tier stays under capacity for hours
The ordering is the point: downscaling healthy servers and a 1,200-instance scale-up were both automatic, both plausible per their own signal, and both wrong. Reconstructed from the Slack postmortem.
Diagram source

The platform below is finite

Postmortem

Datadog, 8 March 2023: recovery at scale hits every limit at once

AssumptionIf we lose nodes, the autoscalers will replace them; the cloud can absorb our replacement rate.
What happenedA systemd update deleted CNI routes on Ubuntu 22.04 across clouds, disconnecting "more than 60 percent of our instances". On AWS, health automation "terminated and replaced approximately 60 percent of the instances in the region" within two hours. Replacement at that rate became a thundering herd against the provider: more than 99 percent of ENI-creation calls rate-limited for nine hours, a 15,500-instance VPC mesh limit reached, cluster-autoscalers at their 6,000-node cluster maximums, and Vault saturated by re-registering nodes until the autoscaler was manually disabled at 16:31 UTC.
Blast radiusRoughly 13 hours to full platform recovery in US1; all regions affected by the trigger. More than 500 engineers coordinated over 2+ days (per the SREcon23 talk).
FixDatadog reports disabling the legacy update channel, making systemd-networkd leave routes alone, and treating reboot-in-place as a first-class recovery mode where instances survive.
Design ruleYour recovery plan is a load test of the cloud control plane that you have never run. Know the quotas, mesh limits and API rate limits on the replacement path, and prefer recovery modes (reboot, reconnect) that do not require launching anything.
Sourceimpact and recovery deep dives, 2023
Postmortem

AWS us-east-1, 19–20 October 2025: nobody could scale for 12 hours

AssumptionInstance launch, the primitive under every autoscaler in the region, is always available; recovery plans on top of it will work when needed.
What happenedA DNS race deleted DynamoDB's regional endpoint records. After the three-hour DNS repair, EC2's internal DropletWorkflow Manager had accumulated hundreds of thousands of expired host leases; re-establishing them "could not complete before leases timed out, leading to a state of congestive collapse". New instance launches failed or degraded for roughly 12 further hours; newly launched instances then failed NLB health checks as network state propagated late.
Blast radiusRegion-wide launch impairment; every customer autoscaler, and AWS's own dependent services, waited on the same recovery. Fixed by throttling work and selectively restarting DWFM hosts.
FixAWS reports adding rate limiting and improved recovery procedures for DWFM, and repairing the DNS automation race.
Design ruleElasticity is a dependency on the least-available part of the platform: the control plane. Anything that must survive a regional bad day needs to survive it with the instances it already has.

The spike outruns the loop

Postmortem

Robinhood, 2–3 March 2020: the unprecedented Monday

AssumptionCapacity sized for record days to date, plus growth, would hold.
What happenedHistoric market volatility, record volume and record signups landed together at market open. The founders' account: infrastructure "struggled with unprecedented load", producing a "thundering herd" effect that triggered a failure of the DNS system.
Blast radiusPress coverage reports the app down for essentially the full trading day of 2 March and part of the next morning, during one of the largest single-day rallies since 2008.
FixThe letter commits to capacity and reliability work in general terms; no architecture detail was published.
Design ruleFor market-open shaped load, the spike time is known even when the magnitude is not; that is a pre-scaling problem with a shedding backstop, not a reactive-scaling problem. The thin postmortem is itself a signal: regulated-adjacent consumer platforms publish least, so design evidence must come from elsewhere.
Blog

Coinbase, 13 February 2022: six times the tested peak, in one minute

AssumptionLoad tests calibrated to previous engagement benchmarks bound the possible spike.
What happenedA Super Bowl ad showing only a QR code drove more than 20 million landing-page hits in a minute, engagement Coinbase describes as six times its previous benchmarks. No capacity loop acts inside a minute; the app degraded and the team throttled traffic to stabilise it.
Blast radiusRoughly an hour of degraded and intermittently unavailable app around the ad slot (press-reported timing).
FixPublicly: throttling as the stabiliser, and the account frames it as the planned safety valve for beyond-forecast load.
Design ruleFor a marketing-shaped spike, capacity is set before the event or not at all; the engineering deliverable is the admission-control policy that decides who gets degraded service when the forecast is wrong by 6x.

Figure 6 · Datadog, March 2023: what mass re-provisioning ran into

60% of compute lost
(systemd route deletion)

Mass replacement:
thundering herd on the
cloud control plane

ENI creation calls:
over 99% rate-limited
for 9 hours

VPC mesh limit reached:
15,500 instances

Cluster maximums:
6,000 nodes x 3 clusters

Vault saturated by
node re-registration

Cluster-autoscaler disabled
16:31 UTC, re-enabled
18:34 to 19:00 UTC

60% of compute lost
(systemd route deletion)

Mass replacement:
thundering herd on the
cloud control plane

ENI creation calls:
over 99% rate-limited
for 9 hours

VPC mesh limit reached:
15,500 instances

Cluster maximums:
6,000 nodes x 3 clusters

Vault saturated by
node re-registration

Cluster-autoscaler disabled
16:31 UTC, re-enabled
18:34 to 19:00 UTC

Every limit here was invisible until the replacement herd arrived; Datadog's own write-up calls the limits "none of which was obvious ex ante". From the recovery deep dive.
Diagram source
05

Numbers you can plan against

Latencies of the capacity loop, magnitudes of real spikes, and the cost of the alternative. Measured, claimed and derived are separated; undated numbers are not offered.

MetricValueAtContextAs ofSource
Metrics-to-HPA-action delayup to 3 minKubernetes defaultsScrape 10s, aggregate 1 min, 30s control loop; "usually closer to 1 minute" (measured behaviour of defaults)2026-09CA FAQ
Cluster Autoscaler decision latency≤30–60 sSIG AutoscalingMeasured SLO: 30s small clusters (avg 5s), 60s at 100 to 1,000 nodes (avg 15s), no pod affinity2026-09CA FAQ
Node provisioning3–4 minGCE, measuredFrom CA request to pods schedulable on the new node2026-09CA FAQ
EC2 instance startup10–45 minNetflix, measuredThe number that motivated predictive scaling; modern instances are faster, the 2013 figure is the historical bound2013-11Scryer
Warm-pool instance to serving~30 sAWSVendor claim at launch, "as low as"; for apps with minutes-long initialisation2021-04AWS
CA backoff after failed scale-up (e.g. quota)up to 30 minKubernetesDocumented backoff between retry attempts when the provider refuses capacity2026-09CA FAQ
CA fail-static threshold45% / 3 nodesKubernetesAbove this many unready nodes, "CA stops all operations until the situation improves"2026-09CA FAQ
Mid-incident scale-up attempt1,200 servers / 14 minSlackInstances created but mostly never serving; provisioning path saturated2021-01Slack
Ad-driven spike20M+ hits/min, 6x benchmarksCoinbaseLanding page, 60-second Super Bowl ad; stabilised by throttling2022-02Coinbase
Rehearsed peak284M req/min edge, 80M appShopifyBFCM 2024 peaks, 12 TB/min egress; pre-provisioned and load-tested for months2025-11Shopify
Fleet lost to one change~60%Datadog"Tens of thousands of instances" terminated and replaced by AWS health automation within ~2 h2023-03Datadog
Recovery-path API throttling>99% of callsDatadog on AWSec2:CreateNetworkInterface rate-limited 06:00 to 15:00 UTC during mass replacement2023-03Datadog
Regional launch impairment~12 hAWS us-east-1EC2 launches failing or degraded after DynamoDB DNS repair, DWFM congestive collapse2025-10AWS
Capacity add that triggered a 17 h outage63 min of addsAWS KinesisFleet-wide OS thread limit crossed; front-end restart was the long pole2020-11AWS
Autoscaled slack vs manual23% vs 46%GoogleAutopilot-managed jobs vs manually-limited jobs; OOM-impacted jobs cut 10x2020-04Autopilot
Workloads using <50% of requests>65%Datadog customer fleetMeasured across billions of containers; HPA adopted by over half of K8s orgs2023-11Container Report
Provisioned CPU actually used13%CAST AI customersClusters of 50+ CPUs; memory 20%; the 2025 edition reports 10% CPU2024CAST AI
Utilisation gained by live-traffic testing>20%FacebookKraken shifting live traffic to find real capacity ceilings, over three years2016-11Kraken
Read these carefully

The 30-second warm-pool figure is a vendor launch claim, not an independent measurement; no published third-party benchmark of it surfaced in this hunt. The 10-to-45-minute EC2 startup figure is real but from 2013; treat it as an upper bound and measure your own. The utilisation figures (13%, 65%) come from vendors whose products monitor or optimise clusters, so the sample skews toward teams that already suspected waste. Derived, not reported: summing the pipeline stages in Figure 3 gives roughly 5 to 8 minutes signal-to-serving for stock Kubernetes on GCE; nobody publishes their end-to-end number, which is why rung 1 of section 07 has you measure yours.

06

The evidence wall

Every source behind this page, graded. One methodological note: this guide was researched from a sandbox whose network policy allowed full fetches of GitHub and datadoghq.com; sources on other hosts were verified through multiple independent search results rather than direct fetches, and the two talks are cited to their programme pages rather than to timestamps in the recordings. The ledger shipped beside this page (sources.md) marks the verification method per source.

Postmortem Slack2021-02

Slack's Outage on January 4th 2021

The fullest public account of autoscaling behaving badly mid-incident: CPU-triggered scale-down of healthy servers, thread-triggered 1,200-instance scale-up, and a provisioning service sharing fate with the broken network.

Carry forwardYour load signal and your health signal must be different signals; the provisioning path is tier-0.
slack.engineering
Postmortem AWS2020-11

Summary of the Amazon Kinesis Event (us-east-1)

A routine capacity addition crossed an invisible fleet-wide OS thread limit and took 17 hours to unwind. The scale-up itself was the change that broke production.

Carry forwardCanary your scale-ups; audit anything all-to-all for limits that fleet size consumes.
aws.amazon.com/message/11201
Postmortem AWS2025-10

Summary of the DynamoDB Service Disruption (us-east-1, Oct 2025)

The DNS race is the headline; the capacity lesson is below it: EC2's droplet-lease manager entered congestive collapse and regional instance launches were impaired for roughly 12 hours after the trigger was fixed.

Carry forwardEvery autoscaler in a region shares one launch control plane; plan a mode that needs no new instances.
aws.amazon.com/message/101925
Postmortem Datadog2023-05

2023-03-08: deep dive into the platform-level impact

How a systemd security update deleted CNI routes on 60% of instances across three clouds, and how AWS health automation turned disconnection into mass termination.

Carry forwardCloud remediation automation is part of your failure model; disconnected is recoverable, terminated is not.
datadoghq.com
Postmortem Datadog2023-06

2023-03-08: deep dive into the platform-level recovery

The best published record of re-provisioning at scale: rate limits on 99% of ENI calls, a 15,500-instance mesh limit, cluster maximums, Vault saturation, and the decision to switch the autoscaler off.

Carry forwardRecovery throughput is bounded by the cloud control plane, and those bounds are invisible until you hit them; go find yours first.
datadoghq.com
Postmortem Robinhood2020-03

An Update From Robinhood's Founders

Thin by design, and useful for exactly that reason: "unprecedented load", a "thundering herd", a DNS failure, and no architectural detail. The thinnest postmortem in this wall maps the limits of the public record.

Carry forwardWhere accounts are thin, weight the detailed ones more, and treat magnitude-unknown, time-known spikes as pre-scaling problems.
robinhood.com
Blog Netflix2013-11

Scryer: Netflix's Predictive Auto Scaling Engine

The founding document of this topic. Names the provisioning lag (10 to 45 minutes) and the outage-then-retry-storm trap that reactive scaling walks into, then builds prediction from traffic history instead.

Carry forwardThe 2013 failure list is a checklist; test your autoscaler against each entry before production does.
netflixtechblog.com
Blog Shopify~2021

Capacity Planning at Scale

Kir Shatrov on how Shopify sizes for BFCM: forecast models, estimates filed with cloud providers early enough for physical hardware to exist, and rehearsal scale-ups with names (Mayday, Spooky, Oktoberfest).

Carry forwardCloud capacity is not infinite on the day you need it; large peaks are negotiated with providers months ahead.
shopify.engineering
Blog Shopify2025-11

How we prepare Shopify for BFCM (2025)

The current edition of the yearly readiness account: 284M requests/min edge peak in 2024, production load testing from three regions with the Genghis tool, and months of failover rehearsal for a four-day event.

Carry forwardThe world's most spike-exposed commerce platform treats its peak as a project, not an autoscaler setting.
shopify.engineering
Blog Coinbase2022-02

Everyone Wins at Super Bowl LVI

The company's own account of the QR-code ad: 20M+ hits in a minute, six times previous benchmarks, load tests beaten by reality, throttling as the stabiliser.

Carry forwardForecast error of 6x is a design input; admission control is what turns it into degradation instead of outage.
blog.coinbase.com
Blog Airbnb2022-05

Dynamic Kubernetes cluster scaling at Airbnb

What outgrowing the autoscaler looks like: the built-in node-selection strategies could not express Airbnb's cost and instance-type logic, so they built the gRPC expander plug-point and upstreamed it.

Carry forwardScaling decisions eventually encode business policy; pick tools with a seam where that policy can live.
medium.com/airbnb-engineering
Blog Lorin Hochstein2021-02

Slack's Jan 2021 outage: a tale of saturation

Independent close reading of the Slack postmortem as a chain of saturations, valuable as a second analytical perspective not written by the affected company.

Carry forwardSaturation propagates along shared dependencies; map which of your control loops share a bottleneck with the systems they control.
surfingcomplexity.blog
Paper Google2020-04

Autopilot: workload autoscaling at Google (EuroSys '20)

The measured case for autoscaling as a cost tool: autopiloted jobs run at 23% slack versus 46% for manual limits, with OOM-impacted jobs reduced 10x, across Google's fleet.

Carry forwardAutoscaling's proven win is reclaiming slack safely; treat surge survival as a separate requirement with separate machinery.
dl.acm.org
Paper Meta (Facebook)2016-11

Kraken: leveraging live traffic tests (OSDI '16)

Facebook's answer to "what is our real capacity": continuously shift live user traffic to load individual systems and regions, with user-experience metrics as the guardrail; credited with over 20% utilisation improvement.

Carry forwardSynthetic load tests bound the wrong thing; only live traffic finds the bottleneck that will find you.
usenix.org
ADR Kubernetes SIG Autoscaling2019

KEP-853: Configurable scale up/down velocity for HPA

The decision record that ended the velocity argument: names the application classes (fast-up slow-down web, fast-both batch), cites the 2016 issues, and ships the per-workload behavior API in v1.18.

Carry forwardWrite your own scale-up and scale-down policy per workload class; the defaults encode nobody's risk profile.
github.com/kubernetes/enhancements
ADR Kubernetes SIG Autoscaling / Airbnb~2021

Cluster Autoscaler proposal: expander plugin over gRPC

Airbnb's recorded rationale for a pluggable scaling-decision point: business logic in node selection changes faster than the autoscaler's release train, and forking is the only alternative.

Carry forwardAn extension seam in the decision plane is worth more than any particular built-in strategy.
github.com/kubernetes/autoscaler
ADR Karpenter2025, main branch

Design: static capacity

The just-in-time autoscaler adding fixed-size NodePools, motivated by "performance-critical applications where just-in-time provisioning latency is unacceptable" and by users faking it with placeholder pods.

Carry forwardWhen users of an elastic system keep building static floors out of workarounds, the floor is a requirement, not a smell.
github.com/kubernetes-sigs/karpenter
ADR Karpenter2025, main branch

RFC: capacity buffer support

Headroom as a first-class API: pre-provisioned spare capacity that scales with the workload, replacing balloon-pod workarounds. Cites five separate community requests.

Carry forwardSize buffers in workload terms (pods you must absorb inside the lead time), not node counts.
github.com/kubernetes-sigs/karpenter
Source Kubernetes2016-09

PR #32408: allow customizing scale-forbidden-windows (closed unmerged)

An HPA maintainer's own attempt to expose velocity control, rejected: "We cannot expose them, as the algorithm may be changed in the future... We don't want to engrave internal stuff."

Carry forwardThe rejected PR records the argument you will have again; read it before re-litigating.
github.com/kubernetes/kubernetes/pull/32408
Source Kubernetes2016-10

PR #34424: move scale forbidden windows to hpa spec (closed unmerged)

Second community attempt within a month, closed with a pointer to the first: the windows are "internal details of the autoscaling algorithm". The demand signal was already unmistakable in 2016.

Carry forwardCount the duplicate asks; repeated unmerged PRs for the same knob usually mean the abstraction boundary is wrong.
github.com/kubernetes/kubernetes/pull/34424
Source Kubernetes2017-11

Issue #56335: programmable waiting time before autoscale-up/down

The thread where the position is stated most crisply ("we shouldn't expose it as a knob") and where it starts to crack ("the problem... is still there and needs to be addressed"). Issues #39090, #65097 and #69428 carry the same ask from 2016 onward.

Carry forwardDesign arguments live in issue threads years before they reach a KEP; that is where to look for the reasoning.
github.com/kubernetes/kubernetes/issues/56335
Source Kubernetes SIG Autoscalingliving doc

Cluster Autoscaler FAQ

The operational truth of the mainline autoscaler in one file: latency SLOs, the 3-to-4 minute GCE node figure, quota backoff up to 30 minutes, the 45%-unready halt, and the pause-pod overprovisioning recipe.

Carry forwardThe FAQ of a mature tool is its honest spec; read it before the marketing page.
github.com/kubernetes/autoscaler
Source Netflix2013

Netflix/aws-autoscaling

The tooling and documentation Netflix published alongside its autoscaling practice; period evidence that the lessons in Scryer were operationalised, not aspirational.

Carry forwardA company's public repos date-stamp when practice matched the blog post.
github.com/Netflix/aws-autoscaling
Case study Datadog2023-11

Container Report (Nov 2023 edition)

Fleet-scale measurement: over half of Kubernetes organisations run HPA, over 65% of workloads use less than half their requested CPU and memory, and under 1% use VPA.

Carry forwardAdoption of autoscaling and elimination of waste are uncorrelated in practice; budget accordingly.
datadoghq.com/container-report
Case study CAST AI2024

Kubernetes Cost Benchmark Report

Across customer clusters of 50+ CPUs: 13% of provisioned CPU and 20% of memory utilised. A vendor with an optimisation product to sell, so read as directional, but consistent with Datadog's independent measurement.

Carry forwardCorroborated across two vendors: the industry buys roughly 5x the compute it uses, which is unpriced headroom nobody planned.
cast.ai
Vendor AWS2021-04

EC2 Auto Scaling introduces Warm Pools

The platform's own admission that launch latency breaks elasticity for slow-booting apps: pre-initialised stopped instances, claimed to serve "in as low as 30 seconds". Mechanics in the user guide.

Carry forwardVendor features track real failure modes; a new knob is a map of someone's outage.
aws.amazon.com
Talk Datadog / USENIX2023-10

The World Blew Up but We're All Okay (SREcon23 EMEA)

Laura de Vesine and Laurent Bernaille on running the March 2023 recovery: coordinating more than 500 engineers over 2+ days. Cited here to the programme page and slide deck; the recording was not fetchable from this research environment.

Carry forwardMass recovery is an organisational capacity problem as much as a compute one; 500-engineer coordination does not improvise well.
usenix.org
Talk The Downtime Project2021

Ep. 1: Slack vs TGWs

Practitioner podcast walkthrough of the Slack incident by engineers unaffiliated with Slack; the companion episode "Kinesis Hits the Thread Limit" covers the AWS event. Cited to the episode pages.

Carry forwardThird-party incident walkthroughs surface the questions the sanctioned postmortem was too polite to ask.
downtimeproject.com
07

Build a miniature, then productionise it

Seven rungs from a toy control loop to the drills the surge survivors run. The crossing from toy to real is rung 4, where you break your own signal.

Build the naive loop and measure its lag

A load generator, a pool of worker processes behind a queue, and a controller that adds a worker when average utilisation exceeds 70%. Add artificial provisioning delay (30 to 120 seconds) to mimic real instance startup.

Done when: you can chart demand, capacity and the gap over time, and state your end-to-end signal-to-serving lead time as one number.  Teaches: the lead time is a property of the whole pipeline, not the controller.

Drive a cliff, not a slope

Step the load 6x in ten seconds (the Coinbase shape). Compute the "capacity debt": the integral of unserved demand until the loop catches up.

Done when: you can predict the debt from the step size and lead time before running the test.  Teaches: reactive scaling's loss is proportional to lead time; halving it halves the outage.

Add velocity policy and stabilization

Implement KEP-853 semantics on your controller: separate up and down rules, a scale-down stabilization window, velocity caps. Re-run rung 2 plus a flapping load.

Done when: the checkout-profile config (instant up, slow down) and the batch-profile config (fast both ways) demonstrably differ in cost and in dropped requests.  Teaches: velocity is per-workload business policy.

Invert the signal

Make the workers' downstream dependency hang so utilisation collapses while queues grow (the Slack scenario). Watch your controller scale down into the failure, then fix it: gate scale-down on a health check independent of the load metric.

Done when: the dependency hang no longer shrinks the fleet, and a genuine load drop still does.  Teaches: distinguishing loss-of-signal from loss-of-load is the core safety property.

Add a warm pool and price it

Keep N pre-initialised workers stopped; measure spike response with and without. Compute the monthly cost of the pool against the capacity debt it eliminates.

Done when: you can state the break-even spike frequency at which the pool pays for itself.  Teaches: headroom is a priced insurance product, not waste or virtue.

Make the platform refuse you

Inject quota errors and API rate limits into the provisioning stub (fail 99% of create calls, the Datadog number). Verify backoff behaviour, alerting, and what your controller does after 30 minutes of refusal.

Done when: a capacity-refused condition pages a human with the specific limit hit, instead of retrying silently.  Teaches: the cloud is a dependency with its own capacity and its own bad days.

Run the live drill

In production (or the closest staging you truly load), shift real traffic Kraken-style toward one instance group until a guardrail metric degrades. Record the true ceiling and re-run quarterly; rehearse the scale-up itself the way Shopify rehearses BFCM.

Done when: your capacity number comes from a drill log, not a spreadsheet, and the scale-up runbook has been executed while healthy.  Teaches: untested capacity paths fail on first use, which is always during the surge.

08

Keep hunting

The queries that found this material, grouped by what they surface. The highest-yield trick on this topic: search for the incident vocabulary ("scaled down", "thundering herd", "rate limited") next to the tool vocabulary, never the tool alone.

Postmortems where scaling misbehaved

  • <company> outage postmortem autoscaling "scaled down"
  • "provision-service" slack outage "scale down" web tier
  • "exceed the maximum number of threads" kinesis
  • postmortem "cluster-autoscaler" "rate limited" OR "insufficient capacity"
  • "congestive collapse" site:aws.amazon.com OR EC2 launches postmortem

The argument in the tracker

  • repo:kubernetes/kubernetes is:pr is:closed is:unmerged "forbidden window"
  • "KEP" site:github.com sig-autoscaling "scale velocity"
  • karpenter designs static-capacity OR capacity-buffers site:github.com
  • cluster-autoscaler proposals expander site:github.com

Capacity economics

  • "container report" utilization "less than half" requested
  • kubernetes cost report "provisioned CPUs" percent utilized
  • autopilot google eurosys "slack" workload autoscaling

How the rehearsed do it

  • site:shopify.engineering capacity planning OR BFCM readiness
  • netflix scryer predictive auto scaling
  • kraken "live traffic" load testing osdi facebook
  • "warm pools" EC2 auto scaling announcement
09

References

  1. Slack Engineering, "Slack's Outage on January 4th 2021" slack.engineering, February 2021. Checked 2026-09-17 (search-verified; host unfetchable from research sandbox).
  2. AWS, "Summary of the Amazon Kinesis Event in the Northern Virginia (US-EAST-1) Region" aws.amazon.com, November 2020. Checked 2026-09-17 (search-verified).
  3. AWS, "Summary of the Amazon DynamoDB Service Disruption in US-EAST-1, October 19-20 2025" aws.amazon.com, October 2025. Checked 2026-09-17 (search-verified).
  4. Datadog, "2023-03-08 incident: a deep dive into the platform-level impact" datadoghq.com, May 2023. Checked 2026-09-17 (fetched).
  5. Datadog, "2023-03-08 incident: a deep dive into the platform-level recovery" datadoghq.com, June 2023. Checked 2026-09-17 (fetched).
  6. Datadog, "2023-03-08 Incident: infrastructure connectivity issue affecting multiple regions" datadoghq.com, March 2023. Checked 2026-09-17 (fetched).
  7. Robinhood, "An Update From Robinhood's Founders" robinhood.com, 3 March 2020. Checked 2026-09-17 (search-verified).
  8. TechCrunch, "Robinhood offers $15 discount, blames outage on record trades" techcrunch.com, 3 March 2020. Checked 2026-09-17 (search-verified).
  9. Netflix Technology Blog, "Scryer: Netflix's Predictive Auto Scaling Engine" netflixtechblog.com, 5 November 2013. Checked 2026-09-17 (search-verified).
  10. Netflix, aws-autoscaling repository github.com, 2013 onward. Checked 2026-09-17 (fetched).
  11. Shopify Engineering (Kir Shatrov), "Capacity Planning at Scale" shopify.engineering, circa 2021. Checked 2026-09-17 (search-verified).
  12. Shopify Engineering, "How we prepare Shopify for BFCM (2025)" shopify.engineering, November 2025. Checked 2026-09-17 (search-verified).
  13. Coinbase, "Everyone Wins at Super Bowl LVI (WAGMI!)" blog.coinbase.com, February 2022. Checked 2026-09-17 (search-verified).
  14. Airbnb Engineering (David Morrison), "Dynamic Kubernetes cluster scaling at Airbnb" medium.com, May 2022. Checked 2026-09-17 (search-verified).
  15. Lorin Hochstein, "Slack's Jan 2021 outage: a tale of saturation" surfingcomplexity.blog, 8 February 2021. Checked 2026-09-17 (search-verified).
  16. Rzadca et al., "Autopilot: workload autoscaling at Google", EuroSys 2020 dl.acm.org, April 2020. Checked 2026-09-17 (search-verified).
  17. Veeraraghavan et al., "Kraken: Leveraging Live Traffic Tests...", OSDI 2016 usenix.org, November 2016. Checked 2026-09-17 (search-verified).
  18. Kubernetes Enhancement Proposal 853, "Configurable scale up/down velocity for HPA" github.com, 2019; shipped in Kubernetes v1.18, 2020. Checked 2026-09-17 (fetched).
  19. kubernetes/kubernetes pull request #32408 (closed unmerged) github.com, September 2016. Checked 2026-09-17 (fetched).
  20. kubernetes/kubernetes pull request #34424 (closed unmerged) github.com, October 2016. Checked 2026-09-17 (fetched).
  21. kubernetes/kubernetes issue #56335 github.com, November 2017. Checked 2026-09-17 (fetched). See also issues #39090, #65097, #69428.
  22. Kubernetes SIG Autoscaling, Cluster Autoscaler FAQ github.com, living document. Checked 2026-09-17 (fetched).
  23. Evan Sheng (Airbnb), "Expander Plugin over gRPC", Cluster Autoscaler proposal github.com, circa 2021. Checked 2026-09-17 (fetched).
  24. Karpenter design, "Static Capacity" github.com, main branch. Checked 2026-09-17 (fetched).
  25. Karpenter RFC, "Capacity Buffer Support" github.com, main branch. Checked 2026-09-17 (fetched).
  26. AWS, "Amazon EC2 Auto Scaling introduces Warm Pools" aws.amazon.com, 8 April 2021. Checked 2026-09-17 (search-verified). Docs mirror fetched from awsdocs on GitHub.
  27. Datadog, Container Report, November 2023 edition datadoghq.com, November 2023, data from September 2023. Checked 2026-09-17 (fetched).
  28. CAST AI, "Analysis Finds Only 13 Percent of Provisioned CPUs... Utilized" cast.ai, 2024. Checked 2026-09-17 (search-verified).
  29. de Vesine & Bernaille, "The World Blew Up but We're All Okay", SREcon23 EMEA usenix.org, October 2023. Checked 2026-09-17 (search-verified).
  30. The Downtime Project, "Ep. 1: Slack vs TGWs" downtimeproject.com, 2021. Checked 2026-09-17 (search-verified). Companion: "Kinesis Hits the Thread Limit".