问题出现得很突然,日志倒是留得挺全。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 更平滑,别一上来就砍额度。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
