kubectl top pod api-7f9
kubectl exec api-7f9 -- cat /sys/fs/cgroup/cpu.stat
kubectl set resources deploy/api --limits=cpu=1

给一个 Spring 服务配了 cpu: 100m,启动时间从 25 秒变成 92 秒,startupProbe 连续失败,Pod 反复重建。节点 CPU 使用率只有 12%。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,limit 是 CFS 配额,100m 表示每 100 毫秒只能用 10 毫秒 CPU,超过就被 throttled 到下一个周期。启动阶段是 CPU 密集的类加载和 JIT,配额一小就不断让出。

「CPU limit 启动超时」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

处理上按这个顺序:先看 cpu.stat 里的 nr_throttled 是不是一直在涨;把 limit 提到能覆盖启动峰值的值 启动完再考虑压低;启动慢的服务改用 startupProbe 给它单独的时间窗;确认 requests 也设置了 避免调度到超卖的节点。

改完只确认一件事:cpu.stat 里 nr_throttled 不再增长,启动时间回到 30 秒内。

作者 9823189