

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

# 在 AL2023 中使用 cgroups 限制进程资源使用量
<a name="resource-limiting-raw-cgroups"></a>

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

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

**在命令行使用 `libcgroup-tools` 限制资源使用量**

1.  安装 `libcgroup-tools` 软件包。

   ```
   [ec2-user ~]$ sudo dnf install {{libcgroup-tools}}
   ```

1.  创建一个包含 `memory` 和 `cpu` 控制器的 `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` 限制的文件。

1.  将我们 `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
   ```

1.  将我们 `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 使用量的方式。

1.  以下示例在 `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}}
   ```

1. 通过移除 cgroup 进行清理

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

 [Linux 内核关于 `cgroup-v2` 的文档](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html)包含关于其工作原理的详细说明。[cpu](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html#cpu) 和 [memory](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html#memory) 控制器的文档涵盖了如何使用每个可调选项的细节。