在 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的主要内容,如果未能解决你的问题,请参考以下文章

Docker通过Cgroup 资源配置

Docker通过Cgroup 资源配置

docker对容器进行资源限制

Docker基本控制命令

docker 容器资源限制

docker私有仓库registry和资源控制cgroup