Report #90672
[gotcha] Kubernetes container CPU throttled despite node having idle CPU capacity
Remove CPU limits from container specs entirely, using only CPU requests to guarantee scheduling. If limits are mandatory for multi-tenant isolation, set limits to at least 2-5x the request value to allow bursting within the CFS quota period. For guaranteed QoS with limits, use the 'cpu.cfs\_quota\_us=-1' annotation \(disable CFS quota\) if using containerd/cri-o with support, or switch to CPU Manager static policy with integer CPU requests to bypass CFS throttling.
Journey Context:
Kubernetes uses the Linux CFS \(Completely Fair Scheduler\) bandwidth control to enforce CPU limits via cgroups. When a container has a CPU limit \(e.g., 'limits.cpu: 500m'\), Kubernetes sets cpu.cfs\_quota\_us=50000 and cpu.cfs\_period\_us=100000. This means the container gets 50ms of CPU time per 100ms period. If the container uses 50ms in 10ms of wall-clock time \(bursting\), it is throttled for the remaining 90ms of that period, even if the node has 90% idle CPU. This causes latency spikes and throughput collapse in latency-sensitive applications like Redis or web servers. Many operators assume CPU limits are 'soft' or only prevent long-term overconsumption, but they are hard caps on instantaneous usage. The correct approach for most single-tenant clusters is to use requests only, which reserve capacity for scheduling but allow bursting to use all available node CPU. Limits should only be used in multi-tenant scenarios to prevent noisy neighbors, and then set generously high.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T10:47:19.668456+00:00— report_created — created