我最近收到了一台配备 M1 pro CPU 的 MacBook Pro,它有 2 个“效率”核心和 8 个性能核心。当我运行 htop/btop/top 时,我得到的平均负载 >2,因为进程调度程序总是将某些低需求进程分配给效率核心,这导致这些核心始终以 60% 到 100% 的容量运行。
我觉得 2 个效率核心降低了负载平均指标的效用,而负载平均指标已经由于多个核心而降低了。回到遥远的过去,我们使用单核 CPU,负载平均值具有直观的意义。然而现在我们在一个系统中有 2 种类型的 CPU 核心,而我最近的手机有 3 种不同类型的核心:效率、性能和单个超性能核心。
这样一个新的平均负载应该如何计算呢?是否正在努力重新定义通用系统负载指标?
由于效率核心是为了运行低优先级进程而设计的,因此从默认指标中排除这些进程也许有意义吗?然后将剩余负载值分配给非效率 CPU。
例如,平均负载为 3.4。效率核心减去 2,即 1.4。然后除以性能核心数量,1.4 / 8 = 0.175。
答案1
首先,我们应该谈谈“负载”实际上是什么:它是正在运行的进程的数量,加上当前处于所谓“不间断睡眠”状态的进程的数量,即大部分等待来自外设 IO 的数据。
这意味着,如果您有一台 16 核机器(无论各个核有多“强或多弱”),并且您运行 100 个进程,每个进程都会重载 IO(例如通过锤击内存映射文件的页面,或者通过加载根据交换的需要),您可以获得 100 的负载。这意味着该负载平均值为不是主要取决于 CPU 内核的使用情况。它试图衡量你当前的负载情况系统是。
比较不同机器上的负载并没有多大用处。在同一台机器上比较它们确实有意义 - 如果你的平滑负载(负载平均的从严格意义上来说是错误的;如果您有电气工程背景,这些是指数加权移动平均线,即简单的单极点 IIR 滤波器输出)减少,您正在赶上工作,如果它增加,您正在做更多的工作。但是您不能将两台不同的机器彼此相邻并期望负载明显具有可比性——因此,重新定义负载以使其在不同的 CPU 架构中更普遍有用是一件没有实际意义的事情。事情本来就不是这样的。
我觉得 2 个效率核心降低了负载平均指标的效用
现在,知道您提出的问题假设“负载”只是“CPU 负载”(即在任何给定时刻不空闲的 CPU 数量),我们必须解决这个问题,而不是讨论 Linux“负载”度量。
CPU 利用率在过去几乎毫无用处——因为 CPU 核心是动态调整频率的;大约在 2000 年,AMD 的 PowerNow! 席卷了消费类计算机(笔记本电脑)。核心运行在 1.2 GHz 下的 50% 时间根本不值得运行在 3.9 GHz 下的核心;并且两者同时存在于同一系统中,并且它们都可以在考虑计算长期平均值的时间内改变频率。当 CPU 利用率超过阈值并且有足够的任务处于就绪状态时,就会发生这种情况。所以,是的,不。老实说,我认为“CPU 利用率”无非是“如果低于 90%,我的系统肯定可以做更多的 CPU 工作,除此之外,很难说,取决于工作”。
因此,坦率地说,在过去 20 年左右的时间里,它并不是一个过于有用的指标。
回到遥远的过去,我们使用单核 CPU,负载平均值具有直观的意义。
那时,频率缩放已经是一个问题,“CPU 90% 的时间都在等待存储或网络”看起来利用率很低,但实际上是在说“对于我试图服务的工作负载,我已经 100%饱和”。有一个非常那里的直观性有限——最近自 20 世纪 90 年代初以来,CPU 和 RAM 以及外设总线是解耦的,这使得测量 CPU 不空闲的时间在描述方面有点可疑。系统加载。它为您提供的只是计算机中众多有限资源之一是否已耗尽的信息,并且该百分比与完成更多工作的实际能力并不成正比,因为一台计算机的 CPU 利用率为 0.1·(核心数)可能不会在高时钟频率下运行太多,因此在更高的负载下,计算机突然变得更强大。当计算机具有异构 CPU 核心时,也会发生同样的情况,甚至更加复杂和难以预测(这并不是什么新发明 - 超线程大约 15 年前就已经将其引入消费计算机,而 NUMA 计算机很久以前就已经出现了) 。
这样一个新的平均负载应该如何计算呢?
坦白说:一点也不。保持当前指标!当前的负载指标有一个目的:使同一台机器上的工作负载情况具有可比性。它继续这样做;无论如何,很难进行合理的跨平台比较:
是否正在努力重新定义通用系统负载指标?
真正关心系统利用率的人们会根据工作负载正确调整系统规模(而不仅仅是像笔记本电脑一样,他们所拥有的系统是否能够足够快地完成应做的事情),他们的做法与降低系统利用率相反到一个与工作负载无关单个数字:他们需要查看特定工作负载(或必要的工作负载范围)的瓶颈是什么,然后分配必要的额外资源 - 而“CPU 时间”只是这些资源之一。