【问题标题】:How to prevent docker containers from consuming all CPU?如何防止 docker 容器消耗所有 CPU?
【发布时间】:2016-06-10 15:44:20
【问题描述】:

我对 Docker 有点陌生,本周遇到了一个问题,即容器中的一个进程占用了 100% 的 CPU。运行时我没有对容器设置任何资源限制,这导致整个服务器停止响应。我无法 docker stop、docker kill,最终失去了 ssh 到主机的能力。我最终重新启动了机器。

我正在寻找允许主机保留一些 CPU 容量的选项,以便不会发生上述情况。

一种想法是在所有容器上使用 docker run --cpuset-cpus 以防止它们使用 CPU 0,这将只供主机使用。这种方法似乎很浪费。

其他选项在我如何限制方面不太清楚。

  • --cpu-shares 只允许我将总使用量划分为百分比,这可能会使我处于上述相同的情况。

  • --cpu-period--cpu-quota 对我来说不太清楚,但他们似乎不允许这样做。

有没有办法为主机保留一定百分比的 CPU?

【问题讨论】:

  • 100% 的 CPU 仍然倾向于响应,即使慢了一点。我怀疑您可能会看到机器内存不足并将其他主机进程推出交换的结果。
  • 我在失去连接之前看到的最后一次读数没有显示任何内存压力。
  • 你找到答案了吗?
  • 你说“容器中的进程占用 100% CPU”,如果你能看到那个进程是什么?另一件事是,如果你能展示你是如何启动你的容器的?你的命令...

标签: docker


【解决方案1】:

如果您使用 docker 1.13 或更高版本(您应该这样做),您应该根据 docs 使用标志 --cpus=0.x

从那里你可以去多个方向。

如果您想防止一个粗糙的容器可能使您的主机 CPU 过载,您可以为启动的每个容器分配 --cpu=X 标志,其中 X 是可用 CPU 的数量减去一或您认为节省的任何其他余量。这样一个粗糙的容器不会耗尽您的 CPU 资源(但两个粗糙的容器可以)。这为您提供了资源效率最高的配置,因为所有容器在必要时最多可以使用 X 个 CPU(考虑应用程序启动),但如果不需要这些资源,请不要阻塞它们。

另一种情况是您希望所有容器的 CPU 消耗与您的主机之间完全隔离。然后,您应该为每个容器分配其唯一的 CPU 份额,并跟踪所有给定 CPU 份额的总和不会高于这台机器上可用 CPU 的总数。这样,所有容器都可以最大限度地利用它们的 CPU,并且您的主机仍然可以运行。

正如 BMitch 的评论中提到的。仍然有可能通过其他方式使主机 CPU 过载。例如,通过强制内核进行大量交换。

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2023-01-25
    • 2016-05-24
    • 2016-12-09
    相关资源
    最近更新 更多