如何分配50%的CPU资源到docker集装箱?

我有一个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 

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

你不能像使用这个标志那样给出一个整体的限制,但是你可以使用--cpuset 提到的 --cpuset来限制容器运行的一组CPU。

数字1024是在Cgroups文档中 。

Marek Goldmann的博客文章解释了Docker中的资源pipe理。

另请参阅为Docker容器设置CPU的绝对限制 ,这表示可以使用lxc(较老的Docker实现),而不使用libcontainer(当前的Docker实现)来完成。

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

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 

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


进一步阅读请参阅:

  • cpu共享cgroups文档 。
  • cpuset选项:– --cpuset="" CPUs in which to allow execution (0-3, 0,1)
  • Docker post中的资源pipe理 。
  • 第3章configuration Shrikrishna Holla编着的Orchestating Docker一书的Docker容器

注意: 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结构的每个属性都有一个标志(不多也不less)。

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

看看这里,这显然是你在找什么:

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

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

例子:

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

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

期限和配额定义:

在每个给定的“周期”(微秒)内,一个组被允许仅消耗高达“配额”微秒的CPU时间。 当一个组的CPU带宽消耗超过此限制(在该时间段内)时,属于其层次结构的任务将被限制,并且在下一个时间段之前不允许再次运行。

由于Docker 1.13,在你的4核机器上只需添加docker container run --cpus 2.0 [args...]

来自这篇博客的解释:

在1.13中,如果你想要一个容器限制为一个cpu,那么你可以在你的Docker运行/创build命令行中添加--cpus 1.0 。 如果你想要两个半cpus作为容器的限制,那么只需添加--cpus 2.5 。 在Docker中,我们使用CFS配额和期限来限制容器的cpu使用情况,并根据需要进行计算。

另外检查文档 。