在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 kswapd0host主机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 --host stat live这个方式观察主机非常方便
perf kvm是特定指令,针对kvm进行性能分析
发现一个问题,在执行 perf kvm --host stat live 时发现,大量都VM-EXIT工作都消耗在IO_INSTRUCTION,并且有大量的MSR_READ和MSR_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?