如何将50%的CPU资源分配给docker容器?

时间:2014-11-10 10:41:55

标签: 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

5 个答案:

答案 0 :(得分:20)

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

您无法使用此标记给出总体限制,但您可以使用--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实现)。

答案 1 :(得分:12)

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

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容器的60%(614为1024的60%)和40%的web容器。


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

答案 2 :(得分:2)

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

  

我们决定允许设置我们称之为资源的资源,其中包括cgroup thingies,因此以下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中更新)

答案 3 :(得分:2)

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

来自this blog post的解释:

  

在1.13中,如果您希望将容器限制为一个cpu,那么您只需将--cpus 1.0添加到Docker run / create命令行即可。如果您希望将两个半cpus作为容器的限制,则只需添加--cpus 2.5。在Docker中,我们使用CFS配额和句点将容器的CPU使用量限制为您想要的并为您进行计算。

check the docs

答案 4 :(得分:1)

看看这里,这显然是你在寻找的东西:

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

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

示例:

auto prev = std::signal(SIGINT, set_signal_raised);
if (prev != set_signal_raised) {
    std::cerr << "Unexpected handler." << std::endl;
    abort();
}

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

期间和配额定义:

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