关于Linux NMI看门狗

30
我遇到了一个关于Linux NMI Watchdog的问题。我想使用Linux NMI watchdog来检测和恢复操作系统的挂起。因此,我将“nmi_watchdog = 1”添加到grub.cfg中,并检查/ proc / interrupt,NMI每秒触发一次。但是,在我加载一个死锁模块(双重获取自旋锁)后,系统完全挂起,没有任何情况发生(从未恐慌!)。看起来NMI watchdog没有起作用!然后我阅读了Documentation / nmi_watchdog.txt,它说:“请注意,当使用本地APIC时,它生成的NMI中断频率取决于系统负载。缺乏更好来源的本地APIC NMI watchdog使用“不受阻止的周期”事件。”什么是“不受阻止的周期”事件?它还补充说:“但是,如果您的系统在除“hlt”处理器指令以外的任何内容上都锁定,则由于每个时钟滴答,“未阻止的周期”事件将很快发生,看起来像看门狗不会触发。如果它在“hlt”上锁定,那么你就没戏了——事件根本不会发生,看门狗不会触发。”似乎如果处理器执行“hlt”指令,则看门狗不会触发。然后,我在“Intel 64 and IA-32 Architectures Software Developer's Manual, Volumn 2A”中搜索“hlt”,它描述如下:“停止指令执行并将处理器置于HALT状态。启用的中断(包括NMI和SMI),调试异常,BINIT#信号,INIT#信号或RESET#信号将恢复执行。”那么我迷失了...我的问题是:Linux NMI watchdog是如何工作的?
  • 触发了NMI?
  • 我的操作系统是Ubuntu 10.04 LTS,Linux-2.6.32.21,CPU为Pentium 4双核3.20GHz。

    我没有完全阅读关于NMI看门狗的源代码(没有时间),如果我无法理解NMI看门狗的工作原理,我想使用性能监控计数器中断和由APIC提供的跨处理器中断来代替NMI看门狗发送NMI。


    好东西,NMI看门狗,把它加入我的工具箱。 - cctan
    Linux内核实现watchdog_nmi_enable()函数。 - firo
    2个回答

    9
    答案取决于你的硬件。
    非屏蔽中断(NMI)可以通过两种方式触发:1)当内核达到不能被其他方法中断的停止状态时,和2)通过硬件——使用NMI按钮。
    例如,在一些戴尔服务器的正面,你会看到一个带有一条锯齿线的小圆圈。这是NMI符号。附近有一个孔。插入一个针来触发中断。如果你的内核支持,这将把内核恐慌跟踪转储到控制台,然后重新启动系统。
    这可能发生得非常快。因此,如果您没有连接控制台将输出保存到文件,它可能看起来只是重新启动。

    3
    据我所知,仅当发生不可中断挂起时,nmi_watchdog才会被触发。我在谷歌上找到了一个代码示例:http://oslearn.blogspot.in/2011/04/use-nmi-watchdog.html 如果您的死锁不是不可中断的,您可以尝试启用sysRq来触发一些跟踪(Alt-printscreen-t)或崩溃(Alt-printscreen-c)以获取更多信息。

    1
    谢谢。我已经阅读了关于nmi_watchdog(在linux-2.6.32中)的所有来源,现在我知道它如何工作 :) - silverbullettt
    来自原始链接的代码已经在kernelnewbies上重新发布了。它仅适用于单处理器系统。那个线程中的回复包括能够在多核和SMP系统上运行的代码。 - bain
    链接后面的博客已不再对公众开放:“此博客仅向受邀读者开放”。 - Benjamin Peter

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接