HACK#57 NMI看门狗计时器

本节使用x86_64或i386架构的NMI看门狗计时器功能,可以检测出系统死机。

NMI看门狗计时器

顾名思义,NMI看门狗计时器是使用NMI的看门狗计时器。可以检测出PC在禁止中断的状态下的死机。

NMI是Non Maskable Interrupt的缩写,表示无法禁止的中断。因此内核在禁止中断状态下也可以接收到NMI的通知。

中断是从硬件发出的信号,I/O的完成或数据包的接收通过中断传递到内核。内核接收到这个中断时会进行各种处理,但如果进行并行处理就会出现数据不匹配,因此在接收到1个中断时,就会禁止此后的中断直到这个中断的处理完成。

NMI并不是用来处理I/O或数据包等一般数据,而是用来通知紧急情况的,因此进行了无法禁止中断的特别处理。

内存的奇偶校验错误等系统致命错误就是需要通知的紧急情况。最近出现了定期发生NMI的功能。NMI看门狗计时器就是使用这个功能的看门狗计时器。通过NMI看门狗计时器检测出系统死机。另外在检测出死机时还可以获取内核崩溃转储。

内核使用NMI看门狗计时器检测死机的结构如下(如图7-4所示)。一般来说,计时器中断在1秒钟内发生的次数为内核配置中设置的次数(100~1000次)。

但是,例如,在禁止中断的状态下,内核进入无限循环或死锁时,就不会执行计时器中断处理。另一方面,NMI即使在这种情况下也会发生,CPU执行NMI处理程序。NMI处理程序监视是否执行了计时器中断,如果执行了计时器中断,就会超时,认为系统已死机,如图7-5所示。

HACK#57 NMI看门狗计时器 - 图1

图 7-4 内核检测死机的结构

HACK#57 NMI看门狗计时器 - 图2

图 7-5 检测出死机时

RHEL6中的超时时间默认为30秒。上游内核中为5秒。