问题出现得很突然,日志倒是留得挺全。CentOS 7.9 上给后台任务设了 CPUQuota=50%,也就是 cpu.max 50000 100000,任务跑起来之后接口反而更容易超时,ss 里连接堆积,就绪探针频繁失败。

刚开始盯着「同一 cgroup 的子进程共享额度,主进程被后台线程拖慢」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。半个核对多线程服务来说太少,线程在 throttled 状态里排队。另一种情况是cfs 周期内额度用完就被强制挂起,要等下一个周期,抖动很明显。

不容易想到的是,CPUQuota 只限时间不限并发,线程越多抢得越碎。

先看被限流的次数

cat /sys/fs/cgroup/system.slice/app.service/cpu.stat | grep -E 'nr_throttled|throttled_usec'

随后看服务实际用了多少核

systemd-cgtop -b -n 1 | head -10 && pidstat -u -p $(pgrep -f app) 1 3

再往下按峰值上调额度并留余量

systemctl set-property app.service CPUQuota=150%

末了确认线程没被反复挂起

cat /sys/fs/cgroup/system.slice/app.service/cpu.stat

改完先别撤,确认这几项。nr_throttled 每分钟只增个位数,接口 P99 回到 100ms 以内,探针不再失败。

容易忽略的是,CPUQuota 是硬节流不是软优先级,超了就直接停;只想压低后台任务的影响,用 CPUWeight 更平滑,别一上来就砍额度。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189