首先让我们了解什么是tickless kernel(NOHZ=On 或CONFIG_NO_HZ set)以及将其从2.6.17 引入Linux 内核的动机是什么
来自http://www.lesswatts.org/projects/tickless/index.php,
传统上,Linux 内核为每个 CPU 使用一个周期性计时器。
这个计时器做了很多事情,比如进程记帐,
调度程序负载平衡,并维护每个 CPU 的计时器事件。年长者
Linux 内核使用了一个频率为 100Hz 的定时器(100 个定时器事件
每秒或每 10 毫秒一个事件),而较新的内核使用 250Hz
(每秒 250 个事件或每 4ms 一个事件)或 1000Hz(1000 个事件
每秒或每 1ms 一个事件)。
这种周期性的定时器事件通常被称为“定时器滴答”。计时器
tick 的设计很简单,但有一个明显的缺点:
计时器滴答会定期发生,与处理器状态无关,
不管是闲还是忙。如果处理器空闲,它必须唤醒
每 1、4 或 10 毫秒从其省电睡眠状态退出。这
消耗相当多的能源,消耗笔记本电脑的电池寿命和
导致服务器不必要的功耗。
通过“tickless idle”,Linux 内核消除了这种周期性
CPU 空闲时的计时器滴答声。这允许 CPU 保持在
省电状态更长的时间,降低了整体
系统功耗。
因此,降低功耗是无滴答内核的主要动机之一。但是,在大多数情况下,性能会因功耗降低而受到影响。对于台式计算机,性能是最重要的问题,因此您会发现大多数台式计算机 NOHZ=OFF 工作得很好。
用 Ingo Molnar 自己的话说
无滴答内核功能 (CONFIG_NO_HZ) 启用“按需”计时器
中断:如果没有计时器超时 1.5 秒
当系统空闲时,系统将保持完全空闲状态
1.5 秒。这应该会带来更冷的 CPU 和省电:在我们的 (x86) 测试盒上,我们测量了从 HZ 开始的有效 IRQ 速率
每秒 1-2 次定时器中断。
现在,让我们尝试回答您的疑问-
我无法理解的是高分辨率计时器如何影响
do_timer ?
如果系统支持高分辨率计时器,则在大多数系统上,计时器中断可能比通常的10ms 更频繁地发生。即这些定时器试图通过利用系统功能和更快地触发定时器中断来使系统响应更快,比如每个100us。因此,使用NOHZ 选项,这些计时器被冷却下来,因此do_timer 的执行率较低
即使高分辨率硬件处于睡眠状态,持久时钟也会更多
比能够每 10ms 执行一次 do_timer
是的,它有能力。但NOHZ的意图恰恰相反。为了防止频繁的定时器中断!
其次,如果 do_timer 没有在它应该执行的时候执行,这意味着一些
理想情况下,进程没有得到分时
得到它
正如caf 在 cmets 中指出的那样,NOHZ 不会导致进程被调度的频率降低,因为它只会在 CPU 空闲时启动 - 换句话说,当没有进程可调度时。只有流程会计的东西会延迟完成。
为什么 do_timer 错过了它的最后期限?
正如阐述的那样,这是NOHZ的预期设计
我建议您从tick-sched.c 内核源代码开始。搜索 CONFIG_NO_HZ 并尝试了解为 NOHZ 功能添加的新功能
这是为测量Impact of a Tickless Kernel而执行的一项测试