在 Docker 中混合 cpu-shares 和 cpuset-cpus
Posted
技术标签:
【中文标题】在 Docker 中混合 cpu-shares 和 cpuset-cpus【英文标题】:Mixing cpu-shares and cpuset-cpus in Docker 【发布时间】:2016-04-13 01:29:22 【问题描述】:我想运行两个具有以下资源分配的容器:
容器“C1”:保留 cpu1,与 20 个 cpu-shares 共享 cpu2 容器“C2”:保留 cpu3,与 80 个 cpu-shares 共享 cpu2如果我这样运行这两个容器:
docker run -d --name='C1' --cpu-shares=20 --cpuset-cpus="1,2" progrium/stress --cpu 2
docker run -d --name='C2' --cpu-shares=80 --cpuset-cpus="2,3" progrium/stress --cpu 2
我知道 C1 像预期的那样占用了 100% 的 cpu1,但占用了 cpu2 的 50%(而不是 20%),C2 像预期的那样占用了 100% 的 cpu3 和 50% 的 cpu2(而不是 80%)。
看起来 --cpu-shares 选项被忽略了。 有没有办法获得我正在寻找的行为?
【问题讨论】:
【参考方案1】:docker run 提到该参数为:
--cpu-shares=0 CPU shares (relative weight)
而contrib/completion/zsh/_docker#L452
包括:
"($help)--cpu-shares=[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)"
所以这些值不是基于 % 的。
OP 提到 --cpu-shares=20/80
与以下 Cpuset constraints 一起使用:
docker run -ti --cpuset-cpus="0,1" C1 # instead of 1,2
docker run -ti --cpuset-cpus="3,4" C2 # instead of 2,3
(这些值为validated/checked only since docker 1.9.1 with PR 16159)
注意:还有CPU quota constraint:
--cpu-quota
标志限制容器的 CPU 使用率。默认值 0 允许容器占用 100% 的 CPU 资源(1 个 CPU)。
【讨论】:
我知道,我使用 20 和 80 来简化场景。因为我只有两个容器同时需要 100% 的 cpu(压力),并且份额设置为 20 和 80,所以它们应该在共享 cpu(cpu2)上分别以 20% 和 80% 运行。当然,我可以使用 4 和 16 或 80 和 320 之类的东西。 不,我的意思是这些值可能无法被识别。试试 200 和 800 看看是否效果更好。 @GiovanniQuattrocchi 如果你颠倒这些值? (800 和 200 而不是 200 和 800) 我不知道为什么,但是如果对 C1 使用 cpuset-cpus=0,1 对 C2 使用 cpuset-cpus=1,2 我得到了预期的行为...... @GiovanniQuattrocchi 你用的是什么版本的 docker?以上是关于在 Docker 中混合 cpu-shares 和 cpuset-cpus的主要内容,如果未能解决你的问题,请参考以下文章