NOHZ=ON 如何影响 Linux 内核中的 do_timer()?

Posted

技术标签:

【中文标题】NOHZ=ON 如何影响 Linux 内核中的 do_timer()?【英文标题】:How NOHZ=ON affects do_timer() in Linux kernel? 【发布时间】:2012-04-04 05:25:22 【问题描述】:

在一个简单的实验中,我设置了NOHZ=OFF 并使用printk() 打印do_timer() 函数被调用的频率。它在我的机器上每 10 毫秒调用一次。

但是,如果 NOHZ=ON 调用 do_timer() 时会有很多抖动。大多数情况下,它确实每 10 毫秒调用一次,但有时它会完全错过最后期限。

我研究过do_timer() 和 NOHZ。 do_timer() 是负责更新jiffies 值的函数,还负责进程的循环调度。

NOHZ 功能可关闭系统上的高分辨率计时器。

我无法理解的是高分辨率计时器如何影响do_timer()?即使高分辨率硬件处于睡眠状态,持久时钟也能够每 10 毫秒执行一次do_timer()。其次,如果do_timer() 没有在应该执行的时候执行,这意味着某些进程在理想情况下没有得到分时共享。大量谷歌搜索确实表明,对于许多人来说,当NOHZ=OFF 时,许多应用程序开始运行得更好。

长话短说,NOHZ=ON 如何影响do_timer()? 为什么do_timer() 错过了截止日期?

【问题讨论】:

【参考方案1】:

首先让我们了解什么是tickless kernelNOHZ=OnCONFIG_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而执行的一项测试

【讨论】:

我非常感谢这个答案。我的印象是 NOHZ 只影响雇用计时器,因此 do_timer 不会受到任何影响(我认为 do_timer 仅由不受 NOHZ 开关影响的持久时钟触发)。 NOHZ 确实 not 导致进程被调度的频率降低,因为它只在 CPU 空闲时启动 - 换句话说,当 没有进程可调度. @caf 非常感谢指针 caf。用您的 cmets 更新了我的答案 :) 那么,如果 NOHZ 不影响进程调度,那么为什么在 NOHZ=OFF 时性能(如系统冻结)会提高?我看到很多人抱怨这是论坛。 @PavanManjunath:有可能一些写得不好的用户空间应用程序或输入驱动程序与NOHZ 交互不好,但在大多数情况下,我怀疑这些人只是弄错了。

以上是关于NOHZ=ON 如何影响 Linux 内核中的 do_timer()?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建为Android可加载内核模块

如何在内核中获取当前时间(UTC

如何修改 Linux 内核配置

已编译模块的数量是不是会影响 RAM 中 Linux 内核的大小?

Linux内核d_path函数应用的经验总结

红帽6Linux操作系统收到重要内核安全更新