搜索

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

download PDF

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

先决条件

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

    …​
      ├── Example
      │   ├── g1
      │   ├── g2
      │   └── g3
    …​
  • 您在父控制组中和子控制组中启用了 cpucpuset 控制器,如 为 CPU 时间分布准备 cgroup 中所述。

流程

  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 时间。

    已运行进程的子 cgroup (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*/ 子 cgroup 中指定的应用程序的进程。

  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 资源会根据您分配给相应子 cgroup 的权重 150、100、50 进行分配。权重对应于每个应用程序分配的 CPU 时间的大约 50%、33% 和 16%。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.