第 29 章 使用 cgroupfs 手动管理 cgroup
通过在 虚拟文件系统上创建目录来管理 cgroup 层次结构,该目录默认挂载到 cgroup fs/sys/fs/cgroup/。在专用控制文件中指定所需的配置。
cgroups-v1 支持被 systemd 弃用,因此 cgroup-v1 将从以后的 Red Hat Enterprise Linux 10 版本中删除。在以后的 RHEL 10 版本中必须使用 cgroups-v2。
您必须使用 systemd 来控制系统资源的使用。除非是特殊情况,否则不得手动配置 cgroups 虚拟文件系统。
29.1. 在 cgroups-v2 文件系统中创建 cgroup 和启用控制器 复制链接链接已复制到粘贴板!
要管理控制组(cgroups),请在 cgroups 虚拟文件系统中创建和删除目录,通常是位于 /sys/fs/cgroup/。要使用控制器设置,请为子 cgroups 启用它们。至少创建两级子 cgroup,以组织文件并优化控制器使用量。
先决条件
- 您在系统上具有 root 权限。
流程
创建
/sys/fs/cgroup/Example/目录:# mkdir /sys/fs/cgroup/Example//sys/fs/cgroup/Example/目录定义一个子组。当您创建/sys/fs/cgroup/Example/目录时,目录中会自动创建一些cgroups-v2接口文件。/sys/fs/cgroup/Example/目录还包含memory和pids控制器的特定于控制器的文件。可选:检查新创建的子控制组:
# ll /sys/fs/cgroup/Example/-r--r--r--. 1 root root 0 Jun 1 10:33 cgroup.controllers -r--r--r--. 1 root root 0 Jun 1 10:33 cgroup.events -rw-r--r--. 1 root root 0 Jun 1 10:33 cgroup.freeze -rw-r--r--. 1 root root 0 Jun 1 10:33 cgroup.procs ... -rw-r--r--. 1 root root 0 Jun 1 10:33 cgroup.subtree_control -r--r--r--. 1 root root 0 Jun 1 10:33 memory.events.local -rw-r--r--. 1 root root 0 Jun 1 10:33 memory.high -rw-r--r--. 1 root root 0 Jun 1 10:33 memory.low ... -r--r--r--. 1 root root 0 Jun 1 10:33 pids.current -r--r--r--. 1 root root 0 Jun 1 10:33 pids.events -rw-r--r--. 1 root root 0 Jun 1 10:33 pids.max示例输出显示常规 cgroup 控制接口文件,如
cgroup.procs或cgroup.controllers。无论启用控制器是什么,这些文件都是所有控制组通用的。memory.high和pids.max等文件与memory和pids控制器有关,它们是 root 控制组(/sys/fs/cgroup/),默认情况下会被 systemd 启用。默认情况下,新创建的子组会继承父 cgroup 中的所有设置。在这种情况下,root cgroup 中没有限制。
验证
/sys/fs/cgroup/cgroup.controllers文件中是否有所需的控制器:# cat /sys/fs/cgroup/cgroup.controllerscpuset cpu io memory hugetlb pids rdma启用所需的控制器。在本例中是
cpu和cpuset控制器:# echo "+cpu" >> /sys/fs/cgroup/cgroup.subtree_control # echo "+cpuset" >> /sys/fs/cgroup/cgroup.subtree_control这些命令为
/sys/fs/cgroup/root 控制组的直接子组启用cpu和cpuset控制器。包含新创建的Example控制组。子组 是可以指定进程,并根据标准对每个进程应用控制检查的位置。用户可以在任何级别上读取
cgroup.subtree_control文件的内容,以了解哪些控制器可在直接子组中启用。注意默认情况下,根控制组中的
/sys/fs/cgroup/cgroup.subtree_control文件包含memory和pids控制器。为 Example 控制组群的子 cgroup
启用所需的控制器:# echo "+cpu +cpuset" >> /sys/fs/cgroup/Example/cgroup.subtree_control这些命令可确保,直接的子组仅具有与 CPU 时间分发相关的控制器,而不是
memory或pids控制器。创建
/sys/fs/cgroup/Example/tasks/目录:# mkdir /sys/fs/cgroup/Example/tasks//sys/fs/cgroup/Example/tasks/目录定义了一个子组,它带有只与cpu和cpuset控制器相关的文件。现在,您可以将进程分配给此控制组,并将cpu和cpuset控制器选项用于您的进程。可选:检查子控制组:
# ll /sys/fs/cgroup/Example/tasks-r--r--r--. 1 root root 0 Jun 1 11:45 cgroup.controllers -r--r--r--. 1 root root 0 Jun 1 11:45 cgroup.events -rw-r--r--. 1 root root 0 Jun 1 11:45 cgroup.freeze -rw-r--r--. 1 root root 0 Jun 1 11:45 cgroup.max.depth -rw-r--r--. 1 root root 0 Jun 1 11:45 cgroup.max.descendants -rw-r--r--. 1 root root 0 Jun 1 11:45 cgroup.procs -r--r--r--. 1 root root 0 Jun 1 11:45 cgroup.stat -rw-r--r--. 1 root root 0 Jun 1 11:45 cgroup.subtree_control -rw-r--r--. 1 root root 0 Jun 1 11:45 cgroup.threads -rw-r--r--. 1 root root 0 Jun 1 11:45 cgroup.type -rw-r--r--. 1 root root 0 Jun 1 11:45 cpu.max -rw-r--r--. 1 root root 0 Jun 1 11:45 cpu.pressure -rw-r--r--. 1 root root 0 Jun 1 11:45 cpuset.cpus -r--r--r--. 1 root root 0 Jun 1 11:45 cpuset.cpus.effective -rw-r--r--. 1 root root 0 Jun 1 11:45 cpuset.cpus.partition -rw-r--r--. 1 root root 0 Jun 1 11:45 cpuset.mems -r--r--r--. 1 root root 0 Jun 1 11:45 cpuset.mems.effective -r--r--r--. 1 root root 0 Jun 1 11:45 cpu.stat -rw-r--r--. 1 root root 0 Jun 1 11:45 cpu.weight -rw-r--r--. 1 root root 0 Jun 1 11:45 cpu.weight.nice -rw-r--r--. 1 root root 0 Jun 1 11:45 io.pressure -rw-r--r--. 1 root root 0 Jun 1 11:45 memory.pressure重要cpu控制器只有在相关子控制组至少有 2 个在单个 CPU 上竞争时间的进程时,才会被激活 。
验证
可选:确认您已创建了一个新 cgroup,且只有所需的控制器活跃:
# cat /sys/fs/cgroup/Example/tasks/cgroup.controllerscpuset cpu