Menu Close
Settings Close

Language and Page Formatting Options

Red Hat Training

A Red Hat training course is available for RHEL 8

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

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

先决条件

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

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

流程

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

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

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

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

    此命令设置 CPU 时间分布控制,以便 /sys/fs/cgroup/Example/tasks 子组中的所有进程在 CPU 上仅能每 1 秒运行 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 34578 和 PID 34 579 的 CPU 消耗已减少到 10%。示例/tasks 子组共同规范其进程到 CPU 时间的 20%。由于控制组中有 2 个进程,因此每个进程都可以使用 10% 的 CPU 时间。