为什么Linux实例设置内核参数kernel.unknown_nmi_panic后, 实例异常重启?

本文介绍Linux实例设置内核参数kernel.unknown_nmi_panic后,实例异常重启的问题原因和解决方案。

问题现象

在Linux系统的阿里云ECS实例中,设置内核参数kernel.unknown_nmi_panic后,实例异常重启。系统恢复后查看内核日志,提示以下调用栈信息:

[5912557.130943] Uhhuh. NMI received for unknown reason 20 on CPU 0.

[5912557.131115] Do you have a strange power saving mode enabled?

[5912557.131287] Kernel panic - not syncing: NMI: Not continuing

问题原因

该问题一般是由于内核参数kernel.unknown_nmi_panic被设置为1,导致内核在收到未知的不可屏蔽中断发生Panic,出现实例重启现象。

内核参数 kernel.unknown_nmi_panic用于控制内核在遇到未知的不可屏蔽中断(Non Maskable Interrupt,简称NMI)时的行为。目前大多数Linux发行版本上kernel.unknown_nmi_panic 的值均设为0,即忽略未知的不可屏蔽中断。如果由于某些原因开启了该配置,可能导致内核在收到未知的不可屏蔽中断发生Panic,并出现实例重启的情况。

  • kernel.unknown_nmi_panic = 1:内核将在遇到未知的不可屏蔽中断时,认为系统出错并触发内核Panic,从而导致实例出现非预期的重启或业务中断。

  • kernel.unknown_nmi_panic = 0:忽略该问题不做进一步处理,保持实例当前状态继续运行。

解决方案

您可以参考以下方法进行处理,将内核参数kernel.unknown_nmi_panic的值设置为0,忽略未知的不可屏蔽中断。

  1. 登录ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 执行以下命令,查看是否存在内核参数kernel.unknown_nmi_panic相关配置。

     grep 'kernel.unknown_nmi_panic' /etc/sysctl.conf /etc/sysctl.d/*.conf
    • 如果已有相关配置,则需要手动删除多余的配置,只保留/etc/sysctl.conf 文件的中一项并设置为kernel.unknown_nmi_panic = 0

    • 如果不存在相关配置,请依次执行以下命令,在/etc/sysctl.conf 文件末尾添加kernel.unknown_nmi_panic = 0内容。

      sudo sh -c "echo >> /etc/sysctl.conf"
      sudo sh -c "echo 'kernel.unknown_nmi_panic = 0' >> /etc/sysctl.conf"
  3. 执行以下命令,使配置在当前环境中生效。

    sudo sysctl -p
    说明

    如果需要额外修改内核参数,并且不希望重新加载内核参数配置文件,请执行sysctl -w kernel.unknown_nmi_panic=0命令,只修改内核参数kernel.unknown_nmi_panic的值为0