CPU 资源单位 (millicore/millicpu) 是如何计算的?

How are CPU resource units (millicore/millicpu) calculated under the hood?

我们以这个处理器为例:a CPU 2核4线程(每核2线程).

据我了解,这样的 CPU 具有 2 个物理内核,但可以通过超线程同时处理 4 个线程。但是,实际上,一个物理内核一次只能 运行 个线程,但是使用超线程,CPU 利用管道中的空闲阶段来处理另一个线程。

现在,这里是 Kubernetes Prometheus 和 Grafana 及其 CPU 资源单位度量 - millicore/millicpu。因此,他们实际上将一个核心切成 1000 毫核。

考虑到超线程,我不明白他们是如何计算这些毫核的。

例如,一个进程如何使用 100millicore(内核的第 10 部分)?这在技术上如何可能?


PS:无意中,在这里找到了一个真正描述性的解释:

这变得非常复杂。所以 k8s 实际上并没有管理它,它只是在底层容器 运行time(docker、containerd 等)之上提供了一个层。当您将容器配置为使用 100 millicore k8 时,它会向下层容器 运行time 和 运行time 处理它。现在,一旦你开始进入这个级别,你就必须开始研究 Linux 内核以及它如何 cpu 使用 cgroups 进行调度/速率。这变得非常有趣和复杂。简而言之:linux CFS Bandwidth Control 是管理进程(容器)可以使用多少 cpu 的东西。通过将 quotaperiod 参数设置为计划,您可以通过控制进程在暂停前可以 运行 的时间以及暂停的频率来控制 CPU 的使用量 运行s。正如您正确识别的那样,您不能只使用十分之一的核心。但是您可以使用十分之一的时间,并且随着时间的推移,您只能使用十分之一的核心。

例如

如果我将 quota 设置为 250 毫秒,将 period 设置为 250 毫秒。这告诉内核,这个 cgroup 每 250 毫秒可以使用 250 毫秒的 CPU 循环时间。这意味着它可以使用 100% 的 CPU.

如果我将 quota 设置为 500 毫秒并保持 period 为 250 毫秒。这告诉内核,这个 cgroup 每 250 毫秒可以使用 500 毫秒的 CPU 循环时间。这意味着它可以使用 200% 的 CPU。 (2 核)

如果我将 quota 设置为 125 毫秒并保持 period 为 250 毫秒。这告诉内核,这个 cgroup 每 250 毫秒可以使用 125 毫秒的 CPU 循环时间。这意味着它可以使用 CPU.

的 50%

这是一个非常简短的解释。这是一些进一步的阅读:

https://blog.krybot.com/a?ID=00750-cfae57ed-c7dd-45a2-9dfa-09d42b7bd2d7 https://www.kernel.org/doc/html/latest/scheduler/sched-bwc.html