Red Hat Training

A Red Hat training course is available for RHEL 8

24.3. 通过调整 CPU 带宽来控制应用程序的 CPU 时间分布

您需要为 cpu 控制器的相关文件分配值,以控制分发到特定 cgroup 树下应用程序的 CPU 时间。

先决条件

  • 您有 root 权限。
  • 您至少有两个用于控制 CPU 时间分发的应用程序。
  • 您确保相关的应用程序在同一 CPU 上竞争 CPU 时间,如 为 CPU 时间分布准备 cgroup 中所述。
  • 您已挂载了 cgroups-v2 文件系统,如 挂载 cgroups-v2 中所述。
  • 您在父控制组和子控制组中启用了 cpucpuset 控制器,如 为 CPU 时间分布准备 cgroup 中所述。
  • 您在 /sys/fs/cgroup/ 根控制组 中创建了两级 子控制组,如下例所示:

    …​
      ├── Example
      │   ├── tasks
    …​

流程

  1. 配置 CPU 带宽以在控制组群内实现资源限制:

    # echo "200000 1000000" > /sys/fs/cgroup/Example/tasks/cpu.max

    第一个值是允许的时间配额(以微秒为单位),用于子组中的所有进程可以在一段时间内运行。第二个值指定时间段的长度。

    在一段时间内,当控制组中的进程共同耗尽此配额指定的时间时,它们会在该时间段的剩余时间内节流,并且直到下一个时间段才允许运行。

    此命令设置 CPU 时间分布控制,以便 /sys/fs/cgroup/Example/tasks 子组中的所有进程每 1 秒只能在 CPU 上运行 0.2 秒。也就是说,每秒的五分之一。

  2. 另外,验证时间配额:

    # cat /sys/fs/cgroup/Example/tasks/cpu.max
    200000 1000000
  3. 将应用的 PID 添加到 Example/tasks 子组中:

    # echo "34578" > /sys/fs/cgroup/Example/tasks/cgroup.procs
    # echo "34579" > /sys/fs/cgroup/Example/tasks/cgroup.procs

    示例命令确保所需的应用程序成为 Example/tasks 子组的成员,并且不超过为此子组配置的 CPU 时间分布。

验证步骤

  1. 验证应用程序是否在指定的控制组群中运行:

    # cat /proc/34578/cgroup /proc/34579/cgroup
    0::/Example/tasks
    0::/Example/tasks

    上面的输出显示了在 Example/tasks 子组中运行的指定应用程序的进程。

  2. 检查节流应用程序的当前 CPU 消耗:

    # top
    top - 11:13:53 up 23:10,  1 user,  load average: 0.26, 1.33, 1.66
    Tasks: 104 total,   3 running, 101 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  3.0 us,  7.0 sy,  0.0 ni, 89.5 id,  0.0 wa,  0.2 hi,  0.2 si,  0.2 st
    MiB Mem :   3737.4 total,   3312.6 free,    133.4 used,    291.4 buff/cache
    MiB Swap:   4060.0 total,   4060.0 free,      0.0 used.   3376.0 avail Mem
    
        PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      34578 root      20   0   18720   1756   1468 R  10.0   0.0  37:36.13 sha1sum
      34579 root      20   0   18720   1772   1480 R  10.0   0.0  37:41.22 sha1sum
          1 root      20   0  186192  13940   9500 S   0.0   0.4   0:01.60 systemd
          2 root      20   0       0      0      0 S   0.0   0.0   0:00.01 kthreadd
          3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp
          4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp
    ...

    请注意,PID 34578PID 34579 的 CPU 消耗已减少到 10%。Example/tasks 子组将其进程控制到 CPU 时间的 20%。由于控制组中有 2 个进程,因此每个进程可以使用 10% 的 CPU 时间。