VM 上的未知 NMI 原因 20 和 30

VM 上的未知 NMI 原因 20 和 30

我在今天管理的虚拟机上打开控制台,并收到一些内核消息:

[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] Dazed and confused, but trying to continue
[6064281.393568] Uhhuh. NMI received for unknown reason 30 on CPU 1.
[6064281.393888] Do you have a strange power saving mode enabled?
[6064281.394235] Dazed and confused, but trying to continue

这只是其中的一小部分,20 和 30 都发生在 CPU 0 和 1 上。

  • VM 是 Debian Jessie,BIOS 启动(“QEMU 标准 PC(i440FX + PIIX,1996),BIOS 1.9.3-20161025_171302-gandalf 04/01/2014”;内核 3.16.0-4-amd64)
  • Hypervisor 是在 Debian 测试上运行的 libvirt/KVM(目前是 Debian 的 4.7.0-1-amd64;qemu 1:2.7+dfsg-3)。
  • 硬件是 Opteron 6344超微 H8SGL-F具有 ECC RAM 且启用了清理功能。

我在主机上没有看到任何 NMI 或 EDAC 错误/警告消息。

知道是什么原因导致访客出现这些 NMI 消息吗?他们有什么可担心的吗?

(可能与出于未知原因收到 NMI 20 — 您是否启用了奇怪的省电模式?但这似乎是裸机)。

答案1

我使用类似的设置遇到了同样的问题:

  1. AMD CPU(虽然我看到过有关 Intel CPU 的相同问题的报告,但我在 Intel CPU 上运行的虚拟机管理程序都没有出现此问题,即使启用了 CPU 直通)。
  2. Debian,虚拟机管理程序和来宾上的内核 4.x(在我的例子中,两者都是 4.9.0-4-amd64)。

我的解决方案是将我的来宾虚拟机切换为使用 QEMU 模拟 CPU,而不是 CPU 直通。这需要<cpu mode='host-passthrough'/>从来宾定义文件中删除该行。

更新1:我做了进一步的调查,麻烦的元素在该clock元素下:

<clock offset='utc'>
  <timer name='rtc' tickpolicy='catchup'/>
  <timer name='pit' tickpolicy='delay'/>
  <timer name='hpet' present='no'/>
</clock>

真正的解决方案是删除这三个<timer>元素,然后<cpu mode='host-passthrough'/>可以再次启用。

为了完整起见,我添加了类似的答案链接问题

更新2 饰演 西蒙·里克特提及,此修复可能并不适合所有人,因为我删除的设置是默认设置。如果是这样,就应该遵循他的解决方案。

答案2

问题似乎是中断结束未正确传达。

对于 libvirt,请确保eoi已启用:

<domain>
  <features>
    <apic eoi='on'/>

在 KVM 命令行上,转换为

-cpu …,+kvm_pv_eoi

这似乎适用于-M q35主机 cpu 直通和默认配置(RTC 中断排队、PIT 中断丢弃、HPET 不可用)。

答案3

<acpi eoi="on"/>对我来说不起作用,一段时间后问题再次出现并由Uhhuh. NMI received for unknown reason 20 on CPU 0Linux 内核再次打印。

在我的进一步研究中,我发现两个提交修复了iTCO_wdt(英特尔总拥有成本看门狗计时器)Qemu 仿真中的错误:

Debian-9-Stretch 只有qemu-2.8,其中不包含这些补丁。 Debian-10-Buster 有 qemu-3.1,我没有观察到问题。

可以将驱动程序添加到拒绝列表中以防止其被加载:

echo blacklist iTCO_wdt >/etc/modprobe.d/itco-wdt.conf

之后,请确保关闭并重新启动虚拟机以终止旧的 Qemu 进程并获取新实例。 Areboot重新使用旧的 Qemu 进程,这将保留 Qemu 内部的损坏状态。但是reboot需要 a 来触发该错误,因为该错误在我第一次启动时从未发生过,但仅在重新启动或挂起到磁盘并恢复周期后才发生。

答案4

从另一个虚拟机管理程序克隆 Debian 10、11 虚拟机后,我在 Debian 11 虚拟机管理程序上遇到了同样的问题。它帮助我重新启动虚拟机并设置 CPU 型号值Clear CPU Configuration

相关内容