最可靠方式是通过CPUQuota参数设置内核级CPU时间配额,依赖cgroups v2;需先验证stat -fc %t /sys/fs/cgroup输出cgroup2fs,并确认CONFIG_CFS_BANDWIDTH=y;再用sudo systemctl edit nginx.service添加[Service]CPUQuota=40%,重载并重启后,通过systemctl show和cat /sys/fs/cgroup/system.slice/nginx.service/cpu.max验证。

用 systemd 限制单个服务的 CPU 配额,最可靠的方式是通过 CPUQuota 参数设置内核级 CPU 时间配额,依赖 cgroups v2,稳定、精准、可热更新。
确认系统支持 cgroups v2 和 CPU 带宽控制
执行以下命令验证前提条件是否满足:
-
cgroups v2 已启用:运行
stat -fc %t /sys/fs/cgroup,输出应为cgroup2fs -
内核支持 CFS 带宽调度:检查
zcat /proc/config.gz | grep CONFIG_CFS_BANDWIDTH或查看/boot/config-$(uname -r),需为y(现代主流发行版默认开启)
编辑服务配置并设置 CPUQuota
以 nginx 服务为例,推荐使用覆盖式编辑,避免修改原始 unit 文件:
用于设计、审查、生成或重构使用Effector、effector-react、Farfetched、AtomicRouter、@effector/next等库的React应用。
- 运行
sudo systemctl edit nginx.service - 在打开的编辑器中输入:
CPUQuota=40%
保存退出后,执行:
-
sudo systemctl daemon-reload(重载配置) -
sudo systemctl restart nginx.service(重启服务使配额生效)
验证配额是否正确应用
配额不是“保证最低”,而是“硬性上限”——超限后内核会自动节流,不杀进程但会延迟调度:
- 查 systemd 记录值:
systemctl show nginx.service | grep CPUQuota应返回CPUQuota=40% - 查底层 cgroup 实际值:
cat /sys/fs/cgroup/system.slice/nginx.service/cpu.max应显示类似40000 100000(即每 100ms 最多用 40ms) - 实时观察效果:
systemd-cgtop中定位到/system.slice/nginx.service行,其CPU列长期不会持续超过 40%
注意事项与常见问题
CPUQuota 是百分比单位,按单逻辑 CPU 计算。例如:
-
CPUQuota=100%≈ 占满 1 个核心(非整机) - 4 核机器上设
200%,表示最多同时用满 2 个核心的全部时间 - 若服务由模板实例启动(如
myapp@dev.service),需对具体实例单独设置:sudo systemctl edit myapp@dev.service - 不建议混用
LimitCPU(旧参数,精度低、已弃用),优先只用CPUQuota

















