第 27 章 使用 cgroupfs 手动管理 cgroup


您可以通过在 cgroupfs 虚拟文件系统中创建目录来管理系统上的 cgroup 层次结构。文件系统默认挂载到 /sys/fs/cgroup/ 目录,您可以在专用的控制文件中指定所需的配置。

注意

cgroups-v1 支持被 systemd 弃用,因此 cgroup-v1 将从以后的 Red Hat Enterprise Linux 10 版本中删除。在以后的 RHEL 10 版本中必须使用 cgroups-v2

重要

您必须使用 systemd 来控制系统资源的使用。除非是特殊情况,否则不得手动配置 cgroups 虚拟文件系统。

您可以通过创建和删除目录,并通过写入 cgroup 虚拟文件系统中的文件来管理 控制组 (cgroups)。文件系统默认挂载到 /sys/fs/cgroup/ 目录中。要使用 cgroups 控制器中的设置,您还需要为子 cgroup 启用所需的控制器。在默认情况下,root cgroup 会为其子 cgroups 启用 memorypids。因此,您必须在 /sys/fs/cgroup/ root cgroup 中创建至少两级子 cgroups。这样,您可以选择从子 cgroup 中删除 memorypids 控制器,并更好地组织 cgroup 文件。

先决条件

  • 您在系统上具有 root 权限。

流程

  1. 创建 /sys/fs/cgroup/Example/ 目录:

    # mkdir /sys/fs/cgroup/Example/
    Copy to Clipboard Toggle word wrap

    /sys/fs/cgroup/Example/ 目录定义一个子组。当您创建 /sys/fs/cgroup/Example/ 目录时,目录中会自动创建一些 cgroups-v2 接口文件。/sys/fs/cgroup/Example/ 目录还包含 memorypids 控制器的特定于控制器的文件。

  2. 可选:检查新创建的子控制组:

    # 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
    Copy to Clipboard Toggle word wrap

    示例输出显示常规 cgroup 控制接口文件,如 cgroup.procscgroup.controllers。无论启用控制器是什么,这些文件都是所有控制组通用的。

    memory.highpids.max 等文件与 memorypids 控制器有关,它们是 root 控制组 (/sys/fs/cgroup/) ,默认情况下会被 systemd 启用。

    默认情况下,新创建的子组从父 cgroup 继承所有设置。在这种情况下,来自 root cgroup 没有限制。

  3. 验证 /sys/fs/cgroup/cgroup.controllers 文件中是否有所需的控制器:

    # cat /sys/fs/cgroup/cgroup.controllers
    cpuset cpu io memory hugetlb pids rdma
    Copy to Clipboard Toggle word wrap
  4. 启用所需的控制器。在本例中是 cpucpuset 控制器:

    # echo "+cpu" >> /sys/fs/cgroup/cgroup.subtree_control
    # echo "+cpuset" >> /sys/fs/cgroup/cgroup.subtree_control
    Copy to Clipboard Toggle word wrap

    这些命令为 /sys/fs/cgroup/ root 控制组的直接子组启用 cpucpuset 控制器。包含新创建的 Example 控制组。子组 是可以指定进程,并根据标准对每个进程应用控制检查的位置。

    用户可以在任意级别读取 cgroup.subtree_control 文件的内容,以了解即时子组中哪些控制器可用于启用。

    注意

    默认情况下,根控制组中的 /sys/fs/cgroup/cgroup.subtree_control 文件包含 memorypids 控制器。

  5. Example 控制组群的子 cgroup 启用所需的控制器:

    # echo "+cpu +cpuset" >> /sys/fs/cgroup/Example/cgroup.subtree_control
    Copy to Clipboard Toggle word wrap

    这些命令可确保,直接的子组具有与 CPU 时间分发相关的控制器,而不是 memorypids 控制器。

  6. 创建 /sys/fs/cgroup/Example/tasks/ 目录:

    # mkdir /sys/fs/cgroup/Example/tasks/
    Copy to Clipboard Toggle word wrap

    /sys/fs/cgroup/Example/tasks/ 目录定义了一个子组,它带有只与 cpucpuset 控制器相关的文件。现在,您可以将进程分配给此控制组,并将 cpucpuset 控制器选项用于您的进程。

  7. 可选:检查子控制组:

    # 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
    Copy to Clipboard Toggle word wrap
重要

cpu 控制器只有在相关子控制组至少有 2 个在单个 CPU 上竞争时间的进程时,才会被激活 。

验证

  • 可选:确认您是否已创建了一个只有所需的控制器处于活跃状态的新的 cgroup

    # cat /sys/fs/cgroup/Example/tasks/cgroup.controllers
    cpuset cpu
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat