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