简介
本文主要介绍如何在使用openEuler操作系统的鲲鹏服务器上部署和使能虚拟机死锁检测特性。
在虚拟机环境中,构建一个可靠的死锁检测机制尤为重要,因为它能防止虚拟机在陷入死循环后无法跳出,保持系统的持续可管理性。虚拟机死锁检测机制通过触发不可屏蔽中断(NMI,Non-Maskable Interrupt),在虚拟机中实时监测中断响应情况,以此来实现对虚拟机内部的死锁情况的检测,可以有效防止因死锁导致的虚拟机卡住而无法恢复运行的问题。
在Linux系统中,死锁检测功能通常依赖于Watchdog机制来实现。传统的Watchdog机制主要依赖于时钟中断来监测系统是否陷入挂死状态。然而,在特定的系统执行阶段,如中断处理过程中或中断被明确禁用的代码段(即原子上下文),时钟中断的处理可能会被阻塞,从而导致Watchdog的检测功能无法有效发挥作用。相比之下,NMI Watchdog机制则利用了NMI(即不可屏蔽中断)这一特性来进行检测。NMI中断具有在原子上下文中触发并得到处理的能力,因此它能够有效地捕捉到那些在原子上下文中发生的系统挂死情况,为系统提供了更为全面和可靠的挂死检测保障。

原理描述
NMI Watchdog是一种专门用于检测Linux系统中硬死锁(hard lockup)现象的机制。NMI Watchdog通过触发NMI中断,根据中断是否得到处理,来监测内核是否发生了硬死锁。
整体上看,openEuler在Arm64平台上提供了两种NMI Watchdog方案:
- 基于SDEI的Watchdog(默认方案)
SDEI(Software Delegated Exception Interface,软件委托异常接口)用于在非安全环境中注册回调函数,以在底层系统事件发生时执行指定动作。openEuler操作系统基于Arm64特有的SDEI功能,实现了SDEI Watchdog作为NMI Watchdog的一种形式。
- 基于PMC(PMU)中断的NMI Watchdog
openEuler支持的另一种方案是采用基于中断优先级的Pseudo-NMI技术,将PMI(Performance Monitoring Interrupt)配置为模拟NMI中断的功能,同时禁用SDEI Watchdog,从而在虚拟机内部触发高优先级NMI中断,以此来实现NMI Watchdog机制,也称为PMU Watchdog(Performance Monitoring Unit Watchdog)。当系统出现hard lockup时,可以记录异常并进行复位。

Arm64平台上:
- 默认情况下,openEuler会优先使用SDEI Watchdog。但是,虚拟机场景下,SDEI Watchdog无法成功启用,但系统也并不会自动切换到基于PMC/PMU的NMI Watchdog,因此要通过配置内核参数将其禁用。
- 若用户确实需要使用基于PMC/PMU的NMI Watchdog,则需要在系统启动参数中明确禁用SDEI Watchdog,具体操作为添加“disable_sdei_nmi_watchdog”参数,完整参数请参见使能一节。