35.2. 通过调整 CPU 权重来控制应用程序的 CPU 时间

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

先决条件

  • 有 root 权限。
  • 您有要控制 CPU 时间分布的应用程序。
  • 您在 /sys/fs/cgroup/ root 控制组群中创建两个级别的子控制组群,如下例所示:

    …​
      ├── Example
      │   ├── g1
      │   ├── g2
      │   └── g3
    …​
  • 您已在父控制组和子控制组中启用 cpu 控制器,类似于在 cgroups-v2 文件系统中创建 cgroups 并启用控制器

流程

  1. 配置所需的 CPU 权重以便在控制组群内实施资源限制:

    # echo "150" > /sys/fs/cgroup/Example/g1/cpu.weight
    # echo "100" > /sys/fs/cgroup/Example/g2/cpu.weight
    # echo "50" > /sys/fs/cgroup/Example/g3/cpu.weight
  2. 将应用程序的 PID 添加到 g1g2g3 子组中:

    # echo "33373" > /sys/fs/cgroup/Example/g1/cgroup.procs
    # echo "33374" > /sys/fs/cgroup/Example/g2/cgroup.procs
    # echo "33377" > /sys/fs/cgroup/Example/g3/cgroup.procs

    示例命令可确保所需的应用程序成为 Example/g*/ 子 cgroup 的成员,并获取按照这些 cgroup 配置分发的 CPU 时间。

    已在运行的子 cgroups (g1, g2, g3) 的权重在父 cgroup (Example) 一级计算其总和。然后,CPU 资源会根据对应的权重按比例分发。

    因此,当所有进程都同时运行时,内核会根据相应 cgroup 的 cpu.weight 文件为每个进程分配相应比例的 CPU 时间:

    子 cgroupcpu.weight 文件CPU 时间分配

    g1

    150

    ~50% (150/300)

    g2

    100

    ~33% (100/300)

    g3

    50

    ~16% (50/300)

    cpu.weight 控制器文件的值不是一个百分比。

    如果一个进程停止运行,造成 cgroup g2 中没有运行的进程,则计算将省略 cgroup g2,仅根据 cgroup g1g3 进行计算:

    子 cgroupcpu.weight 文件CPU 时间分配

    g1

    150

    ~75% (150/200)

    g3

    50

    ~25% (50/200)

    重要

    如果子 cgroup 有多个正在运行的进程,分配给相应 cgroup 的 CPU 时间将平均分配到该 cgroup 的成员进程。

验证

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

    # cat /proc/33373/cgroup /proc/33374/cgroup /proc/33377/cgroup
    0::/Example/g1
    0::/Example/g2
    0::/Example/g3

    命令输出显示了在 Example/g*/ 子 cgroups 中运行的特定应用程序的进程。

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

    # top
    top - 05:17:18 up 1 day, 18:25,  1 user,  load average: 3.03, 3.03, 3.00
    Tasks:  95 total,   4 running,  91 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 18.1 us, 81.6 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.3 hi,  0.0 si,  0.0 st
    MiB Mem :   3737.0 total,   3233.7 free,    132.8 used,    370.5 buff/cache
    MiB Swap:   4060.0 total,   4060.0 free,      0.0 used.   3373.1 avail Mem
    
        PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      33373 root      20   0   18720   1748   1460 R  49.5   0.0 415:05.87 sha1sum
      33374 root      20   0   18720   1756   1464 R  32.9   0.0 412:58.33 sha1sum
      33377 root      20   0   18720   1860   1568 R  16.3   0.0 411:03.12 sha1sum
        760 root      20   0  416620  28540  15296 S   0.3   0.7   0:10.23 tuned
          1 root      20   0  186328  14108   9484 S   0.0   0.4   0:02.00 systemd
          2 root      20   0       0      0      0 S   0.0   0.0   0:00.01 kthread
    ...
    注意

    为了明确演示,我们强制所有示例进程在单个 CPU 上运行。在多个 CPU 中使用时,CPU 权重也会应用同样的原则。

    请注意,PID 33373PID 33374PID 33377 的 CPU 资源根据权重 150、100、50 分配的。权重对应于每个应用程序的 50%、33% 和 16% 的 CPU 时间。