try ai
科普
编辑
分享
反馈
  • 深入理解CPU利用率:原理与应用

深入理解CPU利用率:原理与应用

SciencePedia玻尔百科
核心要点
  • 高CPU利用率并不总是等同于有效工作;它可能被上下文切换等系统开销所主导,这揭示了响应能力和效率之间的一个基本权衡。
  • 矛盾的是,极低的CPU利用率可能预示着“颠簸(thrashing)”等严重系统故障,此时CPU处于空闲状态,因为所有进程都因等待磁盘I/O而陷入停滞。
  • 高效地调度I/O密集型和CPU密集型进程对系统效率至关重要,它能让CPU在某些进程等待慢速设备时执行有用的工作。
  • CPU利用率不仅是性能指标,更是一个至关重要的信号,可作为安全监控、保障公平性和管理自动驾驶汽车等安全关键系统负载的关键度量。

引言

对大多数用户来说,CPU利用率只是性能监视器上的一个简单指标,一个表示计算机处理器有多“忙”的百分比。然而,这个单一的数字背后隐藏着一个复杂的世界,它代表着操作系统精心编排的一场错综复杂的舞蹈的最终结果。CPU利用率的真正意义不在于其数值本身,而在于该数值所代表的——一个关于有效工作、隐藏开销、巧妙优化以及潜在的全系统困境的故事。本文旨在弥合随意观察此指标与深刻理解其内涵之间的差距。

本文的探讨将围绕两个关键领域展开。首先,在“原理与机制”部分,我们将剖析定义CPU利用率的核心概念。我们将审视上下文切换的机制、I/O等待的关键作用、调度器设计中的权衡,以及像“颠簸”这样高活动量却无进展的矛盾状态。随后,“应用与跨学科联系”部分将展示这些基础知识如何在现实世界中得到应用。我们将看到,理解CPU利用率如何成为性能调优的强大工具、网络安全威胁的哨兵,以及安全关键系统设计中不可或缺的参数。读完本文,您屏幕上的那个简单百分比将转变为一个关于机器核心状态的丰富、信息量巨大的信号。

原理与机制

对于普通观察者来说,计算机的中央处理器(CPU)是一个神秘的黑匣子,它要么“忙碌”,要么“空闲”。我们谈论的​​CPU利用率​​是一个百分比,是性能仪表盘上的一个数字,我们本能地希望它要么处于舒适的低水平,要么处于令人满意的高水平,具体取决于我们的任务。但这个数字到底意味着什么?窥探这个黑匣子的内部,就是踏上一段深入操作系统核心的旅程,一个充满优雅妥协、巧妙技巧和意外悖论的世界。利用率这个简单的度量标准,仅仅是理解CPU每毫秒精心编排的进程之舞的入口。

CPU究竟在做什么?繁忙的幻象

让我们从一个简单的定义开始:CPU利用率是CPU执行指令的时间所占的比例。但是,是哪些指令呢?如果你在玩一个视频游戏,你会希望CPU把时间花在游戏逻辑和图形计算上。这是​​有效工作​​。但CPU也花费时间来管理整个系统——决定接下来要运行什么、在任务之间切换以及处理请求。这是​​开销​​。一个高利用率的数字可能具有欺骗性;它可能反映了一个CPU正在疯狂地忙碌,但几乎没有完成任何有效工作,就像一个官僚在不停地整理文件,却一份也没有处理。

最基本的开销是​​上下文切换​​。在一个同时运行许多程序的现代系统中,操作系统通过在不同进程之间快速切换CPU的注意力来制造并行的假象。为此,它必须保存当前进程的完整上下文(其所有寄存器和内存指针的状态)并加载下一个进程的上下文。这个动作不是没有代价的;它会消耗宝贵的CPU周期。

考虑一种常见的调度策略,称为​​轮转调度(Round Robin, RR)​​,其中每个进程都会获得一个称为​​时间片​​(qqq)的小段CPU时间,然后被移到队列的末尾。在每个时间片之后,都会发生一次上下文切换,这会花费一些时间 ckc_kck​。在稳定状态下,CPU的生命周期变成一个简单、重复的模式:执行时间 qqq,然后切换时间 ckc_kck​。因此,用于有效工作的时间比例是有效时间与总周期时间之比。这给了我们这个模型下利用率的基本方程:

