FusionAccess桌面云虚拟机运行卡慢

发布时间:  2016-12-08 浏览次数:  184 下载次数:  5
问题描述

桌面云平台其虚拟机在运行柜面软件系统进行业务测试时,当虚拟机达到一定密度时,业务软件卡顿严重;并有少量虚拟机出现系统整体卡顿的现象;且出问题的时间段集中在业务繁忙时段

告警信息

处理过程

1)         分析云平台和虚拟机的性能数据:

发生卡顿时主机的虚拟化域CPU占用率在40%左右,未超过50%,内存使用率在30%以下,负载正常。同样,磁盘IO、网络压力均正常。


观察虚拟机的CPU、内存、磁盘、网络压力,均正常。

2)         计算主机资源使用率,主机内存380G,其上运行的所有虚拟机内存约320G,内存没有超分配,不够成瓶颈;主机逻辑CPU核数为96,运行的虚拟机VCPU总数大约在200个左右,CPU复用比约2:1


3)         分析虚拟化平台日志,没有错误日志。从历史的性能数据中没有发现出问题时间段内有磁盘IO、网络冲高。可以排除网络、磁盘IO瓶颈。

4)         分析虚拟机的Windows事件日志,在出现卡顿的时间段没有出现异常的事件日志:


5)         分析业务软件资源占用情况:从句柄数、内存、虚拟内存、分页/非分页内存等角度对比正常和异常场景,未发现出现异常的规律。

6)         发现异常指标,观察到问题虚拟机的平均CPU就绪时间高达500ms以上;


该值是虚拟机VCPU处于就绪状态但由于物理CPU繁忙而处于等待状态的时长。通常这个值可以衡量虚拟机的CPU压力情况,值越高虚拟机的CPU压力越大。该值每分钟刷新一次。

然而从上述分析看,主机和虚拟机的负载都不高,然而出现业务卡慢,这是矛盾点。虚拟机VCPU平均就绪时间异常高,这是可疑点。

7)         针对分析解决;

VCPU就绪时间长说明物理CPU存在瓶颈,为了调查VCPU就绪时间长的问题,华为研发抓取底层平台的Xentrace数据进行分析,CPU执行流程如下:

(+     0)  INJ_VIRQ  [ vector = 0x2f, fake = 0 ]

(+  1696)  VMENTRY

(+  2072)  VMEXIT  [ exitcode = 0x00000020, rIP  = 0xfffff800016dc22c ]

(+     0)  MSR_WRITE  [ MSR# = 0x40000070, value = 0x0000000000000000 ]  应答中断的EOI

(+  1156)  VMENTRY

(+  3692)  VMEXIT  [ exitcode = 0x00000020, rIP  = 0xfffff80001693369 ]

(+     0)  MSR_WRITE  [ MSR# = 0xc0000102, value = 0x000000007efdb000 ]   CPU线程上下文切换

(+  1012)  VMENTRY

(+  5472)  VMEXIT  [ exitcode = 0x00000020, rIP  = 0xfffff800017199ef ]

(+     0)  MSR_WRITE  [ MSR# = 0x40000071, value = 0x040000000000002f ]   发送IPI中断

(+  1576)  blocked_to_runnable  [ dom:vcpu = 0x00360002 ]

(+  1272)  domain_wake  [ domid = 0x00000036, edomid = 0x00000002 ]          唤醒CPU

(+   468)  VMENTRY

(+ 20796)  VMEXIT  [ exitcode = 0x0000000c, rIP  = 0xfffff880033249c1 ]       

(+   644)  do_block  [ domid = 0x00000036, edomid = 0x00000003 ]

(+     0)  HLT  [ intpending = 0 ]

(+ 11912)  switch_infprev  [ old_domid = 0x00000036, runtime = 16990 ]

(+   248)  switch_infnext  [ new_domid = 0x00007fff, time = 16990, r_time = 4294967295 ]    CPU发生调度

(+   232)  __enter_scheduler  [ prev<dom:vcpu> = 0x0036 : 0x0003, next<dom:vcpu> = 0x7fff : 0x0000 ]

(+   280)  running_to_blocked  [ dom:vcpu = 0x00360003 ]

(+   252)  runnable_to_running  [ dom:vcpu = 0x7fff0000 ]

(+ 23264)  switch_infprev  [ old_domid = 0x00007fff, runtime = 12989 ]

(+   384)  switch_infnext  [ new_domid = 0x00000036, time = 2112, r_time = 30000000 ]

(+   228)  __enter_scheduler  [ prev<dom:vcpu> = 0x7fff : 0x0000, next<dom:vcpu> = 0x0036 : 0x0003 ]

(+   252)  running_to_runnable  [ dom:vcpu = 0x7fff0000 ]

(+   388)  runnable_to_running  [ dom:vcpu = 0x00360003 ]                          到这里切换到IPI对应的CPU

(+     0)  INJ_VIRQ  [ vector = 0x2f, fake = 0 ]                                    注入IPI中断

(+  1736)  VMENTRY

从这个数据可以分析出来虚拟机内部大概的执行流程:

a)          虚拟机内部发生线程切换(wrmsr MSR_SHADOW_GS_BASE

b)          虚拟机内部一个VCPU向另一个VCPU发送IPI中断(wrmsr VIRIDIAN_MSR_ICR

c)          Hypervisor层进行VCPU调度,唤醒收中断的VCPU

d)          收中断的VCPU变为运行态,当到达一个中断窗口期的时候(hlt)注入中断

e)          VCPU收到中断进行应答(wrmsr VIRIDIAN_MSR_EOI

从整体数据上面看,整个过程中上面这个流程一直在反复执行

汇总数据如下

              110485 VMEXIT          35624475924 TSC HLT

              345605 VMEXIT           7697685276 TSC WRMSR

                3400 VMEXIT            177367732 TSC External interrupt

                3946 VMEXIT            155181804 TSC I/O instruction

               15551 VMEXIT             32883636 TSC Exception or non-maskable interrupt (NMI)

                  40 VMEXIT             19395876 TSC EPT violation

                 545 VMEXIT             13337808 TSC APIC access

                 449 VMEXIT              7644008 TSC PAUSE

                1044 VMEXIT              2807680 TSC TPR below threshold

                1158 VMEXIT              2389804 TSC RDTSC

                  97 VMEXIT              2377836 TSC VMCALL

                 768 VMEXIT              2181120 TSC Interrupt window

                 103 VMEXIT               311376 TSC Control-register accesses

                 103 VMEXIT               287820 TSC RDMSR

从这个数据看,主要的损耗在于收发中断和这个过程中的vcpu调度。

根因

柜面业务运行在四路服务器虚拟化上的业务兼容性问题

解决方案

临时解决措施:自动把虚拟机的VCPUhe内存资源分配在CPU同一个node上,并对主机node间的CPU资源做均衡负载;

最终解决措施:优化底层操作系统

建议与总结

1、日常办公桌面,由于Windows系统本身长时间运行会产生大量磁盘垃圾和内存碎片,会拖慢系统,因此建议桌面云用户在使用一段时间后(建议不超过一周),找时机关闭或重启一下虚拟机,可以提高操作系统的性能。

2、工作过程中,长时间不用的程序及时关闭,避免同时运行太多程序,耗费系统资源。

3、优化柜面应用程序

END