25.2. 通过调整 CPU 权重来控制应用程序的 CPU 时间
您需要为 cpu
控制器的相关文件分配值,以规范特定 cgroup 树下的应用程序分布 CPU 时间。
先决条件
- 有 root 权限。
- 您有要控制 CPU 时间分布的应用程序。
您在
/sys/fs/cgroup/
root 控制组群中创建两个级别的子控制组群,如下例所示:… ├── Example │ ├── g1 │ ├── g2 │ └── g3 …
-
您已在父控制组和子控制组中启用
cpu
控制器,类似于在 cgroups-v2 文件系统中创建 cgroups 并启用控制器。
流程
配置所需的 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
将应用程序的 PID 添加到
g1
、g2
和g3
子组中:# 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 时间:子 cgroup cpu.weight
文件CPU 时间分配 g1
150
~50% (150/300)
g2
100
~33% (100/300)
g3
50
~16% (50/300)
cpu.weight
控制器文件的值不是一个百分比。如果一个进程停止运行,造成 cgroup
g2
中没有运行的进程,则计算将省略 cgroupg2
,仅根据 cgroupg1
和g3
进行计算:子 cgroup cpu.weight
文件CPU 时间分配 g1
150
~75% (150/200)
g3
50
~25% (50/200)
重要如果子 cgroup 有多个正在运行的进程,分配给相应 cgroup 的 CPU 时间将平均分配到该 cgroup 的成员进程。
验证
验证应用程序是否在指定的控制组群中运行:
# cat /proc/33373/cgroup /proc/33374/cgroup /proc/33377/cgroup 0::/Example/g1 0::/Example/g2 0::/Example/g3
命令输出显示了在
Example/g*/
子 cgroups 中运行的特定应用程序的进程。检查节流应用程序的当前 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 33373
、PID 33374
和PID 33377
的 CPU 资源根据权重 150、100、50 分配的。权重对应于每个应用程序的 50%、33% 和 16% 的 CPU 时间。
其他资源
- 了解控制组群
- 什么是内核资源控制器
- 在 cgroups-v2 文件系统中创建 cgroup 和启用控制器
- 资源分配模型
-
cgroups(7)
、sysfs(5)
手册页