最直接有效的方式是用cgroups v2统一挂载并写入控制器文件实现硬性限制:先确认启用v2,再创建控制组、启用cpu/memory控制器,设置cpu.max和memory.max值,最后将进程PID写入cgroup.procs。

最直接有效的方式是用 cgroups v2,统一挂载在 /sys/fs/cgroup,通过写入控制器文件(如 cpu.max、memory.max)并把进程 PID 加入对应组来实现硬性限制。
确认并启用 cgroups v2
先检查系统是否已启用 v2:
- 运行
mount | grep cgroup,输出中应只含cgroup2,不含cgroup(v1) - 确认存在
/sys/fs/cgroup/cgroup.subtree_control - 若未启用,需在 GRUB 中添加
systemd.unified_cgroup_hierarchy=1并重启
创建控制组并启用 CPU 和内存控制器
以限制 CPU 和内存为例:
- 执行
sudo mkdir /sys/fs/cgroup/myapp - 启用控制器:
echo "+cpu +memory" | sudo tee /sys/fs/cgroup/cgroup.subtree_control(推荐在根目录一次性启用) - 这一步必须提前做,否则后续写
cpu.max会报Invalid argument
设置具体资源限制
限制值通过写入特定文件生效:
-
CPU 限制:写
cpu.max,格式为"max period"(单位微秒),例如限制为 0.5 核:echo "50000 100000" > /sys/fs/cgroup/myapp/cpu.max -
内存限制:写
memory.max,例如限制为 512MB:echo "536870912" > /sys/fs/cgroup/myapp/memory.max -
cpu.shares或cpu.weight是软限制,仅在争抢时生效,无法阻止进程跑满 CPU
将进程加入控制组
限制生效的关键一步:
- 获取目标进程 PID(如
1234) - 执行
echo 1234 > /sys/fs/cgroup/myapp/cgroup.procs(注意是cgroup.procs,不是tasks) - 普通用户无权操作,需用
sudo;不建议配置 polkit 绕过权限管控


















