觉得这段解释的很好:
例如:a CPU with 2 cores and 4 threads (2 threads per core)。
根据我的阅读,这样的 CPU 有 2 个物理内核,但可以通过超线程同时处理 4 个线程。但是,实际上,一个物理内核一次只能真正运行一个线程,但是使用超线程,CPU 会利用管道中的空闲阶段来处理另一个线程。
现在,这里是Kubernetes与 Prometheus 和 Grafana 及其 CPU 资源单位测量 -millicore/millicpu。因此,他们实际上将一个核心切成 1000 毫核。
考虑到超线程,我无法理解他们如何计算引擎盖下的毫核。
例如,一个进程如何使用 100millicore(内核的第 10 部分)?这在技术上怎么可能?
PS:无意中,在这里找到了一个非常描述性的解释:Multi threading with Millicores in Kubernetes
Answers
这变得非常复杂。所以 k8s 实际上并没有管理它,它只是在底层容器运行时(docker、containerd 等)之上提供了一个层。当您将容器配置为使用 100 个millicore时,k8 会将其交给底层容器运行时,运行时会处理它。现在,一旦你开始进入这个级别,你就必须开始查看 Linux 内核以及它如何使用 cgroups 进行 cpu 调度/速率。这变得非常有趣和复杂。简而言之:linuxCFS Bandwidth Control是管理进程(容器)可以使用多少 cpu 的东西。通过将quota和period参数设置为 schedular,您可以通过控制进程在暂停之前可以运行多长时间以及运行频率来控制 CPU 的使用量。正如您正确识别的那样,您不能只使用十分之一的核心。但是您可以使用十分之一的时间,而通过这样做,随着时间的推移,您只能使用十分之一的核心。
例如
如果我将quota设置为 250 毫秒,将period设置为 250 毫秒。这告诉内核这个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。
转载:CPU 资源单位(millicore/millicpu)是如何计算的?_kubernetes_K8SOQ-K8S/Kubernetes