在一个简单的实验中,我设置NOHZ=OFF并用来printk()打印do_timer()函数被调用的频率。它在我的计算机上每10毫秒被调用一次。
NOHZ=OFF
printk()
do_timer()
但是,如果NOHZ=ON这样,就会有很多抖动do_timer()被调用。在大多数情况下,它确实每10毫秒被调用一次,但有时它会完全错过最后期限。
NOHZ=ON
我已经研究了do_timer()NOHZ和NOHZ。do_timer()是负责更新jiffies值的功能,还负责流程的循环调度。
jiffies
NOHZ功能可关闭系统上的高分辨率计时器。
我无法理解的是高分辨率计时器如何影响do_timer()?即使高分辨率硬件处于睡眠状态,持久性时钟也足以do_timer()每10 ms 执行一次。其次,如果do_timer()在应有的时间未执行,则意味着某些进程在理想情况下没有获得应有的时分。大量的搜索确实表明,对于许多人来说,许多应用程序在时开始工作得更好NOHZ=OFF。
长话短说,如何NOHZ=ON影响do_timer()? 为什么do_timer()错过最后期限?
首先,让我们了解什么是tickless kernel(NOHZ=On或CONFIG_NO_HZ集合)以及从何将其引入Linux内核的动机。2.6.17
tickless kernel
NOHZ=On
CONFIG_NO_HZ
2.6.17
从http://www.lesswatts.org/projects/tickless/index.php中,
传统上,Linux内核为每个CPU使用一个定期计时器。该计时器完成了许多工作,例如进程记帐,调度程序负载平衡以及维护每个CPU计时器事件。较旧的Linux内核使用频率为100Hz的计时器(每秒100个计时器事件或每10ms一个事件),而较新的内核使用250Hz(每秒250个事件或每4ms一个事件)或1000Hz(每秒1000个事件或一个事件)每1ms)。 这种周期性的计时器事件通常称为“计时器滴答”。计时器滴答在设计上很简单,但是有一个明显的缺点:计时器滴答是周期性发生的,而不管处理器状态是空闲还是忙。如果处理器空闲,则必须每1、4或10毫秒从节能睡眠状态中唤醒。这会耗费大量能量,消耗笔记本电脑的电池寿命,并导致服务器不必要的功耗。 通过“无中断空闲”,Linux内核消除了CPU空闲时的这种定期定时器滴答。这样,CPU可以保持省电状态的时间更长,从而降低了整体系统的功耗。
传统上,Linux内核为每个CPU使用一个定期计时器。该计时器完成了许多工作,例如进程记帐,调度程序负载平衡以及维护每个CPU计时器事件。较旧的Linux内核使用频率为100Hz的计时器(每秒100个计时器事件或每10ms一个事件),而较新的内核使用250Hz(每秒250个事件或每4ms一个事件)或1000Hz(每秒1000个事件或一个事件)每1ms)。
这种周期性的计时器事件通常称为“计时器滴答”。计时器滴答在设计上很简单,但是有一个明显的缺点:计时器滴答是周期性发生的,而不管处理器状态是空闲还是忙。如果处理器空闲,则必须每1、4或10毫秒从节能睡眠状态中唤醒。这会耗费大量能量,消耗笔记本电脑的电池寿命,并导致服务器不必要的功耗。
通过“无中断空闲”,Linux内核消除了CPU空闲时的这种定期定时器滴答。这样,CPU可以保持省电状态的时间更长,从而降低了整体系统的功耗。
因此,降低功耗是无滴答内核的主要动机之一。但实际上,在大多数情况下,性能会因功耗降低而受到影响。对于台式计算机,性能是最重要的问题,因此,您会看到大多数台式计算机都NOHZ=OFF运行良好。
用Ingo Molnar的话来说
无滴答内核功能(CONFIG_NO_HZ)启用“按需”计时器中断:如果在系统闲置时1.5秒内没有计时器到期,那么系统将完全闲置1.5秒。这应该可以带来更凉爽的CPU和更低的功耗:在我们的(x86)测试箱上,我们测量了从IRZ到每秒1-2个计时器中断的有效IRQ速率。
现在,让我们尝试回答您的查询-
我无法理解的是高分辨率计时器如何影响do_timer?
如果系统支持高分辨率计时器,则10ms在大多数系统上,计时器中断的发生频率可能比平时高。也就是说,每个计时器都试图通过利用系统功能并通过更快地触发计时器中断来使系统更具响应性100us。因此,通过NOHZ选择,这些计时器会冷却下来,因此do_timer
10ms
100us
NOHZ
do_timer
即使高分辨率硬件处于睡眠状态,持久性时钟也能够每10毫秒执行一次do_timer
是的,它有能力。但是的意图NOHZ恰恰相反。为防止定时器频繁中断!
其次,如果do_timer何时不执行,则意味着某些进程在理想情况下没有获得分时
正如注释中所指出的,cafNOHZ不会导致进程调度的频率降低,因为它仅在CPU空闲时启动(换句话说,当没有进程可调度时才启动)。仅流程记帐工作将在延迟的时间完成。
为什么do_timer错过了截止日期?
如所阐述的,这是 NOHZ
我建议您以tick-sched.c内核源代码为起点。搜索CONFIG_NO_HZ并尝试理解添加了新的功能NOHZ特性
这是一项旨在测量不滴答内核影响的测试