cgroups通过分层子系统(如cpu、memory)挂载实现资源控制,v1各子系统独立建树,v2统一单棵树协同生效;需按规范挂载、创建嵌套组、设配额并迁移进程,清理时须先清空再卸载。

Linux cgroups(Control Groups)通过分层的子系统组织资源控制逻辑,每个子系统(如 cpu、memory、pids)可独立挂载到文件系统路径,形成树状结构。理解其层次关系与挂载点管理,是精准限制进程资源的基础。
子系统默认分组与v1/v2差异
cgroups v1 中,各子系统可单独挂载、独立建树,例如 /sys/fs/cgroup/cpu 和 /sys/fs/cgroup/memory 互不干扰;而 cgroups v2 统一使用单棵树(通常挂载在 /sys/fs/cgroup),所有控制器(如 cpu.max、memory.max)在同一层级下协同生效。启用 v2 需内核参数 cgroup_no_v1=all 或确保未显式挂载 v1 子系统。
手动挂载子系统(v1)
若系统默认未自动挂载某子系统,可用 mount 命令按需挂载:
- 创建挂载点:mkdir -p /sys/fs/cgroup/net_cls
- 挂载子系统:mount -t cgroup -o net_cls none /sys/fs/cgroup/net_cls
- 验证是否生效:ls /sys/fs/cgroup/net_cls 应显示 cgroup.procs、cgroup.clone_children 等标准文件
注意:部分子系统(如 devices)需配合内核配置(CONFIG_CGROUP_DEVICE=y)且不能与其他子系统混挂同一路径。
创建与嵌套控制组(v1 示例)
挂载后,通过新建子目录创建控制组,子目录自动继承父组规则,并可进一步限制:
- 在 cpu 子系统下建两级组:mkdir /sys/fs/cgroup/cpu/team_a/team_b
- 限制 team_b 的 CPU 配额:echo "50000 100000" > /sys/fs/cgroup/cpu/team_a/team_b/cpu.cfs_quota_us
- 将进程加入:echo $PID > /sys/fs/cgroup/cpu/team_a/team_b/cgroup.procs
该进程受 team_b 限制,也隐式受限于 team_a 的祖先策略(如 team_a 若设了 cpu.shares,则影响 team_b 内任务的相对权重)。
卸载与清理挂载点
不再需要某子系统挂载时,应先清空其下所有控制组(包括根组中的进程),再 umount:
- 移出所有进程:echo "" > /sys/fs/cgroup/cpu/cgroup.procs(对根组)
- 递归删除子组:rmdir /sys/fs/cgroup/cpu/team_a/team_b /sys/fs/cgroup/cpu/team_a
- 卸载:umount /sys/fs/cgroup/cpu
强行 umount 会失败并提示 “Device or resource busy”,常见原因是仍有进程或子组活跃。










