在 AL2023 中使用 cgroups 限制进程资源使用量 - Amazon Linux 2023

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 AL2023 中使用 cgroups 限制进程资源使用量

虽然推荐使用 使用 systemd 进行资源控制,但这部分介绍使用基础 libcgroup-tools 工具限制进程 CPU 和内存使用量的基本用法。这两种方法都是使用 cpulimit 工具(先前位于 EPEL 中)的替代方案。

以下示例涵盖在运行 stress-ng 压力测试(来自 stress-ng 程序包)的同时,使用 libcgroup-tools 程序包中的工具以及 sysfs 中的可调参数来限制其 CPU 和内存使用量。

在命令行使用 libcgroup-tools 限制资源使用量
  1. 安装 libcgroup-tools 软件包。

    [ec2-user ~]$ sudo dnf install libcgroup-tools
  2. 创建一个包含 memorycpu 控制器的 cgroup,并为其命名 (our-example-limits)。使用 -a-t 选项允许 ec2-user 用户控制 cgroup 的可调参数

    [ec2-user ~]$ sudo cgcreate -a ec2-user -t ec2-user -g memory,cpu:our-example-limits

    现在存在一个 /sys/fs/cgroup/our-example-limits/ 目录,其中包含可用于控制每个可调参数的文件。

    注意

    Amazon Linux 2 使用 cgroup-v1,而非 AL2023 使用的 cgroup-v2。在 AL2 上,sysfs 路径不同,并且会存在由 ec2-user 拥有的 /sys/fs/cgroup/memory/our-example-limits/sys/fs/cgroup/cpu/our-example-limits 目录,这些目录包含可用于控制 cgroup 限制的文件。

  3. 将我们 cgroup 中所有进程的内存使用量限制为 1 亿字节。

    [ec2-user ~]$ echo 100000000 > /sys/fs/cgroup/our-example-limits/memory.max
    注意

    Amazon Linux 2 使用 cgroup-v1,而非 Amazon Linux 2023 使用的 cgroup-v2。这意味着某些可调参数是不同的。要在 AL2 上限制内存使用量,需改用以下可调参数。

    [ec2-user ~]$ echo 10000000 > /sys/fs/cgroup/memory/our-example-limits/memory.limit_in_bytes
  4. 将我们 cgroup 中所有进程的 CPU 使用量限制为 10%。cpu.max 文件的格式为 $MAX $PERIOD,将组限制为每 $PERIOD 周期内消耗 $MAX

    [ec2-user ~]$ echo 10000 100000 > /sys/fs/cgroup/our-example-limits/cpu.max

    Amazon Linux 2 使用 cgroup-v1,而非 Amazon Linux 2023 使用的 cgroup-v2。这意味着某些可调参数是不同的,包括限制 CPU 使用量的方式。

  5. 以下示例在 our-example-limits cgroup 中运行 stress-ng(可通过运行 dnf install -y stress-ng 安装)。当 stress-ng 命令运行时,您可以使用 top 观察到其被限制在 CPU 时间的 10%。

    [ec2-user ~]$ sudo cgexec -g memory,cpu:our-example-limits stress-ng --cpu 1
  6. 通过移除 cgroup 进行清理

    [ec2-user ~]$ sudo cgdelete -g memory,cpu:our-example-limits

Linux 内核关于 cgroup-v2 的文档包含关于其工作原理的详细说明。cpumemory 控制器的文档涵盖了如何使用每个可调选项的细节。