我正在运行带有 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
转换为)和启蒙。hypervclock
hv_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 的“系统中断”,但它会立即消失。显然,对于那些没有保持交互式会话打开的人来说,这不起作用,但仅供参考。