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

t7e*_*t7e 9 cpu cpu-usage grafana kubernetes prometheus

我们以这款处理器为例:2核4线程(每核2线程)的CPU

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

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

考虑到超线程,我无法理解他们如何在幕后计算这些毫核。

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


PS:无意中,在这里找到了一个真正描述性的解释:Multi threading with Millicores in Kubernetes

tes*_*ile 15

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

例如

如果我设置quota为 250ms 和period250ms。这告诉内核cgroup每 250 毫秒可以使用 250 毫秒的 CPU 周期时间。这意味着它可以使用 100% 的 CPU。

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

如果我设置quota为 125ms 并保持period为 250ms。这告诉内核cgroup每 250 毫秒可以使用 125 毫秒的 CPU 周期时间。这意味着它可以使用 50% 的 CPU。

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

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