Red Hat Training
A Red Hat training course is available for RHEL 8
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 …
流程
配置 CPU 带宽以在控制组群内实现资源限制:
# echo "200000 1000000" > /sys/fs/cgroup/Example/tasks/cpu.max
第一个值是允许的时间配额(以微秒为单位),用于子组中的所有进程可以在一段时间内运行。第二个值指定时间段的长度。
在一段时间内,当控制组中的进程共同耗尽此配额指定的时间时,它们会在该时间段的剩余时间内节流,并且直到下一个时间段才允许运行。
此命令设置 CPU 时间分布控制,以便
/sys/fs/cgroup/Example/tasks
子组中的所有进程每 1 秒只能在 CPU 上运行 0.2 秒。也就是说,每秒的五分之一。另外,验证时间配额:
# cat /sys/fs/cgroup/Example/tasks/cpu.max 200000 1000000
将应用的 PID 添加到
Example/tasks
子组中:# echo "34578" > /sys/fs/cgroup/Example/tasks/cgroup.procs # echo "34579" > /sys/fs/cgroup/Example/tasks/cgroup.procs
示例命令确保所需的应用程序成为
Example/tasks
子组的成员,并且不超过为此子组配置的 CPU 时间分布。
验证步骤
验证应用程序是否在指定的控制组群中运行:
# cat /proc/34578/cgroup /proc/34579/cgroup 0::/Example/tasks 0::/Example/tasks
上面的输出显示了在
Example/tasks
子组中运行的指定应用程序的进程。检查节流应用程序的当前 CPU 消耗:
# top top - 11:13:53 up 23:10, 1 user, load average: 0.26, 1.33, 1.66 Tasks: 104 total, 3 running, 101 sleeping, 0 stopped, 0 zombie %Cpu(s): 3.0 us, 7.0 sy, 0.0 ni, 89.5 id, 0.0 wa, 0.2 hi, 0.2 si, 0.2 st MiB Mem : 3737.4 total, 3312.6 free, 133.4 used, 291.4 buff/cache MiB Swap: 4060.0 total, 4060.0 free, 0.0 used. 3376.0 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 34578 root 20 0 18720 1756 1468 R 10.0 0.0 37:36.13 sha1sum 34579 root 20 0 18720 1772 1480 R 10.0 0.0 37:41.22 sha1sum 1 root 20 0 186192 13940 9500 S 0.0 0.4 0:01.60 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp ...
请注意,
PID 34578
和PID 34579
的 CPU 消耗已减少到 10%。Example/tasks
子组将其进程控制到 CPU 时间的 20%。由于控制组中有 2 个进程,因此每个进程可以使用 10% 的 CPU 时间。
其它资源
- 了解控制组群
- 内核资源控制器
- 挂载 cgroups-v2
- 为 CPU 时间分布准备 cgroup
-
cgroups(7)
、sysfs(5)
手册页