鉴于:
- 一台有 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 个核心上
- 你可以将它们全部花在 N 个核心上(例如,每个 N 个核心上花 1/N)
因此,在以下例子中https://www.golinuxcloud.com/cgroup-limit-cpu-usage-linux/您的应用程序在同一组中得分为 256,256/(1024+256+512+256) 的“CPU 时间”,您只能在 1 个 CPU 上使用它:
- 总共 1 个核心,你将获得 1 个 CPU 的 1/8(节流)
- 总共 4 个核心,你将获得 1 个 CPU 的 1/2(节流)
- 总共 8 个核心,您将获得 1 个 CPU
- 总共 16 个核心,你将获得 1 个 CPU,因为你的应用程序是单线程的
最好使用内部调度程序设置来防止多线程繁重作业中的节流。例如,uber 的 automaxprocs 将 golang 的 GOMAXPROCS 设置为等于提供的 cgroup 分数,以防止节流
参见:
https://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt