cgroups v2提供统一资源限制机制,需先确认内核支持并启用v2,再创建cgroup、启用cpu/memory控制器,配置cpu.max和memory.max等参数,最后将进程PID写入cgroup.procs实现隔离。

如果您需要在Linux系统中对进程组实施精确的资源限制与隔离,则cgroups v2提供了统一、可组合且行为一致的控制机制。以下是完成该目标的具体配置步骤:
一、确认cgroups v2环境就绪
确保系统已启用cgroups v2并正确挂载,是后续所有操作的前提。v2要求内核版本≥4.5(推荐≥5.2),且必须启用统一层级结构,避免与v1共存导致控制器冲突。
1、检查内核是否支持cgroups v2:grep CGROUP /boot/config-$(uname -r)
2、验证cgroup2是否已挂载:mount | grep cgroup2
3、确认当前使用v2而非v1:ls /sys/fs/cgroup/cgroup.controllers(若该路径存在且非空,则为v2)
4、如未启用,需编辑GRUB配置:sudo nano /etc/default/grub,在GRUB_CMDLINE_LINUX中添加systemd.unified_cgroup_hierarchy=1 cgroup_no_v1=all
5、更新引导并重启:sudo update-grub && sudo reboot
二、创建专用cgroup并启用控制器
在/sys/fs/cgroup下新建目录即创建一个独立cgroup,随后需显式声明子树中启用的控制器,否则相关资源策略将不生效。
1、创建名为myapp的控制组:sudo mkdir /sys/fs/cgroup/myapp
2、启用cpu与memory控制器:echo "+cpu +memory" | sudo tee /sys/fs/cgroup/myapp/cgroup.subtree_control
3、验证控制器可用性:cat /sys/fs/cgroup/myapp/cgroup.controllers(应显示cpu memory两行)
三、配置CPU资源限制
CPU限制通过cpu.max文件实现,采用“quota period”格式(微秒),默认周期为100000μs;该值决定每周期内允许使用的最大CPU时间。
1、限制CPU使用率不超过1个逻辑核心(即100%):echo "100000 100000" | sudo tee /sys/fs/cgroup/myapp/cpu.max
2、限制CPU使用率不超过50%:echo "50000 100000" | sudo tee /sys/fs/cgroup/myapp/cpu.max
3、设置权重分配以实现相对优先级(适用于共享场景):echo 80 | sudo tee /sys/fs/cgroup/myapp/cpu.weight
4、查看当前CPU使用统计:cat /sys/fs/cgroup/myapp/cpu.stat
四、配置内存资源限制
内存限制由memory.max定义硬上限,超出时触发OOM killer;memory.low则提供软保护,在内存紧张时优先保障该cgroup不被回收。
1、设置内存硬上限为512MB:echo 536870912 | sudo tee /sys/fs/cgroup/myapp/memory.max
2、设置内存软保护阈值为256MB:echo 268435456 | sudo tee /sys/fs/cgroup/myapp/memory.low
3、限制内存+swap总和为768MB:echo 805306368 | sudo tee /sys/fs/cgroup/myapp/memory.swap.max
4、禁用swap使用(仅物理内存):echo 0 | sudo tee /sys/fs/cgroup/myapp/memory.swap.max
五、将进程加入cgroup实现隔离
将进程PID写入cgroup.procs会迁移整个线程组(包括所有线程),这是v2推荐方式;若需仅迁移单个线程,应写入tasks文件(但须谨慎)。
1、获取目标进程PID:pgrep -f "your_process_name"
2、将进程及其全部线程加入myapp组:echo $PID | sudo tee /sys/fs/cgroup/myapp/cgroup.procs
3、验证进程归属:cat /sys/fs/cgroup/myapp/cgroup.procs
4、动态迁移运行中进程无需重启服务,限制即时生效。

















