docker 如何使用其主机操作系统的 CPU 内核?

Posted

技术标签:

【中文标题】docker 如何使用其主机操作系统的 CPU 内核?【英文标题】:How does docker use CPU cores from its host operating system? 【发布时间】:2013-12-06 02:11:45 【问题描述】:

基于 Docker 基于 LXC 的事实,我的理解是 Docker 容器共享来自其主机操作系统的各种资源。我担心的是 CPU 内核。这是一个场景:

主机 linux 操作系统有 8 个内核 我必须在上面的主机操作系统上部署一组 docker 容器。 我需要部署的一些 docker 容器更适合使用 2 核

a) 因此,如果我在该主机上运行所有 docker 容器,它们是否会根据需要消耗 CPU/内核,就像它们在该主机操作系统上作为正常安装的应用程序运行一样?

b) docker 容器是否会消耗自己的进程,并且其中包含的所有处理都将被卡在该父进程的 CPU 内核上?

c) 如何指定一个 docker 容器以使用多个核心(例如 4 个)。我看到有一个 -C 标志可以指向一个核心 id,但似乎没有选项可以指定容器随机选择 N 个核心。

【问题讨论】:

【参考方案1】:

因此,如果我在该主机上运行所有 docker 容器,它们是否会根据需要消耗 CPU/内核,就像它们在该主机操作系统上作为正常安装的应用程序运行一样?

是的。

CPU

默认情况下,每个容器对主机 CPU 周期的访问是无限制的。您可以设置各种约束来限制给定容器对主机 CPU 周期的访问。


docker 容器是否会消耗自己的进程,并且其中包含的所有处理都将卡在该父进程的 CPU 内核上?

没有。

Docker 使用 Completely Fair Scheduler 在容器之间共享 CPU 资源。因此容器可以配置对 CPU 的访问。


如何指定 docker 容器以使用多个核心(例如 4 个)。我看到有一个 -C 标志可以指向一个核心 id,但似乎没有选项可以指定容器随机选择 N 个核心。

它是over可配置的。 Docker 中有更多的 cpu 选项可以组合使用。

--cpus= 指定容器可以使用多少可用的 CPU 资源。例如,如果宿主机有两个 CPU,而您设置 --cpus="1.5",则容器最多保证 1 个半的 CPU。

--cpuset-cpus 限制容器可以使用的特定 CPU 或内核。如果您有多个 CPU,则容器可以使用的逗号分隔列表或连字符分隔的 CPU 范围。第一个 CPU 编号为 0。有效值可能是 0-3(使用第一个、第二个、第三个和第四个 CPU)或 1,3(使用第二个和第四个 CPU)。

And more...

【讨论】:

有趣的是,人们可能会试图通过在/etc/systemd/system.conf 中为 systemd 配置CPUAffinity 来限制整个系统的 CPU 使用率,但看起来 Docker 完全忽略了这一点,将使用它可以使用的所有核心。限制它的唯一方法是在创建或运行容器时使用上述--cpuset-cpus 选项。【参考方案2】:

来自 ORACLE 文档:

  To control a container's CPU usage, you can use the
  --cpu-period  and --cpu-quota options with the docker 
  create and docker run commands  from version 1.7.0 of Docker onward.

  The --cpu-quota option specifies the number of microseconds 
  that a container has access to CPU resources during a 
  period specified by --cpu-period.
  As the default value of --cpu-period is 100000, setting the 
  value of --cpu-quota to 25000 limits a container to 25% of 
  the CPU resources. By default, a container can use all available CPU resources, 
  which corresponds to a --cpu-quota value of -1.

【讨论】:

【参考方案3】:

可能是最新(少数)版本发生了变化。现在,您可以使用docker run 的参数来约束您的 docker 容器: 新 docker 版本中当前答案的等价物是 docker run ubuntu /bin/echo 'Hello world --cpuset-cpus="0-3" 但是,这会将 docker 进程限制为这些 CPU,但是(如果我错了,请纠正我)其他容器也可以请求相同的集合。 一种可能更好的方法是使用 CPU 份额。

欲了解更多信息,请参阅https://docs.docker.com/engine/reference/run/

【讨论】:

【参考方案4】:

目前,我不认为 docker 提供这种粒度级别。它没有指定它在其 lxc.conf 文件中分配的核心数量,因此您可能会获得每个 docker 的所有核心(或者可能是 1 个,我对此不是 100% 确定)。

但是,您可以调整为给定容器生成的 conf 文件并设置类似

cpuset 
    cpuset.cpus="0-3";

【讨论】:

这并没有真正回答“在容器中运行的应用程序是否愿意看到并消耗所有 8 个内核?”的问题。但是,我在 IRC 中问过,情况就是这样。如果你有一个多核进程在一个容器中运行,并在另一个容器中运行另一个多核进程,资源争用将由 linux 内核调度程序处理。 请问这个文件在哪里 我认为 matt 的答案更准确。 Mac/Windows 用户注意事项:docker 可用的 CPU 受限于运行 docker 的主机,在 Mac/Windows 上是运行在 localhost OS 中的虚拟机。要为 docker 容器提供更多内核,请确保主机 VM 具有足够的内核。示例:docker-machine create --driver virtualbox --virtualbox-cpu-count 4 fourcpu。然后,容器将可以访问 4 个 CPU,这可以通过 docker run <image name> nproc 进行验证,应该打印 4 @grisaitis 在 Docker for Windows/Mac beta(不是 Docker Toolbox)中,用户可以指定多少 CPU 内核和多少内存应该分配给 Docker。

以上是关于docker 如何使用其主机操作系统的 CPU 内核?的主要内容,如果未能解决你的问题,请参考以下文章

Docker: CPU我劝你善良!!

基于Docker容器部署ELK日志分析系统

一个 docker 容器使用多少个 CPU?

使用 docker-compose 时如何在容器内使用主机用户修改卷文件

怎样将Docker容器中的文件导入到主机

如何从 docker 容器中获取 docker 主机的 IP 地址