27.2. 通过调整 CPU 权重来控制应用程序的 CPU 时间分布
您需要为 cpu
控制器的相关文件分配值,以控制分发到特定 cgroup 树下应用程序的 CPU 时间。
先决条件
- 您有 root 权限。
- 您有要控制 CPU 时间分布的应用程序。
您在
/sys/fs/cgroup/
root 控制组群中创建两个级别的子控制组群,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
您已在父控制组和子控制组中启用
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
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将应用程序的 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
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例命令可确保所需的应用程序成为
Example/g*/
子 cgroup 的成员,并按照这些 cgroup 配置获取发布的 CPU 时间。已运行进程的子 cgroup (
g1
,g2
,g3
) 的权重在父 cgroup(Example
)级别上相加。然后,根据对应的权重按比例分布 CPU 资源。因此,当所有进程同时运行时,内核会根据相应的 cgroup 的
cpu.weight
文件为每个进程按比例分配 CPU 时间:Expand 子 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
的帐户权重:Expand 子 cgroup cpu.weight
文件CPU 时间分配 g1
150
~75% (150/200)
g3
50
~25% (50/200)
重要如果子 cgroup 有多个正在运行的进程,则分配给 cgroup 的 CPU 时间在其成员进程中平均分配。
验证
验证应用程序是否运行在指定的控制组中:
cat /proc/33373/cgroup /proc/33374/cgroup /proc/33377/cgroup 0::/Example/g1 0::/Example/g2 0::/Example/g3
# cat /proc/33373/cgroup /proc/33374/cgroup /proc/33377/cgroup 0::/Example/g1 0::/Example/g2 0::/Example/g3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令输出显示了运行在
Example/g*/
子 cgroup 中指定的应用程序的进程。检查节流应用程序的当前 CPU 消耗:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意为了清晰地说明,所有进程都在一个 CPU 上运行。当在多个 CPU 上使用时,CPU 权重会应用同样的原则。
请注意,
PID 33373
、PID 33374
和PID 33377
的 CPU 资源根据您分配给相应子 cgroup 的 150、100 和 50 权重进行分配。权重对应于每个应用程序分配的 CPU 时间的大约 50%、33% 和 16%。