我想对 Docker-Compse 容器施加 cgroups V2 资源限制。 我如何实现这一目标?
尽管 Cgroups 在主机级别有文档记录,但没有大量关于将其挂接到 docker-compose 容器的文档。我拼凑了一个可行的解决方案,多年来我一直在面向公众的 docker-compose 容器上使用该解决方案。所以感觉它已经经过了充分的战斗考验。
以下配置适用于比指定版本更早的版本,但此处提供的配置已在以下版本中验证为正确,但应该可以在任何运行支持 Cgroup v2 的 systemd 的现代发行版上进行移植,无需修改:
stress-ng
已添加到容器中以验证资源限制是否有效配置是容器特定的:容器级别没有配置,只有主机和 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 文件中,使用
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
命令输出:
systemd-cgtop
输出:
关于为 docker-compose 容器配置 Cgroup v2 支持,有很多 oogatz,并且考虑到在企业中运行容器化基础设施的重要性,只是想帮助其他正在努力实现资源限制的人。如果我错过了任何步骤——我不相信我错过了——请给我评论,我会解决它。由于我不久前将 OpenLDAP 移植到 AARCH64 Docker 容器,所以这个过程应该是全面的。
同样,如果有人有任何改进解决方案的意见,如果您在评论部分告诉我,我会很乐意更新答案。
希望这可以节省人们使用 Docker 容器来掌握 Cgroup V2 的时间!
-泰伦斯·霍拉汉