Linux nmi监视器如何工作?

时间:2012-03-26 02:35:24

标签: linux watchdog apic

现在我遇到了关于Linux NMI Watchdog的问题。 我想使用Linux NMI看门狗来检测和恢复操作系统挂起。所以我将“nmi_watchdog = 1”添加到grub.cfg。然后检查/ proc / interrupt,每秒触发NMI。但是在我加载了一个带死锁的模块(双获取自旋锁)之后,系统完全挂起,什么也没发生(从不恐慌!)。看起来nmi看门狗不起作用了!

然后我读了Documantation / nmi_watchdog.txt,它说:

  

请注意,使用本地APIC时,NMI的频率会中断   它生成,取决于系统负载。当地的APIC NMI监管机构,   缺少更好的来源,使用“循环无效”事件。

什么是“循环无效”事件?

它添加了

  

但是如果你的系统锁定除“hlt”处理器之外的任何东西   指令,看门狗将很快触发“周期   unhalted“事件将发生在每个时钟滴答...如果它锁定   “hlt”,那么你运气不好 - 事件根本不会发生   并且看门狗不会触发。

似乎看门狗在处理器执行“hlt”指令时不会触发,然后我在“ Intel 64和IA-32架构软件开发人员手册,Volumn 2A ”中搜索“hlt”,它描述如下:

  

停止指令执行并将处理器置于HALT状态。   一个启用的中断(包括NMI和SMI),一个调试异常,   BINIT#信号,INIT#信号或RESET#信号将恢复   执行。

然后我输了......

我的问题是:

  • Linux nmi监管机构如何工作
  • 会触发nmi?

我的操作系统是Ubuntn 10.04 LTS,Linux-2.6.32.21,CPU Pentium 4双核3.20 GHz。

我没有阅读关于nmi看门狗的全部源代码(没时间),如果我无法理解nmi看门狗如何工作,我想使用性能监控计数器中断 inter处理器中断(由APIC提供)发送NMI而不是nmi看门狗。

有人能帮帮我吗?感谢。

3 个答案:

答案 0 :(得分:6)

答案取决于您的硬件。

可以通过两种方式触发不可屏蔽中断(NMI):1)当内核达到不能被其他方法中断的暂停状态时,以及2)通过硬件 - 使用NMI按钮。

例如,在某些戴尔服务器的正面,您会看到一个小圆圈,里面有锯齿线。这是NMI符号。附近有一个洞。插入引脚以触发中断。如果构建内核以支持它,则会将内核崩溃跟踪转储到控制台,然后重新引导系统。

这种情况可能非常快。因此,如果您没有连接控制台以将输出保存到文件,则它可能看起来只是重新启动。

答案 1 :(得分:4)

据我所知,nmi_watchdog只会触发不可中断的挂起。我找到了谷歌的代码示例:http://oslearn.blogspot.in/2011/04/use-nmi-watchdog.html

如果您的死锁不是不可中断的,您可以尝试启用sysRq来触发一些跟踪(Alt-printscreen-t)或崩溃(Alt-printscreen-c)以获取更多信息。

答案 2 :(得分:1)

Non-Maskable Interrupt (NMI) 是最高优先级的中断,不能被任何软件屏蔽。基本上,这就是您在 Windows 计算机上按 CTRL+ALT+DELETE 时的情况。

NMI 看门狗适用于 i386 和 amd64 架构。为了使用 NMI 看门狗,操作系统的内核必须支持 APIC(高级可编程中断控制器)协议。

NMI看门狗可以通过内核参数开启;

kernel.nmi_watchdog=1 →(I/O APIC)

kernel.nmi_watchdog=2 → (Locall APIC)

启用 NMI 后,系统会定期生成 NMI 调用。每个 NMI 调用 Linux 内核中的一个处理程序并检查中断数。如果 NMI 的处理程序检测到中断数在一段时间内没有变化,则假定内核挂起。然后调用内核恐慌 enter image description here

命令显示每个 CPU 的中断。$ cat /proc/interrupts CPU0 CPU1 CPU2 CPU3
NMI:24 18 21 18 不可屏蔽中断

NMI 看门狗可用于检测服务器挂起并减少停机时间。但强烈建议在启用 NMI 看门狗之前分析系统性能。 NMI 偶尔会产生大量中断并降低服务器性能。

您可以按照以下步骤启用和禁用 NMI 看门狗。我总是建议在性能分析后启用 NMI 看门狗。因为有时检测内核挂起以分析服务器性能可能会更复杂。

启用 NMI:

kernel.nmi_watchdog=1 →(I/O APIC)

kernel.nmi_watchdog=2 → (Locall APIC)

sysctl -w kernel.nmi_watchdog=1

禁用 NMI:

kernel.nmi_watchdog=0

sysctl -w kernel.nmi_watchdog=0

您只能在内核版本为 2.6.18-238 及更高版本的情况下运行此命令。否则你必须编辑 grub.conf 然后重启服务器以禁用 NMI 看门狗。

#vim /boot/grub/grub.conf
kernel /vmlinuz-2.6.18–194.el5 ro root=/dev/VolGroup00/LogVol00   
nmi_watchdog=0

输出显示 NMI 看门狗已禁用。因为CPU上没有中断。$ cat /proc/interrupts

   CPU0     CPU1    CPU2     CPU3             
   NMI:    0        0        0        0   Non-maskable interrupts

https://medium.com/@yildirimabdrhm/nmi-watchdog-on-linux-ae3b4c86e8d8