我在今天管理的虚拟机上打开控制台,并收到一些内核消息:
[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
我使用类似的设置遇到了同样的问题:
- AMD CPU(虽然我看到过有关 Intel CPU 的相同问题的报告,但我在 Intel CPU 上运行的虚拟机管理程序都没有出现此问题,即使启用了 CPU 直通)。
- 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 0
Linux 内核再次打印。
在我的进一步研究中,我发现两个提交修复了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
。