【问题标题】:How to allocate 50% CPU resource to docker container via `docker run`?如何通过 docker run 为 docker 容器分配 50% 的 CPU 资源?
【发布时间】:2015-01-06 15:23:42
【问题描述】:

我有一个 4 核 CPU,我想将 50% 的 CPU 资源分配给 docker 容器。
看完docker-run手册和config.go源码。
我仍然不知道如何使用-c, --cpu-shares=0 选项。

docker run -c 0.5 -i -t ubuntu /bin/bash

或者

docker run -c 2 -i -t ubuntu /bin/bash

【问题讨论】:

  • 你看到docs.docker.com/engine/reference/run中的"Runtime constraints on resources"部分了吗
  • 我知道这个问题已经得到解答,但是为了让这个问题更有用,我建议澄清一下:是关于设置 minimum (QOS) 还是 maximum (限制,配额)的cpu资源?标题是 min,但示例是 max。接受的答案是两者 (cpu-shares is min but cpuset is max)

标签: docker


【解决方案1】:

cpu-shares 是一个“相对权重”,相对于默认设置 1024,所以如果你有两个容器在同一个内核上运行,你可以给它们 CPU 50-50 或 80-20 或任何你想要的通过调整数字。它是一个整数。

您无法根据需要使用此标志给出总体限制,但您可以使用 --cpuset mentioned here 限制容器运行的 CPU 集。

数字 1024 在Cgroups docs 中。

来自 Marek Goldmann 的This blog post 解释了 Docker 中的资源管理。

另请参阅Setting absolute limits on CPU for Docker containers,它表示可以使用 lxc(较旧的 Docker 实现)而不是 libcontainer(当前的 Docker 实现)来完成。

【讨论】:

  • 我需要将整数 (1024) 传递给 -c 选项,还是浮点数 (0.2)?
  • shipyard --cpus 0.1 选项是否直接传递给 docker? shipyard-project.com/docs/containers 谢谢。
  • 对于普通的 Docker,cpu-shares 需要一个整数。代码如下:github.com/docker/docker/blob/…
  • 对 Shipyard 了解不多,但从他们的代码来看,'cpus' 是一个浮点数;我看不出它如何直接传递给 Docker,因为 Docker 没有那个选项。
【解决方案2】:

这取决于环境,所以没有直接的答案,但请继续阅读。

来自docker run --help 命令:

-c, --cpu-shares=0         CPU shares (relative weight)

由于 Docker 基于 cgroups。 CPU 将分布在正在运行的容器中。默认值为1024

cat /sys/fs/cgroup/cpu/docker/cpu.shares
1024



所以,如果我们有 2 个容器,一个用于数据库,一个用于 Web 服务器

sudo docker run -c 614 -dit --name db postgres /postgres.sh
sudo docker run -c 410 -dit --name web nginx /nginx.sh

将 60% 分配给 db 容器(614 是 1024 的 60%)和 40% 分配给 web 容器。



如需进一步阅读,请参阅:

【讨论】:

    【解决方案3】:

    从 Docker 1.13 开始,在您的 4 核机器上只需添加 docker container run --cpus 2.0 [args...]

    来自this blog post的解释:

    不过,在 1.13 中,如果您希望容器仅限于一个 cpu,那么您只需将 --cpus 1.0 添加到 Docker 运行/创建命令行即可。如果您想要两个半 cpu 作为容器的限制,那么只需添加 --cpus 2.5。在 Docker 中,我们使用 CFS 配额和周期将容器的 cpu 使用限制为您想要的,并为您进行计算。

    还有check the docs

    【讨论】:

      【解决方案4】:

      注意:PR 15078 正在实现(2015 年 12 月)对停止和运行容器(可能是 docker 1.10 或 1.11)更改资源(包括 CPU)的支持

      我们决定允许设置我们所谓的资源,它现在由 cgroup 事物组成,因此下面是 PR #18073
      容器中唯一允许的可变元素位于 HostConfig 中,并且恰好位于 Resources 中(请参阅struct)。

      resources := runconfig.Resources{
              BlkioWeight:       *flBlkioWeight,
              CpusetCpus:        *flCpusetCpus,    <====
              CpusetMems:        *flCpusetMems,    <====
              CPUShares:         *flCPUShares,     <====
              Memory:            flMemory,
              MemoryReservation: memoryReservation,
              MemorySwap:        memorySwap,
              KernelMemory:      kernelMemory,
              CPUPeriod:         *flCPUPeriod,
              CPUQuota:          *flCPUQuota,
          }
      
      • 命令应该是set
      • 允许的更改作为标志传递:例如--memory=1Gb --cpushare=…(就像这个 PR 所做的那样)。
      • Resources 结构的每个属性都有一个标志(不多也不少)。

      请注意,通过docker set 进行更改应该会持续存在。
      即,这些更改将是永久性的(在容器的 JSON 中更新)


      还要检查最新的(2019 年 7 月,4 年后)openJDK 8u212(或更高版本),其中确实有官方 Docker 支持。

      【讨论】:

        【解决方案5】:

        看看这里,这显然是你要找的:

        https://docs.docker.com/engine/reference/run/#cpu-period-constraint

        默认的 CPU CFS(完全公平调度器)周期为 100 毫秒。我们可以使用 --cpu-period 来设置 CPU 的周期来限制容器的 CPU 使用率。通常 --cpu-period 应该与 --cpu-quota 一起使用。

        例子:

        $ docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:14.04 /bin/bash
        

        如果有 1 个 CPU,这意味着容器每 50 毫秒可以获得 50% 的 CPU 运行时间。

        周期和配额定义:

        内 每个给定的“周期”(微秒),一个组最多只能消费 CPU 时间的“配额”微秒。当一个 CPU 带宽消耗 组超过这个限制(在那个时期),属于它的任务 层次结构将受到限制,并且在下一次之前不允许再次运行 期间。

        【讨论】:

          猜你喜欢
          • 2021-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-06
          • 1970-01-01
          • 2018-10-31
          • 1970-01-01
          相关资源
          最近更新 更多