U=qq+ckU = \frac{q}{q + c_k}U=q+ck​q​

这个优美而简单的表达式揭示了调度器设计核心的一个深刻权衡。较小的时间片 qqq 使系统感觉响应更快,因为它更频繁地在任务之间切换。但是看看这个公式!当 qqq 变小并接近 ckc_kck​ 时,利用率会急剧下降。我们花费越来越多的时间在切换上,而越来越少的时间在实际工作上。

上下文切换的成本 ckc_kck​ 甚至不是一个简单的常数。现代操作系统必须为每个进程管理内存。切换到一个具有大“内存足迹”或​​工作集​​的进程,可能需要内存管理单元做更多的工作,使其上下文切换成本更高。想象一下,从一个只需要桌上几张纸条的任务切换到一个需要铺开数百张蓝图的任务;准备时间是截然不同的。

如果不加管理,这种开销可能是灾难性的。想象一个“对抗性”场景,我们有许多准备运行的任务。在轮转调度下,调度器将在每个时间片后强制进行上下文切换。如果时间片 qqq 非常短,而上下文切换成本 ccc 很显著,那么完成一个长度为 BBB 的长作业的总时间就不仅仅是 BBB,而是多得多。相比之下,一个简单的​​先到先服务(First-Come, First-Served, FCFS)​​调度器只会将作业运行至完成,仅在开始时进行一次上下文切换。在这个特定的对抗性案例中,FCFS调度器可以通过“更笨拙”地避免频繁切换的狂热,从而实现更高的吞吐量(单位时间内完成的进程数)。追求响应能力的代价是牺牲了整个系统的效率。

等待的艺术:I/O与并行之舞

到目前为止,我们只考虑了纯计算的进程。但大多数程序并非如此。它们从磁盘读取文件、通过网络发送数据,或等待您在键盘上输入。这些都是​​输入/输出(I/O)​​操作。从CPU的角度来看,I/O慢得令人难以置信。在一个进程等待磁盘找到一块数据的时间里,CPU可以执行数十亿条指令。如果CPU在这段时间里只是闲坐着,它的利用率将惨不忍睹。

在这里,我们发现了多道程序操作系统的真正天才之处。当一个进程必须等待I/O时,调度器可以将CPU切换到另一个准备运行的进程。这就像一位大厨,在等待酱汁煨开(I/O等待)时,立即开始为下一道菜切蔬菜(运行另一个进程)。厨房(CPU)永远不会闲置。

这导致了一个奇妙的悖论。假设你有两个I/O密集型进程,每个进程在3毫秒的CPU突发和12毫秒的I/O等待之间交替。如果你将它们一起运行,CPU可以执行一个进程,当该进程等待I/O时,它可以执行第二个进程。这种重叠可以填补空闲的间隙。在某个这样的场景中,增加第三个相同的进程实际上可以将整体CPU利用率从0.4提高到0.6。通过给系统更多的工作去做,我们使它变得更高效,因为我们为调度器提供了更多机会在其他进程等待时找到有用的工作。

但这场优雅的舞蹈严重依赖于编排——即调度算法。如果错误的进程登上了舞台怎么办?想象一个长的、CPU密集型的进程(一辆笨重的卡车)在一群短的、I/O密集型的进程(一支敏捷的跑车车队)之前到达。在一个简单的FCFS调度器下,卡车获得了CPU并长时间占用它。那些只需要在CPU上快速突发一下就需要使用磁盘的跑车,全都卡在队列中等待。在此期间,磁盘完全空闲。一旦卡车最终完成,所有的跑车都冲向CPU片刻,然后立即为现在不堪重负的磁盘排队。现在,当磁盘处理其长长的积压工作时,CPU又闲置了。这种现象被称为​​护航效应​​,它导致系统中所有资源的利用率都非常糟糕。这是一个严峻的提醒:性能不仅取决于组件的速度,还取决于它们的工作如何被精心编排。

