NOHZ = On如何影响linux内核中的do_timer

Eas*_*onk 19 linux time linux-kernel

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

但是,如果NOHZ=ON那时do_timer被调用的方式存在很多抖动.大多数情况下,它每10毫秒调用一次,但有时会完全错过最后期限.

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

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

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

长话短说,NOHZ=ON影响如何do_timer
为什么do_timer错过最后期限?

Pav*_*ath 34

首先让我们了解什么是tickless kernel(NOHZ=OnCONFIG_NO_HZ设置)以及将它引入Linux内核的动机是什么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在更长的时间段内保持省电状态,从而降低整体系统功耗.

因此,降低功耗是无滴答内核的主要动机之一.但实际情况是,大多数时候,性能会因功耗降低而受到打击.对于台式计算机,性能是最受关注的,因此您可以看到它们中的大多数都NOHZ=OFF运行良好.

Ingo Molnar用自己的话说

无滴答内核功能(CONFIG_NO_HZ)启用"按需"定时器中断:如果系统进入空闲状态时没有定时器过期,例如1.5秒,则系统将保持完全空闲1.5秒.这应该带来更冷的CPU和省电:在我们的(x86)测试盒上,我们测量了从HZ到每秒1-2个定时器中断的有效IRQ速率.

现在,让我们尝试回答您的疑问 -

我无法理解的是高分辨率计时器如何影响do_timer?

如果系统支持高分辨率定时器,则定时器中断的发生频率可能​​高于10ms大多数系统上的常规中断.也就是说,这些定时器试图通过利用系统功能和更快地触发定时器中断来使系统更具响应性,比如说每一个100us.因此,通过NOHZ选项,这些定时器可以冷却,从而降低执行速度do_timer

即使高分辨率硬件处于睡眠状态,持久时钟也能够每10ms执行一次do_timer

是的它有能力.但意图NOHZ恰恰相反.防止频繁的定时器中断!

其次,如果do_timer没有执行它应该意味着某些进程没有获得他们的分时,理想情况下应该得到它

正如caf在评论中指出的那样,NOHZ不会导致进程不经常调度,因为它只会在CPU空闲时启动 - 换句话说,当没有进程可调度时.只会在延迟时间完成流程会计.

为什么do_timer错过了截止日期?

正如所阐述的那样,它是预期的设计 NOHZ

我建议你通过tick-sched.c内核源码作为起点.搜索CONFIG_NO_HZ并尝试理解添加了新的功能NOHZ特性

以下是为测量无内核内核影响而执行的一项测试

  • `NOHZ`确实*不*导致进程不经常调度,因为它只在CPU空闲时启动 - 换句话说,*没有进程可调度*. (6认同)