Docker CPU与主机进程的争用

时间:2016-09-26 09:06:55

标签: ubuntu docker

我有一些以docker容器运行的进程和一些直接在主机中运行的进程。实际上,其中一个主机进程也启动了其他docker容器。因此,将所有内容移动到docker并在docker中运行docker并不是我想做的事情。

在重载时,当启动多个docker容器时,它们最终会占用100%的cpu,几乎不会为主机进程留下任何内容。即使是应该杀死这些容器的主机进程也无法运行。

是否可以将所有docker容器的总CPU使用率限制为90%,因此即使在繁重的负载下,主机进程也会获得10%的cpu?

设置cpu shared没有帮助,因为它们只是所有docker容器的相对权重。他们不为主人留下任何东西。

设置cpu配额不是最理想的,它们会在使用率较低时导致利用不足,并且在负载较重时仍然无法停止。

3 个答案:

答案 0 :(得分:1)

如果您本地运行,则无法以这种方式限制负载。

如果您正在使用虚拟机(例如在OSX或Windows上运行),您可以通过VM设置对此进行限制,但是否则无法通过docker有效地执行此操作。

但是,如果要限制计算机可用的CPU总数,可以尝试使用--cpusetdoc link),它可以指定容器的可用CPU总数。

根据您的具体情况,您可能能够完成这项工作 - 如果您在4核计算机上运行,​​您可以为容器分配3并将1保留给主机。它仍然效率低下,但也许对你的情况足够好。

来自文档:

$ docker run -it --cpuset-cpus="1,3" ubuntu:14.04 /bin/bash

但是如果您已经发现cpu配额选项有限制,我不确定这会更好。

答案 1 :(得分:0)

要扩展最后一个答案,可以在高级设置中看到专用于docker的cpu数量(在Windows版本中)。

enter image description here

答案 2 :(得分:0)

回答我自己的问题,并使用各种选项。 Elysian Fields的答案是最简单且可靠的答案之一。还有其他一些选项,我现在结合使用。

  1. -cpuset-cpus:在具有4 cpus(0-3)的计算机上,我可以通过--cpuset-cpus = 1-3(即0来启动所有容器)为主机进程专门预留1个CPU。保留给主机进程)
  2. -cpu-quota /-cpu-period:可用于限制容器的CPU时间共享。例如,--cpu-quota = 10000 --cpu-period = 100000(将CPU使用率限制为每100ms 10ms)。但是,如果在示例10中启动的容器数量超过一定数量,则此方法将无效。此外,当没有其他进程时,CPU 将被浪费。
  3. 如果图像中包含 nice ,请开始该过程。 nice命令应在容器内运行。例如, docker run openjdk:10-slim nice -n5 java HelloWorld因此,与这些容器任务相比,重要的宿主进程始终获得更高的优先级。 (优先级可以降低到19(最低)。如果要增加docker容器中进程的优先级,请在docker命令中添加--cap-add=sys_nice