信息的代价:I/O隐藏的CPU成本

我们已经讨论了当设备忙碌时CPU可以工作,但CPU如何知道I/O何时完成呢?这不是魔法;它需要CPU本身付出努力。主要有两种策略。

第一种是​​轮询​​。CPU周期性地询问设备,“你完成了吗?你完成了吗?你完成了吗?”每次轮询都会消耗少量CPU周期。这很简单,但如果设备很慢,CPU大部分时间都在问一些无意义的问题,这可能是一种浪费。

第二种是​​中断​​。CPU告诉设备,“你完成后叫醒我”,然后去做其他事情。当I/O完成时,设备发送一个硬件信号——一个中断——强制CPU停止正在做的事情,并运行一段特殊的代码(​​中断服务程序​​,ISR)来处理完成的I/O。

哪种更好?这是一个经典的工程权衡。假设一次轮询的成本是 sss 个周期,轮询周期是 TTT。轮询的CPU成本是每秒 s/Ts/Ts/T 个周期的常数。中断的成本涉及一些开销,比如每个事件 hhh 个周期。如果事件发生率为 λ\lambdaλ,CPU成本是 λh\lambda hλh。必然存在一个交叉事件率 λ∗\lambda^*λ∗,此时两种成本相等:

λ∗=sTh\lambda^* = \frac{s}{T h}λ∗=Ths​

对于低于 λ∗\lambda^*λ∗ 的事件率,“叫醒我”的中断方法更便宜。对于高于 λ∗\lambda^*λ∗ 的事件率,持续检查的轮询实际上可能比处理一场单个中断的“风暴”所花费的总工作量要少。我们甚至可以反向应用这个权衡:对于给定的事件率,我们可以选择一个轮询频率,使其提供与中断相同的平均通知延迟,然后比较CPU使用率。在高吞吐量条件下,可能会发现精心调优的轮询循环比使用中断效率高得多。

这个想法是如此强大,以至于它被内置到现代高速设备中。一个100G比特的网络卡每秒可以接收数百万个数据包。为每个微小的数据包生成一个中断会使CPU不堪重负。解决方案是​​中断调节​​(或合并)。硬件被配置为仅在一批(例如 nnn 个)数据包到达后才生成一个中断。这将中断的成本分摊到许多数据包上。正如你所猜测的,这引入了另一个权衡:CPU利用率与延迟。通过增加批次大小 nnn,我们可以降低CPU利用率,但批次中的第一个数据包必须等待更长的时间才能得到通知。系统管理员可以调整这个参数 nnn,以为他们的工作负载找到完美的平衡点,在满足目标延迟的同时最小化CPU开销。

更大的图景:当整个系统发出求救信号

CPU利用率并非孤立存在。它与系统的其他所有部分,特别是内存,紧密交织在一起。计算机的物理内存(RAM)是有限的。为了运行比RAM容量更多的程序,操作系统使用磁盘作为“交换空间”,将被动块的程序(称为​​页面​​)移出到磁盘,并在需要时将它们调回。

这通常工作得很好。但如果你增加活动进程的数量,以至于它们的集体工作集——它们现在需要的页面——超过了可用的总RAM,会发生什么?系统进入一种称为​​颠簸​​的灾难性状态。一个进程运行,但几乎立即需要一个在磁盘上的页面。它触发一个​​缺页中断​​,操作系统启动一个I/O来获取它。为了腾出空间,操作系统必须换出另一个页面,很可能是属于另一个进程工作集的页面。然后调度器切换到那个进程,而那个进程几乎立即又因为它的页面刚刚被换出而发生缺页中断。

很快,每个进程都在永久地等待磁盘。缺页中断率飙升,交换设备队列增长到无限大,而矛盾的是,CPU利用率骤降至接近零。CPU之所以空闲,不是因为没有工作可做,而是因为它可能运行的每一个任务都被阻塞了,等待磁盘。系统在空转,疯狂地交换页面但没有任何进展。这是系统动力学中的终极教训:盲目地通过增加工作负载来追求更高的CPU利用率,在超过一个临界点后,可能导致整个系统的性能崩溃。

最后,我们不要忘记CPU是一个物理对象。它消耗电力并产生热量。如果它变得太热,它可能会自我毁灭。为了防止这种情况,现代处理器实现了​​热节流​​。当温度传感器检测到过热时,CPU会自行降速,有效地减少它每秒可以执行的指令数。这可以用一个减速因子 θ≥1\theta \ge 1θ≥1 来建模,该因子乘以完成任何任务所需的时间。一个原本需要5毫秒的CPU突发现在可能需要 5θ5\theta5θ 毫秒。这种减速有直接的后果:它延长了所有任务的完成时间,增加了后续进程在队列中等待的时间,甚至可以改变在整个项目时间内计算的总体CPU利用率,因为开始时的空闲间隙在更长的总执行间隔中占的比例变小了。归根结底,CPU利用率不仅是抽象算法的问题,也受制于具体的物理定律。

应用与跨学科联系

对于外行来说,系统监视器上闪烁的“CPU利用率”指标似乎是一个简单,甚至乏味的数字。它不就是一个百分比吗?一个衡量计算机大脑有多“忙”的尺度。但对于物理学家、工程师或计算机科学家来说,这个单一的数字是一个入口。它是一个深刻的信号,讲述着机器内部生活的丰富故事——它的挣扎、它的效率、它的脆弱。理解这个信号不仅仅是衡量性能;它是学会倾听机器的声音。通过解读CPU利用率的故事,我们可以指挥这支数字交响乐团演奏得更快、更和谐,保护它免受无形威胁,甚至确保它可以被托付我们的生命。

让我们踏上一段旅程,看看这个不起眼的百分比如何在各种令人惊讶的领域成为一个强大的杠杆,从庞大的云服务器集群到自动驾驶汽车精密的、生死攸关的决策。

性能的艺术:编排数字交响乐

理解CPU利用率最直接的应用之一就是追求原始性能。我们如何让我们的系统更快、响应更灵敏、更高效?事实证明,简单地追求100%的利用率往往是错误的答案。真正的艺术在于理解这种利用率代表了什么。

负载均衡

想象一下指挥一支管弦乐队。为了创造出优美的声音,你不会只要求每个人都尽可能大声地演奏。你会平衡各个声部。对于现代多核处理器来说也是如此。操作系统必须像指挥家一样,将计算工作——进程和线程——均匀地分布在所有可用的核心上。这是经典的负载均衡问题。

但什么构成了“负载”?一个天真的方法可能只是计算每个核心上的活动程序数量。然而,这将是一个错误。一个程序可以是“活动的”,但实际上并没有使用CPU。它可能在等待来自慢速硬盘的数据或来自网络服务器的响应。这是一个​​I/O密集型​​进程。它就像一个在舞台上但等待提示的音乐家。相比之下,一个​​CPU密集型​​进程则是一个正在疯狂计算、仅受处理器速度限制的进程——一个正在演奏狂热独奏的小提琴手。

一个复杂的负载均衡器必须区分这两种状态。它需要一个能反映CPU真实压力的指标。一个简单的模型可能会将线程的负载定义为其CPU使用率 UiU_iUi​ 和其阻塞等待I/O的时间 BiB_iBi​ 的加权和。诀窍在于找到正确的平衡,由权重 www 在诸如 Mi=Ui+wBiM_i = U_i + w B_iMi​=Ui​+wBi​ 的指标中捕获。移动一个等待中的I/O密集型线程可能比移动一个已经用其数据填满了本地核心缓存的CPU密集型线程的干扰要小。更糟糕的是,系统关于线程是正在使用CPU还是被阻塞的测量可能充满噪音和错误。一个真正健壮的系统甚至必须考虑到这种错误分类,在做出决策之前校正其观察结果以获得更清晰的真实负载图像。这就是指挥数字交响乐的精妙艺术:不仅仅是计算演奏者的人数,还要理解谁在演奏,谁在等待。

驯服“颠簸”这头猛兽

这里有一个奇妙的悖论:一台计算机可以疯狂地工作,变得极其缓慢和无响应,而其CPU利用率却接近于零。这怎么可能呢?这种病态被称为​​颠簸​​(thrashing)。当系统的内存被过度使用时,就会发生这种情况。活动程序共同需要的RAM比物理上可用的要多。为了应对,操作系统开始疯狂地在快速的RAM和慢速的硬盘之间来回搬运数据——这个过程称为分页或交换。

在这种情况下,CPU发现自己处于一个令人沮丧的位置。它试图执行一条指令,但所需的数据不在RAM中。发生了一次“缺页中断”。CPU发出一个从磁盘获取数据的请求,然后……它等待。并且它一直在等待。磁盘比CPU慢几个数量级。在等待时,CPU实际上是空闲的。因此,系统因磁盘I/O而异常繁忙,用户看到系统陷入停顿,而CPU利用率指标报告处理器几乎什么也没做。

低CPU利用率并不总是系统空闲的标志;它可能是一个求救信号。一个聪明的操作系统不能孤立地看待CPU使用率。它必须将这个信号与其他信号结合起来。一个反颠簸检测器可能会使用一个函数,该函数关注缺页率(PFPFPF)、CPU利用率(CPUCPUCPU)和运行队列长度(qlenqlenqlen)。一个简单而有效的“颠簸得分”Θ\ThetaΘ模型可以是这些指标的乘积,并用一些基线常数进行归一化:

Θ=PFP0⋅(1−CPU100)⋅qlenQ0\Theta = \frac{PF}{P_0} \cdot \left(1 - \frac{CPU}{100}\right) \cdot \frac{qlen}{Q_0}Θ=P0​PF​⋅(1−100CPU​)⋅Q0​qlen​

这个函数只有在所有三个迹象都指向麻烦时才会变得很大:高缺页率、低CPU利用率,以及等待CPU的长队。当这个分数超过一个阈值时,系统就知道它正在颠簸,并可以采取纠正措施,例如暂停一些进程以释放内存。

动态优化与控制问题

现代软件极其复杂。您的网络浏览器运行的代码通常不是预先编译的,而是在需要时“即时编译”(JIT)的。这允许根据特定机器和您使用软件的特定方式进行令人难以置信的优化。但有一个问题:JIT编译过程本身会消耗CPU周期。

这创造了一个有趣的权衡。系统现在可以花费CPU时间来编译一段代码,这将使该代码在未来运行得更快。或者,它可以立即运行未优化的代码。如果用户正在积极地与网页交互,花费太多时间在JIT编译上会使系统感觉迟缓和无响应。

这本质上是一个控制理论问题。我们希望将总CPU利用率 U(t)U(t)U(t) 保持在某个上限 UmaxU_{\text{max}}Umax​ 以下,以确保响应性。总利用率是应用程序工作 A(t)A(t)A(t) 和JIT编译器工作 J(t)J(t)J(t) 的总和。一个简单的控制器可能只是在 U(t)U(t)U(t) 过高时关闭JIT。但这会导致剧烈的振荡。一个更优雅的解决方案使用前馈控制。系统测量应用程序的负载 A(t)A(t)A(t),并主动将“剩余”的容量 Umax−A(t)U_{\text{max}} - A(t)Umax​−A(t) 分配给JIT编译器。通过使用指数平滑等技术来获得 A(t)A(t)A(t) 的稳定估计,系统可以智能地调节JIT活动,平衡优化的长期目标与响应迅速的用户体验的即时需求。

哨兵:作为威胁守护者的CPU利用率

除了性能,CPU利用率也是一个强大的安全信号。无法解释或异常的CPU活动通常是入侵者或恶意程序留下的“雪中足迹”。通过监控这个足迹,系统可以充当自己的哨兵。

强制公平与揭露谎言

在多用户系统中,甚至在您自己运行着许多程序的桌面上,操作系统调度器都必须是公平的。但如果一个程序说谎呢?一个加密货币矿工,其唯一目的是消耗尽可能多的CPU时间,可能会试图通过声称它具有非常高的外部优先级(PextP_{\text{ext}}Pext​)来欺骗调度器,暗示它是一个关键的系统任务。

一个简单的调度器可能会被愚弄,给矿工不公平的CPU份额。然而,一个更复杂的调度器可以使用CPU使用率作为一种强制执行机制。它可以实现一个基于信用的系统。任何进程都可以声称高优先级,但这样做是有“税”的。声称的优先级越高,进程实际使用CPU的每一刻,其信用余额消耗得就越快。这在一个信用更新规则中被捕获,其中消耗项与声称的优先级和测量的CPU使用率 ui(t)u_i(t)ui​(t) 的乘积成正比:

ki(t+Δt)=ki(t)+refill−α⋅Pext,i⋅ui(t)⋅Δtk_i(t+\Delta t) = k_i(t) + \text{refill} - \alpha \cdot P_{\text{ext},i} \cdot u_i(t) \cdot \Delta tki​(t+Δt)=ki​(t)+refill−α⋅Pext,i​⋅ui​(t)⋅Δt

一个行为良好的交互式进程以短突发方式使用CPU,因此其信用余额保持为正,并享有其高优先级的响应性。但是贪婪的加密货币矿工,由于其持续的高CPU使用率,将很快使其信用余额陷入负债。一旦负债,调度器将忽略其虚假的优先级声明并将其降级,从而强制执行长期公平性。进程自身的行为,通过其CPU利用率来衡量,成为挫败其欺骗行为的证据。

检测隐蔽计算

最危险的威胁往往是最微妙的。一个高级恶意软件或间谍软件可能不会试图让你的系统崩溃。相反,它可能会试图隐藏自己,在后台进行一些隐蔽的计算——也许是缓慢地窃取数据或试图破解密码。它的活动可能只会导致一个原本合法的进程的CPU使用率出现微小、持续的增加,这种增加很容易淹没在系统活动的自然噪音中。

我们如何能检测到如此微弱的信号?答案来自统计过程控制领域。一种称为累积和(CUSUM)控制图的技术非常适合于此。CUSUM算法通过随时间累积证据来工作。在每个时间步,它查看CPU使用率样本 xtx_txt​。如果样本略高于预期的基线均值 μ0\mu_0μ0​,它会向一个运行总和 StS_tSt​ 中添加一个小的正值。如果低于均值,总和会减少(但不允许低于零)。

St=max⁡(0,St−1+C(xt−k))S_t = \max\left(0, S_{t-1} + C(x_t - k)\right)St​=max(0,St−1​+C(xt​−k))

其中 kkk 是一个略高于 μ0\mu_0μ0​ 的参考值,C是一个缩放常数。单个噪声样本不会产生太大影响。但是一个持续的、微小的CPU使用率增加将导致总和 StS_tSt​ 稳步攀升。当它最终超过一个预定的阈值 hhh 时,警报就会被触发。这是统计学的一个 krásná 应用,它允许我们通过耐心地随时间累积证据来找到一个非常微弱、隐藏的信号。

防御拒绝服务(DoS)洪水攻击

有时,攻击一点也不微妙。它是一场蛮力洪水。拒绝服务(DoS)攻击旨在通过用请求压垮系统来使其不可用。在这些攻击中,CPU利用率是中心战场。

攻击可能来自令人惊讶的地方。想象一个恶意的硬件设备插入计算机。它不是正常工作,而是开始以极高的频率切换其状态位,每秒向CPU发出数千次“准备就绪”的信号。如果CPU使用一个简单的轮询循环来检查这个设备,它就会被困住。CPU将花费所有时间读取状态,发现它“准备就绪”,执行一个处理程序,然后立即循环回来,结果发现它又“准备就绪”了。CPU利用率将飙升至100%,但都是无用的忙碌工作,剥夺了所有合法程序的处理时间。通过为每次轮询和每次处理程序执行的CPU周期成本建模,并知道CPU的时钟速度,我们可以计算出将耗尽给定CPU预算的恶意事件的确切速率 λmal\lambda_{\text{mal}}λmal​。这使得工程师能够构建防御措施,以检测设备何时出现如此惊人的异常行为。

同样的原则也适用于网络层面。在IPv6协议中,路由器可以向本地网络上的所有主机发送路由器通告(RA)消息。与您在同一个Wi-Fi网络上的单个攻击者可以制作这些简单的数据包并用它们淹没网络。每个设备——您的笔记本电脑、手机、智能电视——都必须使用其CPU时间的很小一部分来处理这些数据包中的每一个。如果攻击者每秒发送数千个,所有设备上的综合CPU负载可能会变得巨大,有效地关闭整个网段。防御方法是让每个主机上的操作系统内核更智能。它必须对这些特定类型的数据包实施速率限制,为每秒处理的数量设置一个硬上限。这个上限经过精确计算,以确保即使在全面的洪水攻击下,用于处理它们的CPU利用率也能保持在一个安全的、很小的百分比以下。

系统语言:为我们的世界建模

最后,CPU利用率超越了其作为单纯操作指标的角色,成为复杂系统科学建模中的一个基本变量。它帮助我们理解、预测和控制那些与我们的世界交织在一起的技术的行为。

安全领域不容妥协的逻辑

在任何地方,CPU利用率的管理都没有比在安全关键的自主系统(如自动驾驶汽车)中更为关键。汽车的计算机运行着大量的任务。有些,如紧急制动控制(EBC),事关生死;它们的截止日期是不容协商的。这是一个具有最高​​外部优先级​​的任务。其他的,如渲染信息娱乐显示屏,则具有最低优先级。

系统也有​​内部优先级​​,比如保持在其热限制之内。如果CPU和GPU变得过热,硬件将通过节流性能来保护自己,使系统变得不可预测地缓慢。如果这恰好发生在汽车需要刹车时,那将是灾难性的。因此,一个健壮的设计必须强制执行一个严格的层次结构。满足内部约束(保持凉爽)的需求永远不能被用作违反更高级别的外部约束(安全制动)的借口。

当系统检测到其总GPU利用率即将超过其热上限时,它必须卸载负载。但它不能不分青红皂白地这样做。它必须遵循外部优先级的倒序。首先,它禁用信息娱乐系统。如果这还不够,它可能会降低感知流水线的帧率。但为紧急制动控制保留的CPU预算是神圣不可侵犯的;它永远不会被触及。在这个世界里,管理CPU利用率不是为了性能——而是为了确保在所有条件下可预测、安全的操作。

用统计学预测未来

从直接控制退后一步,我们可以将CPU利用率用作统计模型中的一个关键变量,帮助我们进行规划和风险管理。在简单的层面上,IT管理员可以使用基本的线性回归来模拟Web服务器上并发用户数量与由此产生的CPU负载之间的关系。这回答了实际问题:“如果我们预计下个月流量翻倍,我们需要增加多少台服务器?”这种容量规划对于运行可靠的互联网服务至关重要。

在更复杂的层面上,我们可以借鉴计算金融的技术来为整个数据中心建立风险模型。数据中心的健康状况是一个复杂的动态系统,有许多相互作用的变量。一组服务器上CPU使用率的突然飙升与别处网络延迟的上升有何关联?为了对此建模,我们不能使用简单的相关性,因为关系会随时间变化。相反,我们可以使用指数加权移动平均(EWMA)等工具来估计关键性能指标(包括CPU使用率和延迟)的协方差矩阵。这会给予近期数据更多的权重,使模型能够适应不断变化的条件。最终的模型使我们能够量化全系统放缓的风险,就像金融分析师量化市场风险一样。

结语

我们的旅程向我们展示了CPU利用率远不止是一个简单的“繁忙”程度计。它是优化性能的控制旋钮,是安全警报的绊索,是安全经济中不可协商的货币,也是我们用来为数字世界建模的语言中的一个基本变量。无论我们是在平衡百万台服务器的负载,确保汽车能及时刹车,还是在寻找隐藏对手的微弱耳语,其基本原理都是相同的:我们在倾听机器告诉我们什么,并利用这些知识使其为我们所有人更好、更安全地工作。在理解和驾驭这些极其复杂的创造物的探索中,这是一件美好的事情。