第 25 章 使用 cgroupfs 手动管理 cgroup
您可以通过在 cgroupfs
虚拟文件系统中创建目录来管理系统上的 cgroup
层次结构。文件系统默认挂载到 /sys/fs/cgroup/
目录中,您可以在专用控制文件中指定所需的配置。
通常,红帽建议您使用 systemd
来控制系统资源的使用。您应该只在特殊情况下手动配置 cgroups
虚拟文件系统。例如,当您需要使用在 cgroup-v2
层次结构中没有对应的 cgroup-v1
控制器时。
25.1. 在 cgroups-v2 文件系统中创建 cgroup 和启用控制器
您可以通过创建和删除目录,并通过写入 cgroup
虚拟文件系统中的文件来管理 控制组 (cgroups
)。文件系统默认挂载到 /sys/fs/cgroup/
目录中。要使用 cgroups
控制器中的设置,您还需要为子 cgroup
启用所需的控制器。在默认情况下,root cgroup
会为其子 cgroups
启用 memory
和 pids
。因此,红帽建议在 /sys/fs/cgroup/
root cgroup
中创建至少两个级别的子 cgroup
。这样,您可以选择从子 cgroup
中删除 memory
和 pids
控制器,并更好地组织 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/
目录还包含针对内存
和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
继承所有设置。在这种情况下,来自 rootcgroup
没有限制。验证
/sys/fs/cgroup/cgroup.controllers
文件中是否有所需的控制器:# cat /sys/fs/cgroup/cgroup.controllers cpuset 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
文件的内容,以了解哪些控制器将在直接子组中启用。注意默认情况下,root 控制组群中的
/sys/fs/cgroup/cgroup.subtree_control
文件包含内存
和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
只有相关的子组至少有 2 个进程在单个 CPU 上竞争时,才会激活 cpu
控制器。
验证
可选:确认您已创建了一个新
cgroup
,且只有所需控制器活跃:# cat /sys/fs/cgroup/Example/tasks/cgroup.controllers cpuset cpu
其他资源
- 了解控制组群
- 什么是内核资源控制器
- 挂载 cgroups-v1
-
cgroups(7)
、sysfs(5)
手册页