在 N 核机器上使用 1 个 CPU 配额运行的 1 个线程可以使用整个核心吗?

在 N 核机器上使用 1 个 CPU 配额运行的 1 个线程可以使用整个核心吗?

鉴于:

  • 一台有 8 个核心的机器
  • 具有 1 个 CPU 配额的 cgroup
  • 该 cgroup 仅有 1 个进程
  • 该进程是单线程的

如何让 CPU 供进程使用?

  • 该进程是否能够始终在单个核心上全速运行?
  • 给出的 cgroup全部 8同时使用 1/8 时间的 CPU,导致 cgroup 中有 7 个 CPU 未被使用,并且有 1 个 CPU 达到最大容量(占容量的 1/8)
  • 类似于循环,其中进程将在各个核心之间进行移动,因此总体而言,它拥有机器总 CPU 的 1/8,轮流使用每个 CPU 的 1/64 时间(相当肯定不会出现这种情况,这对于缓存等来说会很糟糕)

答案1

在您的案例中,cgroup 没有任何挑战。这个单线程应用程序将 100% 使用 1 个核心。Cgroup 是一个解决诸如“我们有 1000 个具有不同权重的进程和 10 个核心,我们可以使用这些核心来运行所有进程”之类的问题的系统。让我们将它们全部排队以领先它们的权重”。

要理解 cgroups CPU 配额,只需将其想象为“点”。Linux 内核不关心您的应用程序如何使用它:

  1. 你可以把它们全部花在 1 个核心上
  2. 你可以将它们全部花在 N 个核心上(例如,每个 N 个核心上花 1/N)

因此,在以下例子中https://www.golinuxcloud.com/cgroup-limit-cpu-usage-linux/您的应用程序在同一组中得分为 256,256/(1024+256+512+256) 的“CPU 时间”,您只能在 1 个 CPU 上使用它:

  1. 总共 1 个核心,你将获得 1 个 CPU 的 1/8(节流)
  2. 总共 4 个核心,你将获得 1 个 CPU 的 1/2(节流)
  3. 总共 8 个核心,您将获得 1 个 CPU
  4. 总共 16 个核心,你将获得 1 个 CPU,因为你的应用程序是单线程的

最好使用内部调度程序设置来防止多线程繁重作业中的节流。例如,uber 的 automaxprocs 将 golang 的 GOMAXPROCS 设置为等于提供的 cgroup 分数,以防止节流

参见:

https://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt

https://github.com/uber-go/automaxprocs

相关内容