KVM:将虚拟机升级到 Windows 10 1803 后主机 CPU 负载过高

KVM:将虚拟机升级到 Windows 10 1803 后主机 CPU 负载过高

我正在运行带有 KVM/libvirt/qemu 和 Windows 10 虚拟机的 Ubuntu 16.04 服务器。将 Windows 10 升级到最新 1803 版本(2018 年 4 月更新)后,我注意到虚拟机响应速度变慢,主机中的 CPU 负载过高。我进行的测试:

  • 主机上使用的“top”报告称 qemu-system-x86 进程占用了 38-44% 的 CPU,而虚拟机处于空闲状态,并报告 Windows 进程管理器内部的负载为 4-6%。当 Windows 显示 50% 的 CPU 负载时​​,主机显示 qemu-system-x86 进程的 CPU 负载为 150-200%。旧版 Windows 10 1709 VM 不会出现主机 CPU 负载增加 8-10 倍的情况。
  • 主机上的“dstat”报告了很多system->csw,大约13k。
  • 我测试了另一个具有相同设置的系统,即 AMD FX-4300、Ubuntu 17.10 dekstop + kvm,将 Windows 10 升级到 1803,并且在这台机器上也遇到了同样的主机 CPU 和 dstat-csw 高的问题。
  • 我拿了第三台带有英特尔酷睿 i7 的机器,安装了新的 Ubuntu 18.04 桌面 + kvm,安装了全新的 Windows 10,安装了 Virtio 驱动程序(可从这里我也有同样的 CPU 高问题。

我该怎么办?我使用的 virtio 驱动程序正确吗?

谢谢

答案1

发现有人遇到同样的问题并且可能在这里得到修复: https://forum.proxmox.com/threads/high-cpu-load-for-windows-10-guests-when-idle.44531/

测试更改我自己的配置,并在 vm xml 中将 hpet 设置为 yes 为我解决了这个问题。

  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='yes'/>
    <timer name='hypervclock' present='yes'/>
  </clock>

hpet 部分很重要。

答案2

Windows 10 21H1 和 也遇到了同样的问题qemu-kvm-4.2.0。当 Windows 机器空闲时,我的 CPU 使用率约为 30%。修复后,我的 CPU 使用率约为 5%。

hv_synic通过添加& hyperv 照明解决了问题hv_stimer。您可能会遇到以下错误

error: Failed to start domain mymachine.local
error: internal error: process exited while connecting to monitor: Hyper-V synthetic timers (hv-stimer) requires Hyper-V clocksources (hv-time)
Hyper-V synthetic interrupt controller (hv-synic) requires Hyper-V VP_INDEX MSR (hv-vpindex)
2021-09-22T20:30:06.440656Z qemu-kvm: kvm_init_vcpu failed: Function not implemented

为了使上述启蒙工作,您必须添加(在 libvirt 中hv_time转换为)和启蒙。hypervclockhv_vpindex

我的最终 libvirt XML 文件如下所示

  <features>
    <acpi/>
    <apic/>
    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
      <vpindex state='on'/>
      <synic state='on'/>
      <stimer state='on'/>
    </hyperv>
    <smm state='on'/>
  </features>

  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='discard'/>
    <timer name='hpet' present='yes'/>
    <timer name='hypervclock' present='yes'/>
  </clock>

免责声明:这是在 CentOS 8 下完成的,但应该可以在任何 libvirt 控制的 KVM 下工作。

答案3

目前的答案对我都不起作用。对我有用的一个解决方法是保持 Windows 10 任务管理器打开。我总是注意到,当 CPU 使用率很高时,我会打开 Windows 10 任务管理器,会出现使用 100% CPU 的“系统中断”,但它会立即消失。显然,对于那些没有保持交互式会话打开的人来说,这不起作用,但仅供参考。

相关内容