Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于Linux NMI监视程序_Linux_Performancecounter_Watchdog_Apic - Fatal编程技术网

关于Linux NMI监视程序

关于Linux NMI监视程序,linux,performancecounter,watchdog,apic,Linux,Performancecounter,Watchdog,Apic,现在我遇到了一个关于Linux NMI看门狗的问题。 我想使用Linux NMI看门狗来检测和恢复操作系统挂起。因此,我将“nmi_watchdog=1”添加到grub.cfg中。然后检查/proc/interrupt,NMI每秒触发一次。但在我加载一个带有死锁(双获取自旋锁)的模块后,系统被完全挂起,什么也没发生(永远不要惊慌!)。看来NMI的看门狗不起作用了 然后我阅读了文档/nmi_watchdog.txt,它说: 请注意,当使用本地APIC时,NMI的频率会中断 它根据系统负载生成。当地

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

然后我阅读了文档/nmi_watchdog.txt,它说:

请注意,当使用本地APIC时,NMI的频率会中断 它根据系统负载生成。当地APIC NMI监督机构, 如果没有更好的源,则使用“循环未被缓存””事件

什么是“未受影响的循环”“事件

它补充说:

但是如果您的系统锁定在“hlt”处理器之外的任何东西上 指令,看门狗将在“循环”后立即触发 “未受影响”事件将在每个时钟滴答响时发生…如果它锁定在 “hlt”,那么你就不走运了——这件事根本不会发生 看门狗不会触发

如果处理器执行“hlt”指令,看门狗似乎不会触发,那么我在“英特尔64和IA-32体系结构软件开发人员手册,第2A卷”中搜索“hlt”,它描述如下:

停止指令执行并使处理器处于暂停状态。 启用的中断(包括NMI和SMI)、调试异常、 BINIT信号、初始信号或复位信号将恢复 执行

然后我迷路了

我的问题是:

  • Linux NMI看门狗是如何工作的
  • 谁触发NMI
我的操作系统是Ubuntu 10.04 LTS,Linux-2.6.32.21,CPU奔腾4双核3.20 GHz


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

正如我所知,NMI看门狗只会在不可中断的挂起时触发。我找到了谷歌的一个代码示例:

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

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

答案取决于您的硬件

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

例如,在一些戴尔服务器的正面,您会看到一个小圆圈,里面有一条之字形的线。这是NMI符号。附近有一个洞。插入一个引脚以触发中断。如果您的内核是为支持它而构建的,这将把内核紧急跟踪转储到控制台,然后重新启动系统

这可能发生得很快。因此,如果没有连接控制台以将输出保存到文件,它可能看起来只是重新启动。

不可屏蔽中断(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内核中的一个处理程序并检查中断的数量。如果NMIs的处理程序检测到中断的数量在一段时间内没有改变,它会假定内核挂起,然后调用内核死机

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

   CPU0     CPU1    CPU2     CPU3             
   NMI:    0        0        0        0   Non-maskable interrupts
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

很好的东西NMI看门狗,将它添加到我的tradeLinux内核实现工具watchdog\u NMI\u enable()。谢谢。我已经阅读了有关nmi_watchdog(linux-2.6.32)的所有源代码,现在我知道了它是如何工作的:)原始链接中的代码是。它只适用于单处理器系统。该线程中的A包含在多核和SMP系统上工作的代码。链接背后的博客是非公开的(不再是)“此博客仅对受邀读者开放”