Setting CPU and Memory Limits That Match Reality
Limits too low cause OOMKill loops. Too high waste money. How we right-sized from production metrics.
Default limits.memory: 512Mi on every deployment was a guess. Guesses caused pain.
Process
- Export 30 days of
container_memory_working_set_bytesfrom Prometheus - P99 memory + 25% headroom = request
- Limit = request × 1.5 (burst allowance)
- CPU request = sustained P95 usage, limit = 2× request for bursts
Example: Gateway Pod
| Before (guess) | After (metrics) | |
|---|---|---|
| CPU request | 500m | 350m |
| CPU limit | 500m | 700m |
| Memory request | 512Mi | 384Mi |
| Memory limit | 512Mi | 576Mi |
OOMKills: 14/week → 0. Cluster cost: -8% (better bin-packing).
Requests drive scheduling. Limits kill pods. Treat them differently.
kubernetes , resources , limits · Kubernetes