【问题标题】:Docker 17.06-ce default container memory limit on shared host resourcesDocker 17.06-ce 对共享主机资源的默认容器内存限制
【发布时间】:2019-08-08 21:03:28
【问题描述】:

我有一个资源为 8 核 / 16 GB RAM 的主机。我们使用cgroup 为我们的自定义应用程序分配CPUmemory。我们试图在我们的自定义应用程序和 docker 之间创建一个静态分区资源。例如,我们正在尝试分配以下内容:-

4 CPU cores / 8 GB RAM --> docker
3 CPU cores / 6 GB RAM --> custom_app_1

the remaining for OS

我们已经设法为custom_app_1 执行隔离。问题是我如何为我们的容器创建默认限制内存和 cpu,而不必为单个容器使用标志 --memory--cpus。我不需要限制每个容器,但我需要确保在主机中运行的所有容器不能超过 8GB RAM 和 4 个 CPU 内核的使用量,否则它将与我的 custom_app_1 争夺资源

当我执行docker stats 时,每个容器都看到 16 GB 的 RAM,我该如何配置以便它们只能看到 8 GB 的 RAM 和 4 个 CPU 内核

【问题讨论】:

  • 为什么不控制 docker daemon 资源? freedesktop.org/software/systemd/man/…。我假设它会限制启动的整体容器。但我不是 100% 支持它
  • 我已将MemoryMax=1G 添加到/usr/lib/systemd/system/docker.service 文件中,但仍然可以看到容器占用了整个主机内存。我使用docker stats 来检查内存使用情况和限制。如果有人能指导我设置cgroupfs 或限制dockerd 使用容器的所有内存,我将不胜感激

标签: docker


【解决方案1】:

所以你需要做的是为内存创建一个 SystemD 切片。

# /etc/systemd/system/limit-docker-memory.slice
[Unit]
Description=Slice with MemoryLimit=8G for docker
Before=slices.target

[Slice]
MemoryAccounting=true
MemoryLimit=8G

然后在/etc/docker/daemon.json中配置该切片

{
    "cgroup-parent": "limit-docker-memory.slice"
}

重新加载 systemctl 并重启 docker

systemctl daemon-reload
systemctl restart docker

请参阅documentation中的相关部分

默认 CGROUP 父级

--cgroup-parent 选项允许您设置默认 cgroup 父级以用于容器。如果未设置此选项,则默认为 /docker 用于 fs cgroup 驱动程序和 system.slice 用于 systemd cgroup 驱动程序。

如果 cgroup 有前导正斜杠 (/),则在根 cgroup 下创建 cgroup,否则在守护进程 cgroup 下创建 cgroup。

假设守护进程在 cgroup daemoncgroup 中运行,--cgroup-parent=/foobar 在 /sys/fs/cgroup/memory/foobar 中创建 cgroup,而使用 --cgroup-parent=foobar 在 /sys 中创建 cgroup /fs/cgroup/memory/daemoncgroup/foobar

systemd cgroup 驱动对 --cgroup-parent 有不同的规则。 Systemd 按切片表示层次结构,切片的名称编码树中的位置。所以 systemd cgroups 的 --cgroup-parent 应该是一个切片名称。名称可以由以破折号分隔的一系列名称组成,这些名称描述了从根切片到切片的路径。例如,--cgroup-parent=user-a-b.slice 表示容器的内存 cgroup 在 /sys/fs/cgroup/memory/user.slice/user-a.slice/user-a-b.slice/docker 中创建-.scope。

也可以使用 docker create 和 docker run 上的 --cgroup-parent 选项为每个容器设置此设置,并且优先于守护程序上的 --cgroup-parent 选项。

【讨论】:

  • 谢谢。这似乎工作正常!守护进程/dockerd 正确地将容器范围放置在给定的切片内。但是有一个问题,当我执行docker stats 时,我仍然看到它正在使用整个主机内存。但是当我发出systemd-cgls 时,我确实看到旋转的容器落在我创建的父组切片中。不幸的是,从docker stats 的角度来看,它并没有显示它正在使用限制。除非我错过了什么。虽然父 cgroup 有内存限制,但我如何真正确认它实际上使用了那么多并且没有超出?
  • 您可以尝试并测试使用这个unix.stackexchange.com/questions/99334/…
  • 谢谢,stress 帮助
  • 很抱歉打扰您,但/etc/docker/daemon.json 已损坏,不应出现昏迷
  • systemctl: command not found的情况下有没有办法做到这一点?我认为 Ubuntu 14.04 使用 Upstart 而不是 Systemd。
猜你喜欢
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多