AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 789556
Accepted
F1Linux
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 1 个回答
  • 183 Views

1 个回答

  • Voted
  1. 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:

    systemctl status docker.slice 输出

    systemd-cgtop:

    systemd-cgtop 输出

    dmesg |grep -i oom输出:

    备注oom-kill:constraint=CONSTRAINT_MEMCG。stress-ng当 Cgroups 试图超过我们的内存阈值时,它会崩溃: “dmesg |grep -i oom”

    结论:

    由于缺乏全面的操作指南,我花了一段时间才让 Cgroups 在 docker-compose 中工作。由于我正在将 OpenLDAP 移植到 AARCH64,我认为值得花点时间记录我所遵循的过程,以免其他人为让它工作而头疼。;-)

    无论如何,其他企业人员正在徒劳地寻找一些配置帮助-

    -特伦斯·霍拉汉

    • 0

相关问题

  • journalctl 中的区分级别

  • 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _

  • systemd:如何在服务启动时运行脚本,而不编辑服务定义

  • 使用 systemd 看门狗支持重新启动应用程序

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve