
可以合理地假设,对于内核而言,什么也不做很容易-但事实并非如此。 在
2018年内核食谱会议上,
拉斐尔·维索茨基 (
Rafael Vysotsky)讨论了处理器做什么,何时无事可做,内核如何处理,当前策略是什么以及最近在
空闲周期上的工作如何改善了不执行任何操作的系统的能源状况。 。
不活动周期是Vysotsky支持的内核子系统之一,它控制不需要执行任何进程时CPU的工作。 Vysotsky非常准确地给出了所有定义:CPU就是这样一种实体,它可以从内存中接收指令,并与同一系统中处理相同事物的其他实体同时执行它们。 在具有一个核心的最简单的单处理器系统上,该核心是CPU。 如果处理器具有多个核心,则每个核心都是一个CPU。 如果每个内核都具有多个用于同时执行指令的接口-英特尔将这种系统称为“
超线程 ”-那么这些线程中的每个线程都将是一个CPU。
无任务执行时,CPU处于空闲状态。 或者,更准确地说,Linux内核具有多个用于调度的内部类,其中一个是特殊的空闲类。 如果除非活动类外,任何其他类均未在该CPU上执行任何任务,则该CPU被视为非活动。 如果设备不允许这样做,那么CPU将不得不执行无用的指令,直到实际工作开始。 但是,这是一种极其低效的用电方式,这就是为什么大多数处理器都支持几种低能耗状态,内核将这些状态转换为低能耗状态,直到需要它们进行有用工作之前。
您不能只是进入或退出不活动状态。 进入和退出需要时间,此外,进入此状态时,当前状态的功耗会略有增加,而退出时,它会消耗处理器进入的状态。 而且,尽管不活动状态越深,处理器消耗的能量越少,进入和退出这种状态的成本就会增加。 这意味着在短期不活动的情况下,对计算机资源的最佳利用将是不活跃的活动; 在更长的时间内,通过节省更多的能量,可以证明进入更深的无为状态的成本是合理的。 因此,在决定处理器需要的闲置状态深度之前,预测处理器将闲置多长时间符合内核的利益。 这是不作为周期的任务。
在此循环中,调度程序会注意到CPU处于空闲状态,因为它没有可分配给它的任何任务。 然后,调度程序将调用调节器,调节器将尝试对可以输入的适当的不活动状态做出最佳预测。 现在内核中有两个控件,菜单和梯形图。 它们用在不同的情况下,但是两者都尝试做大致相同的事情:监视CPU进入空闲状态时的系统状态以及它处于不活动状态的时间。 这样做是为了预测CPU将进入空闲状态的时间,因此,哪种状态最适合这种情况。
CPU调度程序计时器使这项工作特别复杂。 调度程序将启动此计时器,以分配对CPU的访问时间:如果需要在一个处理器上执行多个任务,则每个任务只能执行一点,然后定期推迟以支持另一个任务。 无需在空闲的CPU上执行此计时器,因为没有任务需要在CPU之间进行划分。 此外,如果允许计时器在空闲的CPU上运行,这将阻止控制器选择深度空闲状态,从而限制CPU空闲的时间间隔。 因此,在4.16以下的内核中,调度程序在调用调节器之前关闭了计时器。 当CPU在中断后醒来时,调度程序会确定执行是否需要执行任何任务,如果有,则重新启动计时器。
如果控制器预测到很长一段时间不活动,而实际上这个时间确实很长,则控制器“获胜”:CPU进入深度不活动状态,从而节省了能量。 但是,如果监管机构预测到长期处于不活动状态,而这一期间却很短,那么监管机构就会“失败”,因为进入深度不活动状态的成本无法通过在短期不活动状态下节省能源而得到回报。 更糟的是,当监管机构预测停机时间很短时,无论停机时间如何,它都会“丢失”:如果这段时间过长,他就会错过保存的机会,而如果时间太短,则浪费了停止和重新启动计时器的成本。 或者,换句话说,由于资源花费在停止和启动计时器上,因此当控制器预测停机时间很短时,将其停止是没有意义的。
Vysotsky决定尝试更改调节器的操作,但得出的结论是,主要问题是计时器在调用调节器之前即已知的非活动状态之前就已停止计时。 他在内核4.17中返回了一个空闲周期,以便在调节器提出建议后决定停止计时器。 如果他预计停机时间较长,则计时器停止计时,以免提前唤醒CPU。 如果假设停机时间很短,则保留计时器,以免在停机时浪费资源。 这意味着计时器还执行安全功能,如果停机时间比预期的要长,则唤醒CPU,并为调节器提供第二次做出正确决定的机会。
当空闲的CPU通过中断唤醒时,无论是不可中断的计时器还是其他事件,调度程序都会立即做出有关工作可用性的决定。 如果有工作,计时器将根据需要重新启动。 如果不是,则调用控制器。 由于这意味着现在可以在计时器工作和不工作时调用调压器,因此必须调用调压器以将其考虑在内。
维索斯基在研究了得失表之后,认为他的改变将改善情况。 在预测长时间不活动时,计时器仍会停止,因此此处没有任何变化。 如果停机时间长,我们会赢,如果停机时间很短,我们会输。 但是,如果预计会有短暂的停机时间,那么我们将获胜:如果该时期真的很短,那么我们将节省计时器的停止和启动时间;如果时间长了,那么不间断的计时器将唤醒我们,使我们有机会做出另一个预测。
由于博弈论不能完全替代实际情况,因此维索斯基在许多系统上测试了这种方法。 上图是所有测试系统的典型值; 它显示了空闲系统上功耗的时间依赖性。 绿线是旧的不活动周期,红线是新的不活动周期。 根据新方案,消耗的能量更少,此外,它更可预测。 并非所有经过测试的CPU的线之间的间隙都很大,但是它们都在不均匀的绿色下显示出一条平坦的红色线。 正如Vysotsky所说,这种新方案不太可能预测短期的不活动状态,但更多的情况是短期有效。
维索茨基在回答观众的问题时说,这项工作取决于建筑。 特别是,英特尔处理器将受益于此,因为它们具有相当多的不活动状态,监管机构可以从中选择一种状态,如果预测正确的话,将为它提供最大的成功机会。 但是ARM处理器也将从新电路中受益。
空闲时功耗降低20%似乎是微不足道的成就,但实际上并非如此。 任何想要很好地应对峰值负载的系统都应在正常模式下具有动力储备,这将在不活动时表现出来。 上图显示了我服务器上该年处理器的使用情况,该处理器处理邮件,文件传输,VPN,NTP等。 黄色表示简单时间。 我的提供者希望节省20%的能源,对于地球来说会更好。