cpulimit仅能限制已有进程的cpu使用率,通过sigstop/sigcont信号实现软限;新进程应优先用systemd-run或服务单元的cpuquota,长期服务必须用cgroups v2,nice不控cpu使用率只调调度权重。

直接说结论:已有进程用 cpulimit,新启动进程优先用 systemd-run 或服务单元的 CPUQuota,长期服务必须用 cgroups v2,别碰 nice——它不控CPU使用率,只调调度权重。
cpulimit 限制正在运行的进程
cpulimit 是唯一能对已存在、非自己启动的进程实时限频的工具。它靠周期性发 SIGSTOP/SIGCONT 暂停恢复进程,属于“软限”,不依赖内核特性,但有明显副作用。
- 常见错误现象:进程响应延迟升高、日志打点时间跳变、实时音视频卡顿、某些信号处理被中断
- 使用场景:紧急压制失控进程(如死循环的
python3 train.py)、临时调试、CI/CD 构建机防拖垮 - 参数差异:
-p PID最准;-e name会匹配所有同名进程(含子进程),但可能误杀;-P /path/to/binary更安全,但需绝对路径且匹配/proc/PID/exe的符号链接目标 - 性能影响:每秒约 100–200 次信号操作,本身 CPU 开销可忽略,但频繁暂停会导致进程实际吞吐下降超预期(比如限 50%,真实吞吐可能只剩 30%)
- 示例:
cpulimit -p 12345 -l 30 -b
后台持续限制 PID 12345 到 30% CPU;若进程退出,cpulimit默认继续等待(加-z可自动退出)
systemd-run 启动带 CPU 配额的新进程
这是最简单、最可靠的新进程限频方式,底层走 cgroups v2,无兼容性问题,且自动清理。
- 容易踩的坑:
- 不要写
systemd-run --scope -p CPUQuota=50% sleep 100——--scope下-p不生效,必须用--scope -p CPUQuota=50%(注意空格和等号) -
CPUQuota是“配额占比”,不是“使用率上限”:设为50%表示最多用掉 1 个逻辑 CPU 核心 50% 的时间片;双核机器上,它仍可跑满一个核(即 100% 单核利用率),但不会跨核抢占
- 不要写
- 示例:
systemd-run --scope -p CPUQuota=40% python3 app.py
启动后可用systemctl status run-rXXXXXXXXX.scope查状态,进程退出即自动销毁 cgroup
CPUQuota 改 systemd 服务配置
适用于长期运行的服务(如 nginx.service、redis-server.service),修改后永久生效,重启服务即加载。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 关键点:
- 必须用
systemctl edit servicename.service,不要直接改/usr/lib/systemd/system/下的原始文件(会被包管理器覆盖) -
CPUQuota值必须带%,写成75无效,得写75% - 修改后必须
sudo systemctl daemon-reload,否则restart不生效
- 必须用
- 性能/兼容性:基于 cgroups v2,内核级保障,无信号开销,子进程自动继承,比
cpulimit稳定得多 - 示例:
sudo systemctl edit nginx.service
输入:[Service] CPUQuota=60%
保存退出,再执行sudo systemctl restart nginx.service
为什么不用 nice 或 ulimit -t
nice 只调整进程在就绪队列里的相对权重,不设硬上限。当系统空闲时,nice 19 的进程照样能吃满 100% CPU;只有多个高优先级进程争资源时,它才“让出”——这不是限制,是谦让。
ulimit -t 限制的是累计 CPU 秒数,到时直接 SIGKILL,适合防无限循环脚本,但完全不能用于“限速”。比如设 ulimit -t 300,进程跑 5 分钟就死,跟你想让它“一直跑但别太猛”毫无关系。
真正要稳、准、可持续地控 CPU,cgroups v2 是唯一现代答案;而 cpulimit 就是那个你凌晨三点发现数据库备份进程把线上服务干趴了时,能立刻 ssh 上去敲两行命令救场的工具。
别忘了:cpulimit 的百分比是按单核 100% 算的。四核机器上,-l 100 = 最多占满一个核,不是整机 100%。这点很多人第一次用就翻车。










