如何对 docker-compose 容器施加 cgroup V2 限制

问题描述 投票:0回答:1

我想对 Docker-Compse 容器施加 cgroups V2 资源限制。 我如何实现这一目标?

docker docker-compose systemd cgroups
1个回答
0
投票

简介:

尽管 Cgroups 在主机级别有文档记录,但没有大量关于将其挂接到 docker-compose 容器的文档。我拼凑了一个可行的解决方案,多年来我一直在面向公众的 docker-compose 容器上使用该解决方案。所以感觉它已经经过了充分的战斗考验。

以下配置适用于比指定版本更早的版本,但此处提供的配置已在以下版本中验证为正确,但应该可以在任何运行支持 Cgroup v2 的 systemd 的现代发行版上进行移植,无需修改:

  • Ubuntu 24.04.1 LTS
  • 使用 v3.9 格式化的 docker-compose 文件
  • stress-ng
    已添加到容器中以验证资源限制是否有效
  • 在具有 8GB RAM 的 Raspberry Pi 4 上运行的 AARCH64 容器

配置是容器特定的:容器级别没有配置,只有主机和 docker-compose 级别。因此,解决方案应该“适用于”您用来切割容器的任何容器架构。仅供参考,我使用 Docker Desktop 和

buildx
命令来剪切我的。

配置-容器:

使用

stress-ng
重建容器只是为了验证资源限制是否具有有意义的效果。 完成后,您当然可以从容器构建过程中将其删除。

配置-主机:

在以下路径中创建一个名为“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 a slice is 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

配置-Docker-Compose:

在 docker-compose 文件中,使用

cgroup_parent
指令,指定刚刚创建的 systemd 文件的名称: `docker.slice':

    cgroup_parent: docker.slice

Jason 格式化:在我的 docker-compose 文件中,我在第 5 个空格上添加

cgroup_parent
指令之前插入 (4) 个空格。

测试:

压力测试:

我们将使用

stress-ng
在容器内,通过以下命令用力锤击它。还有其他
stress-ng
命令,您可以通过一千种不同的方式来完成它,但出于说明目的,我仅提供一个测试:

stress-ng --cpu 0 --iomix 4 --vm 16 --vm-bytes 4G --timeout 180s --metrics

请注意,

docker.slice
中的资源限制设置为2G,因此我在上面的stress-ng命令中使用了
4G
。因此,我们永远不应该看到任何高于 2G 的东西都是幸福的。
0
cpus
值表示使用所有 CPU 进行测试。

资源限制监控:

打开新的终端窗口/选项卡以运行以下监控命令,以验证施加的限制是否具有有意义的效果。

注意:这些命令将从 THE HOST 运行 - 而不是在容器内。

systemctl status docker.slice
systemd-cgtop

我截取了一些屏幕截图以保持格式整洁,但出于说明目的,输出并未被截断,否则使用

stress-ng
命令它们将达到 10 英尺长。

systemctl status docker.slice
命令输出:

systemctl status docker.slice Output

systemd-cgtop
输出:

systemd-cgtop Output

结论:

关于为 docker-compose 容器配置 Cgroup v2 支持,有很多 oogatz,并且考虑到在企业中运行容器化基础设施的重要性,只是想帮助其他正在努力实现资源限制的人。如果我错过了任何步骤——我不相信我错过了——请给我评论,我会解决它。由于我不久前将 OpenLDAP 移植到 AARCH64 Docker 容器,所以这个过程应该是全面的。

同样,如果有人有任何改进解决方案的意见,如果您在评论部分告诉我,我会很乐意更新答案。

希望这可以节省人们使用 Docker 容器来掌握 Cgroup V2 的时间!

-泰伦斯·霍拉汉

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.