F1Linux Asked: 2025-01-14 18:48:48 +0800 CST2025-01-14 18:48:48 +0800 CST 2025-01-14 18:48:48 +0800 CST 如何在 docker-compose 容器上配置 Cgroup V2 限制 772 我想在 Docker-Compose 容器上配置 cgroups V2 资源限制。我该怎么做? systemd 1 个回答 Voted Best Answer F1Linux 2025-01-14T18:48:48+08:002025-01-14T18:48:48+08:00 简介: 我吃自己的狗粮,几年来一直在面向公众的 docker-compose 容器上使用这个解决方案。因此,它经过了充分的实战测试,最后的测试证据证明了它确实如此。 此两步解决方案仅需 2 分钟即可在 Docker-Compose 容器上配置 Cgroup V2 要求: 仅(2)个要求: Docker 主机操作系统:支持 Cgroup V2 的 SystemD 主机。我在此解决方案中使用 Ubuntu 24.04.1 LTS docker-compose 版本:使用 v3.9 格式的 docker-compose 文件。但任何支持该croup_parent指令的版本都应该可以工作 已在比上述版本更早的版本上进行了验证,但应该可以在任何支持 Cgroup v2 的 SystemD Linux 发行版上移植而无需修改 请注意,配置是特定于容器的!!!:虽然我在 Alpine Linux 和 Ubuntu AARCH64 容器上运行解决方案,但它也可以在其他 arch Docker 容器上运行 - 在容器级别没有配置或依赖项。 步骤 1:主机配置: 在以下路径创建一个名为“docker.slice”的文件: /etc/systemd/system/docker.slice 以下是通用配置;请根据您的具体用例调整为合理的值: [Unit] Description=Slice that limits docker resources Before=slices.target [Slice] MemoryAccounting=true CPUAccounting=true TasksMax=30% AllowedCPUs=1-3 # NOTE: If slice restricted to 3 of 4 cores, max avail. CPUQuota= 300%, NOT 400% CPUQuota=300% # CPUWeight value range: 1-10000 CPUWeight=8000 MemoryLow=1G MemoryHigh=2G MemoryMax=2G # IOWeight value range: 1-10000 IOWeight=5000 阅读您的新更改: systemctl daemon-reload 步骤 2 DOCKER-COMPOSE 配置: 在 docker-compose 文件中,在cgroup_parent指令中指定在步骤 1 中创建的 systemd 文件的名称:docker.slice cgroup_parent: docker.slice Jason 格式:我cgroup_parent在自己的 docker-compose 文件的第 5 个空格上添加指令之前插入了 (4) 个空格。 重新启动 docker-compose 容器。 现在当你执行: systemctl status docker.slice 您将看到您的容器在 Cgroups 资源控制下运行。docker-compose 容器的 Cgroups V2 配置已完成。就是这样! (可选步骤)配置容器: 重建容器以stress-ng验证资源限制是否有效。stress-ng测试完成后,从容器构建过程中删除。 但是,如果您在查看下面的测试证据后对该解决方案的工作效果感到满意,那么您可以跳过这一步。 测试: 压力测试: 我们将stress-ng 在容器内使用以证明我们的 Cgroup 限制正在执行。stress-ng我们可以使用无数命令来测试各种事物,但我只提供一个测试,因为这并不是一个“stress-ng”方法。 进入容器: docker exec -it <Container ID from "docker ps"> sh 或者如果bash它在你的容器内可用(需要在 Alpine Linux 中明确添加它): docker exec -it <Container ID from "docker ps"> bash 进入我们正在测试 Cgroup 资源限制的容器后,执行压力测试: stress-ng --cpu 0 --iomix 4 --vm 16 --vm-bytes 4G --timeout 180s --metrics 请注意,我们在 中将内存资源限制设置为最大值 2G 。因此,我们将在上述命令中使用4Gdocker.slice的值来限制内存。如果所有配置都正确,我们不应该看到任何超过 2G 的内容。stress-ng 监控资源限制: 在新的终端窗口/选项卡中,执行以下监控命令以验证限制是否正确执行。 注意:以下命令将从主机执行- 而不是在容器内执行! systemctl status docker.slice systemd-cgtop 下面提供了一些屏幕截图,以证明我们的 Cgroups V2 配置正常运行。但请注意,stress-ng为了便于说明,所有命令后的输出均被截断。 systemctl status docker.slice: systemd-cgtop: dmesg |grep -i oom输出: 备注oom-kill:constraint=CONSTRAINT_MEMCG。stress-ng当 Cgroups 试图超过我们的内存阈值时,它会崩溃: 结论: 由于缺乏全面的操作指南,我花了一段时间才让 Cgroups 在 docker-compose 中工作。由于我正在将 OpenLDAP 移植到 AARCH64,我认为值得花点时间记录我所遵循的过程,以免其他人为让它工作而头疼。;-) 无论如何,其他企业人员正在徒劳地寻找一些配置帮助- -特伦斯·霍拉汉
简介:
我吃自己的狗粮,几年来一直在面向公众的 docker-compose 容器上使用这个解决方案。因此,它经过了充分的实战测试,最后的测试证据证明了它确实如此。
此两步解决方案仅需 2 分钟即可在 Docker-Compose 容器上配置 Cgroup V2
要求:
仅(2)个要求:
croup_parent
指令的版本都应该可以工作已在比上述版本更早的版本上进行了验证,但应该可以在任何支持 Cgroup v2 的 SystemD Linux 发行版上移植而无需修改
请注意,配置是特定于容器的!!!:虽然我在 Alpine Linux 和 Ubuntu AARCH64 容器上运行解决方案,但它也可以在其他 arch Docker 容器上运行 - 在容器级别没有配置或依赖项。
步骤 1:主机配置:
在以下路径创建一个名为“docker.slice”的文件:
/etc/systemd/system/docker.slice
以下是通用配置;请根据您的具体用例调整为合理的值:
阅读您的新更改:
步骤 2 DOCKER-COMPOSE 配置:
在 docker-compose 文件中,在
cgroup_parent
指令中指定在步骤 1 中创建的 systemd 文件的名称:docker.slice
Jason 格式:我
cgroup_parent
在自己的 docker-compose 文件的第 5 个空格上添加指令之前插入了 (4) 个空格。重新启动 docker-compose 容器。
现在当你执行:
您将看到您的容器在 Cgroups 资源控制下运行。docker-compose 容器的 Cgroups V2 配置已完成。就是这样!
(可选步骤)配置容器:
重建容器以
stress-ng
验证资源限制是否有效。stress-ng
测试完成后,从容器构建过程中删除。但是,如果您在查看下面的测试证据后对该解决方案的工作效果感到满意,那么您可以跳过这一步。
测试:
压力测试:
我们将
stress-ng
在容器内使用以证明我们的 Cgroup 限制正在执行。stress-ng
我们可以使用无数命令来测试各种事物,但我只提供一个测试,因为这并不是一个“stress-ng”方法。进入容器:
或者如果
bash
它在你的容器内可用(需要在 Alpine Linux 中明确添加它):进入我们正在测试 Cgroup 资源限制的容器后,执行压力测试:
请注意,我们在 中将内存资源限制设置为最大值 2G 。因此,我们将在上述命令中使用4G
docker.slice
的值来限制内存。如果所有配置都正确,我们不应该看到任何超过 2G 的内容。stress-ng
监控资源限制:
在新的终端窗口/选项卡中,执行以下监控命令以验证限制是否正确执行。
注意:以下命令将从主机执行- 而不是在容器内执行!
下面提供了一些屏幕截图,以证明我们的 Cgroups V2 配置正常运行。但请注意,
stress-ng
为了便于说明,所有命令后的输出均被截断。systemctl status docker.slice
:systemd-cgtop
:dmesg |grep -i oom
输出:备注
oom-kill:constraint=CONSTRAINT_MEMCG
。stress-ng
当 Cgroups 试图超过我们的内存阈值时,它会崩溃:结论:
由于缺乏全面的操作指南,我花了一段时间才让 Cgroups 在 docker-compose 中工作。由于我正在将 OpenLDAP 移植到 AARCH64,我认为值得花点时间记录我所遵循的过程,以免其他人为让它工作而头疼。;-)
无论如何,其他企业人员正在徒劳地寻找一些配置帮助-
-特伦斯·霍拉汉