Traffic doubles at 9:00. The autoscaler notices at 9:02, requests instances at 9:03, and they are serving by 9:06. Six minutes under-provisioned — and by the time help arrives, the queue it was meant to absorb has already timed out.
Nothing in that chain is broken. Autoscaling is a feedback loop and every loop has delay: a metric window of a minute or two before the trend is real, a cooldown so we don't thrash, then boot, image pull, JIT warm-up, cache fill.
Three things shorten the gap. Scale on a signal that moves earlier than CPU — queue depth and concurrency both do. Scale on the clock when the rush is predictable, because waiting to discover a 9am spike that happens every weekday is a choice we are making. And keep a small buffer of idle capacity warm, which is the cheapest latency insurance on the menu.
Reacting to a problem is always slower than anticipating it — and some problems are entirely predictable.
