27.4. 使用 cgroups-v1 为应用程序设置 CPU 限制
要使用 控制组版本 1 ( cgroups-v1)配置 CPU 限制,请使用 /sys/fs/ 虚拟文件系统。
先决条件
- 有 root 权限。
- 您有一个限制系统上安装的 CPU 消耗的应用程序。
您将系统配置为,在系统引导过程中,默认由
systemd系统和服务管理器挂载cgroups-v1:grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="systemd.unified_cgroup_hierarchy=0 systemd.legacy_systemd_cgroup_controller"
# grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="systemd.unified_cgroup_hierarchy=0 systemd.legacy_systemd_cgroup_controller"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这会在当前引导条目中添加所需的内核命令行参数。
流程
识别您要在 CPU 消耗中限制的应用程序的进程 ID (PID):
Copy to Clipboard Copied! Toggle word wrap Toggle overflow PID 为 6955的sha1sum示例应用程序消耗大量的 CPU 资源。在
cpu资源控制器目录中创建子目录:mkdir /sys/fs/cgroup/cpu/Example/
# mkdir /sys/fs/cgroup/cpu/Example/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此目录代表控制组,您可以在其中放置特定的进程,并将某些 CPU 限制应用到进程。同时,目录中将创建多个
cgroups-v1接口文件和特定于cpu控制器的文件。可选:检查新创建的控制组:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cpuacct.usage,cpu.cfs._period_us等文件代表特定的配置和/或限制,可以为Example控制组中的进程设置它们。请注意,文件名前缀为它们所属的控制组控制器的名称。默认情况下,新创建的控制组继承对系统整个 CPU 资源的访问权限,且无限制。
为控制组群配置 CPU 限制:
echo "1000000" > /sys/fs/cgroup/cpu/Example/cpu.cfs_period_us echo "200000" > /sys/fs/cgroup/cpu/Example/cpu.cfs_quota_us
# echo "1000000" > /sys/fs/cgroup/cpu/Example/cpu.cfs_period_us # echo "200000" > /sys/fs/cgroup/cpu/Example/cpu.cfs_quota_usCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
cpu.cfs_period_us文件代表控制组对必须重新分配的 CPU 资源的访问频率。时间段为微秒(µs, "us")。上限为 1000 000 微秒,下限为 1000 微秒。 cpu.cfs_quota_us文件表示控制组中的所有进程可以在一段时间内共同运行的总时间(以微秒为单位),如cpu.cfs_period_us所定义的那样。当控制组中的进程在单个时段内用完了配额所指定的所有时间时,它们将在该时段的剩余时间内被限制,并且直到下一个时段才允许运行。下限为 1000 微秒。上面的示例命令设定 CPU 时间限值,使得
Example控制组中的所有进程仅能每 1 秒(cpu.cfs_quota_us定义)每 1 秒(由cpu.cfs_period_us定义)运行 0.2 秒。
-
可选:验证限制:
cat /sys/fs/cgroup/cpu/Example/cpu.cfs_period_us /sys/fs/cgroup/cpu/Example/cpu.cfs_quota_us 1000000 200000
# cat /sys/fs/cgroup/cpu/Example/cpu.cfs_period_us /sys/fs/cgroup/cpu/Example/cpu.cfs_quota_us 1000000 200000Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将应用程序的 PID 添加到
Example控制组群中:echo "6955" > /sys/fs/cgroup/cpu/Example/cgroup.procs
# echo "6955" > /sys/fs/cgroup/cpu/Example/cgroup.procsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令可确保特定的应用成为
Example控制组的成员,并且不超过为Example控制组配置的 CPU 限制。PID 必须代表系统中一个已存在的进程。此处的PID 6955被分配给sha1sum /dev/zero &进程,用来演示cpu控制器的用例。
验证
验证应用程序是否在指定的控制组群中运行:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用程序的进程在
Example控制组中运行,将 CPU 限制应用到应用程序的进程。确定节流应用程序的当前 CPU 消耗:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,
PID 6955的 CPU 消耗从 99% 减少到 20%。
cpu.cfs_period_us 和 cpu.cfs_quota_us 在 cgroups-v2 的对应部分是 cpu.max 文件。cpu.max 文件可以通过 cpu 控制器获得。