ESXi CPU调度原理

 

 

很多客户会反映某些虚拟机的性能比较差,尤其是CPU,那么究竟如何去做优化呢?要想做好优化,需要首先了解一下ESXi的CPU调度原理。首先,作为虚拟化的基础架构平台,ESXi提供计算资源的共享,在ESXi上运行的所有虚拟机都可以共享该物理机的计算资源,包括CPU和内存,但是当虚拟机的CPU需求增多的时候,就可能造成CPU性能下降,尤其是CPU超分的时候(overcommitment)。

 

在了解CPU调度之前,我们先介绍一下和CPU相关的几个概念。

Socket:槽位,指的是物理CPU的个数,vSphere授权方式就是按照Socket售卖。

Core:每个物理CPU的核心。

LCPU:逻辑CPU,也就是CPU的线程数,打开超线程功能后,LCPU就是物理机总核心数的两倍,没打开超线程功能,LCPU就等于物理机总核心数。

vCPU:管理员给虚拟机分配的虚拟CPU数量。如果指定了vSocket和vCore,vCPU=vSocket*vCore。

 

当虚拟机在ESXi主机上运行时,VMkernel中的一个组件--scheduler 就会负责vCPU的调度,由于虚拟机的vCPU无法给OS和APP提供计算能力,只能通过scheduler的调度去占用物理的LCPU才能保证虚拟机的运行,否则就会产生就绪值--ready time,从而影响到虚拟机的CPU性能。

 

首先我们讨论一下SMP(对称多处理)架构,也就是UMA(统一内存访问)架构,随后我们会讨论NUMA(非统一内存访问)架构,那么scheduler究竟是怎么工作的呢?它的工作原理大致有以下几个过程:

  • scheduler将虚拟机的vCPU调度在LCPU上运行,占用物理CPU的时间切片(time-slice),从而保证虚拟机的资源使用。
  • 虚拟机的所有vCPU会同时被调度在相应的LCPU上,而且vCPU和LCPU的占用比例是1:1,也就是说,任何一个时刻,一个vCPU会占用一个LCPU,反过来,一个LCPU上也只能运行一个vCPU。(如下图)
  • 当超分(overcommitment)时,也就是所有运行的虚拟机的vCPU之和超过了物理机的总LCPU时,scheduler会以默认50ms的时间间隔轮流调度vCPU,这个时候就会产生CPU资源争用。
  • 当管理员给虚拟机设置了资源控制参数(reservation,limit,share)时,scheduler会根据优先级调度虚拟机的vCPU,一般来说,关键业务会占用更多的CPU资源,非关键业务会占用更少的CPU资源。

esxi虚拟机的CPU硬件虚拟化要开启吗 esxi虚拟机cpu分配_超线程

 

 

由于CPU资源产生竞争,每个虚拟机可能都会在需要CPU资源的时候,获取不到,这个时候就会产生ready time(就绪值),从而影响虚拟机的CPU性能。

 

在SMP架构下,VMkernel要尽量保证物理CPU的负载均衡,默认行为下,同一个虚拟机的vCPU会被调度在不同的物理CPU上,但是对于内存密集型应用来说,这样会损失性能,因为Intel的CPU中,同一个物理CPU的core之间会共享最后一级缓存,从而提升虚拟机的性能,所以管理员为了做好优化,可以在虚拟机的vmx配置文件里添加参数,sched.cpu.vsmpConsolidate="TRUE" ,目的为了让VMkernel把同一个虚拟机的vCPU调度在同一个物理CPU上。

 

但是在NUMA架构下,VMkernel会尽量保证虚拟机的vCPU运行在同一个物理NUMA节点上,避免损失性能。

 

下边我们来了解一下NUMA架构,NUMA--Non-Uniform Memory Access,非统一内存访问。指的是vCPU运行在某一个物理CPU的虚拟机会优先使用离这个物理CPU最近的内存资源。

 

esxi虚拟机的CPU硬件虚拟化要开启吗 esxi虚拟机cpu分配_超线程_02

 

VM1和VM2运行在左侧的主节点(home node)上,VM3运行在右测的主节点上,性能达到最优。如果这三个虚拟机的vCPU或者内存无法完全运行在主节点上,那么就需要跨节点访问资源,这样就会影响性能。所以在设计虚拟机规模的时候,也要考虑到物理机的NUMA架构。

 

从vSphere 5.5开始,支持vNUMA架构,也就是在虚拟机级别启用NUMA,从而满足Guest OS和应用程序的需要。当同时满足以下两个条件时,vNUMA会自动启用,否则需要手工修改参数来启用:

  • 虚拟机的vCPU大于等于9个
  • 虚拟机的vCPU超过一个物理节点的核心数(core),而不是LCPU。

 

如下图所示:

 

esxi虚拟机的CPU硬件虚拟化要开启吗 esxi虚拟机cpu分配_Memory_03

该虚拟机满足以上两个条件,自动启用vNUMA,虚拟NUMA节点数量等于物理NUMA节点数量,但是由于虚拟机默认有10个vSocket,每个vSocket包含1个vCore,为了更优化,管理员需要修改vSocket和vCore的比例关系,比如,可以改为1个vSocket包含5个vCore,如下图所示:

 

esxi虚拟机的CPU硬件虚拟化要开启吗 esxi虚拟机cpu分配_Memory_04

如何修改呢?很简单,在虚拟机的属性中修改:

 

esxi虚拟机的CPU硬件虚拟化要开启吗 esxi虚拟机cpu分配_配置文件_05

 

剧透一下,VCAP6-DCV Deploy的考试中有一道题,要求管理员通过参数配置手工启用vNUMA,因为该虚拟机不满足自动启用vNUMA的条件,比如只有8个vCPU,那么管理员需要在vmx配置文件里添加参数:numa.vcpu.maxPerMachineNode,比如设置为4,那么虚拟机的8个vCPU就会被人为分为两个NUMA节点,每个节点4个vCPU,这样就相当于让Guest OS认为虚拟机有两个“物理”的NUMA节点了。

 

最后,强调一下,如果虚拟机启用了CPU热添加功能,那么vNUMA功能就会被禁用。所以在设计虚拟机的时候,需要注意虚拟CPU和物理CPU的匹配关系,以免影响性能。

 

关于内存资源的调度和分配,以及内存回收原理,我会在下一篇着重介绍,敬请期待。