Spot the error: 'we autoscale our LLM serving pods on CPU utilization.'
Click any words you think contain an error. Click again to unmark.
CPU utilisation barely moves on an LLM serving pod because the work is on the GPU; autoscale on queue depth, batch fullness, GPU SM-util, or KV-block occupancy instead.
Picture a restaurant where the kitchen does all the cooking but the autoscaler watches how busy the maitre d' is. The maitre d' just greets people and writes orders; he is never overwhelmed even when the kitchen is on fire and tickets are piling up behind the line. By the time the maitre d' looks busy, the kitchen has been buried for an hour. LLM serving works the same way. The CPU is the maitre d', taking requests and writing tickets. The GPU is the kitchen, doing the actual cooking. The autoscaler should watch what is going on in the kitchen: how long the ticket queue is, how full each pan, how hot the stove. Watching the maitre d' looks reasonable on paper and misses every real problem.
Detailed answer & concept explanation~6 min readEverything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example.
Everything important, quickly.
4 min: why CPU does not saturate on a GPU-bound pod + the right signal set (queue, batch, KV, SM-util) + KEDA + DCGM wiring + scale-up vs scale-down asymmetry + cold-start considerations.
Real products, models, and research that use this idea.
- vLLM exposes `num_requests_waiting`, `num_requests_running`, and `gpu_cache_usage_perc` on its Prometheus endpoint; these are the canonical scale-up signals.
- SGLang publishes `pending_requests` and `running_requests` for the same purpose, with KEDA recipes documented in 2026.
- NVIDIA DCGM exporter has been the standard way to surface GPU SM utilization to Prometheus and Kubernetes HPA since 2023.
- KServe and Ray Serve both ship GPU-aware autoscalers that use batch utilisation rather than CPU as the primary signal.
- AWS Bedrock provisioned throughput exposes a tokens-per-minute metric for autoscaling; CPU is not even an option in the API.
What an interviewer would ask next. Try answering before peeking at the approach.
QWhy does scaling on queue depth alone tend to flap under bursty traffic?
QHow does KV-cache occupancy compare to GPU SM utilisation as a scale-up signal?
Don't say thisRed flags and common mistakes that signal junior thinking. Click to expand.
Red flags and common mistakes that signal junior thinking. Click to expand.
Treating CPU as a reasonable proxy because the HPA supports it out of the box. The default signal is not the right signal: it never crosses the threshold during real overload, so the autoscaler reacts after the SLO has already broken.
The night-before-the-interview bullets. Scan these on the way to the call.
Primary sources. Skim if you want the original framing.
Same topic, related formats. Practice these next.