本文介绍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,忽略未知的不可屏蔽中断。
登录ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
执行以下命令,查看是否存在内核参数
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"
执行以下命令,使配置在当前环境中生效。
sudo sysctl -p
说明如果需要额外修改内核参数,并且不希望重新加载内核参数配置文件,请执行
sysctl -w kernel.unknown_nmi_panic=0
命令,只修改内核参数kernel.unknown_nmi_panic
的值为0
。