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