cpulimit通过周期性发送SIGSTOP/SIGCONT信号暂停恢复进程实现软性CPU限流,非内核级,存在抖动与不精准问题;安装方式依系统而异:Ubuntu/Debian用sudo apt install cpulimit,RHEL/CentOS 7需先启用EPEL再yum安装,8+或Fedora用dnf,无包时可编译安装;限制进程支持按PID(-p)、进程名(-e)或路径,可后台运行(-b)并联动子进程(-i),但-l参数为单核百分比,多核需换算;长期服务应优先使用systemd的CPUQuota内核级配额控制。

cpulimit 能限制单个进程的 CPU 使用率,但**它不是内核级限流,而是靠反复发 SIGSTOP/SIGCONT 信号“掐断执行”来模拟限速**。效果直观、上手快,但有抖动、不精准、无法跨核平均等问题——适合临时压制、调试、防失控,别指望它做生产级资源隔离。
怎么装 cpulimit?不同系统命令不一样
Debian/Ubuntu 直接跑:sudo apt install cpulimit
RHEL/CentOS 7 需先开 EPEL:sudo yum install epel-release && sudo yum install cpulimit
RHEL/CentOS 8+ 或 Fedora:sudo dnf install cpulimit
如果包管理器里没有(比如某些精简镜像),就编译安装:wget https://github.com/opsengine/cpulimit/archive/v0.2.tar.gz && tar -zxf v0.2.tar.gz && cd cpulimit-0.2 && make && sudo cp src/cpulimit /usr/bin/
装完验证:cpulimit --help 能打出帮助说明就对了。
限制正在运行的进程:必须知道 PID 或程序名
查 PID 最常用:pidof nginx 或 ps aux | grep python 看第二列数字
限制指定 PID(比如 1234)到 40%:cpulimit -p 1234 -l 40
按程序名限制(自动找第一个匹配进程):cpulimit -e python3 -l 30
按绝对路径限制更稳妥(避免同名冲突):cpulimit -e /usr/bin/node -l 50
加 -b 后台运行,加 -i 连子进程一起限(比如 Python 启的 subprocess)
⚠️ 注意:-l 值是“单核百分比”,双核机器上设 -l 150 才可能跑到总 CPU 的 75%;设 -l 100 在双核上最多只占一个核满载,另一个核空闲。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
为什么 cpulimit 有时没反应?常见卡点
权限问题:普通用户只能限自己启动的进程,root 才能限系统服务(如 nginx、mysqld)
进程已退出:cpulimit 默认会等目标进程,如果进程瞬间结束,它也就退出了;加 -z 可让它检测不到就直接退出
目标进程被 systemd 托管:systemd 会接管子进程生命周期,cpulimit -i 可能失效;此时优先改 CPUQuota=(见下条)
进程绑定了特定 CPU 核(taskset):cpulimit 不感知 affinity,仍会尝试暂停,但调度行为更难预测
没加 -b 时命令前台阻塞,关掉终端就失效;后台运行记得用 -b 或 nohup ... &
长期服务该用 systemd 的 CPUQuota,不是 cpulimit
对常驻服务(如 redis.service、docker.service),cpulimit 是补丁式方案,重启后失效,且和 systemd 的进程管理逻辑打架
正确做法:sudo systemctl edit redis.service,写入:
[Service] CPUQuota=60%
然后 sudo systemctl daemon-reload && sudo systemctl restart redis.service
CPUQuota 是 cgroups 级控制,内核强制执行,无信号抖动,支持多核平均,且开机自生效
⚠️ 重点:如果你在写监控脚本自动 kill + restart 进程再套 cpulimit,不如直接配 CPUQuota + Restart=on-failure,更稳、更干净










