24.3. 通过调整 CPU 带宽来控制应用程序的 CPU 时间分布
您需要为 cpu 控制器的相关文件分配值,以控制分发到特定 cgroup 树下应用程序的 CPU 时间。
先决条件
- 您有 root 权限。
- 您至少有两个用于控制 CPU 时间分发的应用程序。
- 您确保相关的应用程序在同一 CPU 上竞争 CPU 时间,如 为 CPU 时间分布准备 cgroup 中所述。
-
您已挂载了
cgroups-v2文件系统,如 挂载 cgroups-v2 中所述。 -
您在父控制组和子控制组中启用了
cpu和cpuset控制器,如 为 CPU 时间分布准备 cgroup 中所述。 您在
/sys/fs/cgroup/根控制组 中创建了两级 子控制组,如下例所示:… ├── Example │ ├── tasks …
… ├── Example │ ├── tasks …Copy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
配置 CPU 带宽以在控制组群内实现资源限制:
echo "200000 1000000" > /sys/fs/cgroup/Example/tasks/cpu.max
# echo "200000 1000000" > /sys/fs/cgroup/Example/tasks/cpu.maxCopy to Clipboard Copied! Toggle word wrap Toggle overflow 第一个值是允许的时间配额(以微秒为单位),用于子组中的所有进程可以在一段时间内运行。第二个值指定时间段的长度。
在一段时间内,当控制组中的进程共同耗尽此配额指定的时间时,它们会在该时间段的剩余时间内节流,并且直到下一个时间段才允许运行。
此命令设置 CPU 时间分布控制,以便
/sys/fs/cgroup/Example/tasks子组中的所有进程每 1 秒只能在 CPU 上运行 0.2 秒。也就是说,每秒的五分之一。可选:验证时间配额:
cat /sys/fs/cgroup/Example/tasks/cpu.max 200000 1000000
# cat /sys/fs/cgroup/Example/tasks/cpu.max 200000 1000000Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将应用的 PID 添加到
Example/tasks子组中:echo "34578" > /sys/fs/cgroup/Example/tasks/cgroup.procs echo "34579" > /sys/fs/cgroup/Example/tasks/cgroup.procs
# echo "34578" > /sys/fs/cgroup/Example/tasks/cgroup.procs # echo "34579" > /sys/fs/cgroup/Example/tasks/cgroup.procsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 示例命令确保所需的应用程序成为
Example/tasks子组的成员,并且不超过为此子组配置的 CPU 时间分布。
验证
验证应用程序是否在指定的控制组群中运行:
cat /proc/34578/cgroup /proc/34579/cgroup 0::/Example/tasks 0::/Example/tasks
# cat /proc/34578/cgroup /proc/34579/cgroup 0::/Example/tasks 0::/Example/tasksCopy to Clipboard Copied! Toggle word wrap Toggle overflow 上面的输出显示了在
Example/tasks子组中运行的指定应用程序的进程。检查节流应用程序的当前 CPU 消耗:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,
PID 34578和PID 34579的 CPU 消耗已减少到 10%。Example/tasks子组将其进程控制到 CPU 时间的 20%。由于控制组中有 2 个进程,因此每个进程可以使用 10% 的 CPU 时间。