CPU limit 设 500m,平均使用率只有 30%,接口 P99 却从 80ms 抖到 900ms,容器指标里 cfs_throttled 比例 38%。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
kubectl top pod api-8d9e7f6c5-6x3lp kubectl describe pod api-8d9e7f6c5-6x3lp | grep -A4 Limits kubectl set resources deploy/api --requests=cpu=1 --limits=cpu=2
CPU 限流按 100ms 周期结算,突发流量在前几十毫秒就把配额用完,剩下的时间进程被强制挂起。平均使用率看不出来,尾延迟全落在被 throttled 的请求上。这一点先确认清楚,后面就不用反复试。
「CPU 限流抖动」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
具体做法是,看 container_cpu_cfs_throttled_periods_total 和 throttled_seconds_total 确认限流;把 requests 提到实际 P95 limit 设为 requests 的 1.5 到 2 倍;延迟敏感服务可以先去掉 CPU limit 只保留 requests;压测对比改前改后的 P99 和 throttled 比例。
改完照着核一遍,throttled 比例降到 5% 以下 P99 回到 120ms 以内。
