在KVM中运行windows 10响应缓慢且CPU sys占用严重的解决方法

在KVM环境运行Windows 10,发现性能非常差,在物理主机上检查

top - 13:43:41 up 6 days, 22:24,  3 users,  load average: 3.15, 2.72, 2.01
Tasks: 205 total,   4 running, 201 sleeping,   0 stopped,   0 zombie
%Cpu(s): 49.8 us, 20.2 sy,  0.0 ni, 29.7 id,  0.3 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem :  8113620 total,   132176 free,  6632048 used,  1349396 buff/cache
KiB Swap:   999420 total,       32 free,   999388 used.  1018384 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 7656 libvirt+  20   0 7248848 3.720g   2512 S 146.2 48.1 736:00.16 qemu-system-x86
21715 libvirt+  20   0 6707652 2.873g   2704 R 128.2 37.1 145:05.49 qemu-system-x86
   31 root      25   5       0      0      0 S   1.6  0.0 133:51.26 ksmd
22127 huatai    20   0   41936   3584   2972 R   1.6  0.0   0:00.30 top

其中,7656进程对应的是win2106虚拟机,在虚拟机内部观察cpu繁忙程度只有 80%,但是物理服务器上显示则占用cpu资源翻倍,约170%。(仅仅是更新操作系统)

win10虚拟机则更为夸张,没有任何程序运行,在虚拟机内部观察CPU几乎是空闲的,但是远程操作依然非常缓慢,在物理服务器上观察进程 21715 占用CPU资源超过130%。

此外观察可以看到,系统的sys占用非常严重,表明虚拟化消耗了很多系统资源

top - 14:07:23 up 6 days, 22:48,  3 users,  load average: 3.25, 3.05, 2.86
Tasks: 206 total,   3 running, 203 sleeping,   0 stopped,   0 zombie
%Cpu0  : 46.5 us, 14.7 sy,  0.0 ni, 38.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  : 40.8 us, 31.7 sy,  0.0 ni, 26.8 id,  0.0 wa,  0.0 hi,  0.7 si,  0.0 st
%Cpu2  : 40.1 us, 20.1 sy,  0.0 ni, 39.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  : 70.3 us, 20.3 sy,  0.0 ni,  9.1 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8113620 total,   142212 free,  6650924 used,  1320484 buff/cache
KiB Swap:   999420 total,        0 free,   999420 used.   999268 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 7656 libvirt+  20   0 7248848 3.732g   2504 S 146.4 48.2 770:42.78 qemu-system-x86
21715 libvirt+  20   0 6707652 2.864g   2664 R 131.1 37.0 177:21.19 qemu-system-x86
   31 root      25   5       0      0      0 S   4.6  0.0 135:19.57 ksmd
22193 huatai    20   0   41936   3712   3016 R   0.7  0.0   0:00.19 top
   43 root      20   0       0      0      0 R   0.3  0.0   3:25.96 kswapd0

host主机messages日志可以观察到

升级了物理主机系统,然后重启,只运行一个win10系统,但是依然显示虚拟机占用资源很高。看上去sys是罪魁祸首。

排查

参考 High KVM/QEMU CPU utilization when Windows 10 guest is idle 可以采用perf来检查qemu消耗cpu时间的原因,检查是在内核空间、用户空间还是guest空间消耗的cpu

其中,如果是 [k] 开头则是kernel space,如果是 [.] 开头则是user space。

如果VM大量执行VM_EXIT则需要调查为何会如尝试

使用 perf kvm --host stat live

perf kvm --host stat live 这个方式观察主机非常方便

perf kvm是特定指令,针对kvm进行性能分析

发现一个问题,在执行 perf kvm --host stat live 时发现,大量都VM-EXIT工作都消耗在IO_INSTRUCTION,并且有大量的MSR_READMSR_WRITE

在原文中建议,如果出现大量的VM_EXIT,则有可能是由于APIC时钟中断(timer interrupts)导致的kvm_apic_accept_irq。需要检查Windows 10是否使用APIC时钟。hyperv hypercall可以使用MSR,这样kvm_msr可能会被hyperv synthetic中断时钟调用 1000次/s。

有可能虚拟机在不断唤醒并执行halt polling,导致消耗了主机大量cpu。

KVM: High host CPU load after upgrading VM to windows 10 1803 提到了解决方法:需要在KVM虚拟机配置中添加hpet时钟。

检查当前默认配置:

修改成

果然修改以后再次启动windows虚拟机,可以看到sys负载已经极低,并且

此时使用 perf kvm --host stat live 可以看到几乎很少出现IO_INSTRUCTION

此时NC上观察Windows虚拟机已经很少有SYS占用情况,响应也恢复正常。

参考

Last updated

Was this helpful?