48

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

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

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

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

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

4

4 回答 4

9

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

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

cpuset {
    cpuset.cpus="0-3";
}
于 2013-11-21T14:42:31.893 回答
7

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

有关更多信息,请参阅https://docs.docker.com/engine/reference/run/

于 2016-08-09T13:38:48.820 回答
4

来自 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.
于 2016-12-07T00:27:04.677 回答
3

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

是的。

中央处理器

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


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

没有。

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


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

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

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

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

和更多...

于 2018-01-26T12:57:58.230 回答