现在我遇到了关于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#信号将恢复 执行。
然后我输了......
我的问题是:
我的操作系统是Ubuntn 10.04 LTS,Linux-2.6.32.21,CPU Pentium 4双核3.20 GHz。
我没有阅读关于nmi看门狗的全部源代码(没时间),如果我无法理解nmi看门狗如何工作,我想使用性能监控计数器中断和 inter处理器中断(由APIC提供)发送NMI而不是nmi看门狗。
有人能帮帮我吗?感谢。
答案 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