我有一个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
答案 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
容器。
如需进一步阅读,请参阅:
cpuset
选项:--cpuset="" CPUs in which to allow execution (0-3, 0,1)
答案 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使用量限制为您想要的并为您进行计算。
答案 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带宽消耗一个 组超过此限制(对于该期间),属于其的任务 层次结构将被限制,并且不允许再次运行 周期。