15
2024
06
00:10:01

性能优化调优 | 如何分配虚拟机CPU拓扑会得到较好的性能



推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

https://docs.vmware.com/cn/VMware-vSphere/8.0/vsphere-vm-administration/GUID-19925544-A04A-4488-9095-40E40EFA93B4.html


不同的虚拟 CPU 拓扑会从虚拟机客户机操作系统内影响调度和放置。

默认情况下,ESXi 主机会自动选择与底层硬件一致的虚拟拓扑。在 vSphere 8.0 中,可以手动配置虚拟 CPU 拓扑。例如,可以更改每个 NUMA 节点的虚拟 CPU 数,将虚拟设备分配给虚拟 NUMA 节点或将其保持取消分配状态。

编辑虚拟机或通过 vMotion 迁移虚拟机时,将保留配置。

有关虚拟 CPU 拓扑和虚拟 NUMA 的详细信息,请参见《vSphere 资源管理》文档。

前提条件

  • 虚拟机要求:

    • 硬件版本 20 或更高版本。

    • 验证是否已关闭虚拟机电源。

过程

  1. 导航到虚拟机,然后从操作菜单中,单击编辑设置

  2. 虚拟机选项选项卡上,单击 CPU 拓扑

  3. 为虚拟机配置 CPU 拓扑。配置虚拟机的 CPU 拓扑

    选项描述
    每个插槽内核数选择是希望系统自动分配每个插槽内核数,还是手动指定每个插槽内核数。
    CPU 热插拔启用时,虚拟机将在运行时热添加虚拟 CPU。激活 CPU 热插拔时,将取消激活虚拟 NUMA,且热添加的 CPU 将在单个 NUMA 节点上运行。要启用虚拟 NUMA 并允许在新虚拟 NUMA 节点上显示热添加的 CPU,请在高级参数选项卡上,在属性字段中输入 numa.allowHotadd 参数,并将其值设置为 TRUE

    有关详细信息,请参见 VMware 知识库文章,网址为 https://kb.vmware.com/s/article/87651

    NUMA 节点打开电源时自动配置 NUMA 节点数或手动进行配置。
    设备分配如果选择手动配置 NUMA 节点,要将设备分配给 NUMA 节点,请单击每个设备前面显示的垂直省略号图标 (垂直省略号图标),然后选择一个 NUMA 节点。
  4. 单击确定

结果

从虚拟机的摘要选项卡中,可以监控 ESXi 主机公开(自动或手动)的 CPU 拓扑。



对于物理机来说,CPU有socket、Core、thread的概念,一个linux虚拟机上面同样有这些信息,这些信息是什么含义,和物理机之间有多少对应关系呢?如何分配CPU拓扑,会得到较好的性能?


物理CPU

首先介绍一下物理CPU的概念:

一个服务器可以有多个socket

一个socket(插槽)可以插一个chip。

一个chip里面可以有N个core(核)

一个核里面可以有1个CPU线程,如果开启超线程, CPU线程=核*2

下面是一个物理机的CPU信息

上面这些信息是x86 CPU。如果是Power的CPU,超线程可以一个核超出来2个、4个、8个(根据机器型号)。同时,还有一个drawer(抽屉)的概念。一个抽屉里面有N个socket,一个服务器可以有多个抽屉。

虚拟机的CPU


对于虚拟机来说,操作系统看到的CPU信息都是虚拟的,但操作系统认为他们是物理的。

查看虚拟机CPU的方法和物理机没什么区别,一般用lscpu或者cat /proc/cpuinfo来查看

拿一台虚拟的linux举例

这个是linux操作系统看到的CPU信息,linux操作系统并不知道自己跑在一个虚拟机上,虽然看到的CPU都是虚拟的,但linux认为这些都是真的,因此在进程调度上,也会按照这个信息去调度。

CPU(s): 8   :一共8个逻辑CPU,即8个vCPU


Thread(s) per core: 1:每个核有几个线程,分配虚拟机的时候,拓扑默认就是1


Core(s) per socket: 1:每个插槽(一个插槽可以插一个cpu chip)里面有几个核,分配虚拟机的时候,拓扑默认就是1


Socket(s): 8:有几个插槽(一个插槽可以插一个cpu chip)


这一段的信息是,该虚拟机一共有8个chip,每个chip里有1个核,每个核里有1个thread。这样就是8*1*1=8个thread,即8个逻辑CPU,即8个vCPU。

注:这里的socket、core都是虚的。


接下来,看cpuinfo里面的信息(和lscpu是一致的)




processor:
0 :虚拟CPU(vCPU)的ID,OS以为这是物理的,其实是虚拟的。这里的processor不是虚拟核,而是虚拟CPU线程。因为如果如果分配虚拟机的时候,虚拟核开启超线程(2),那么虚拟CPU线程=虚拟核2


physical id: 0
:这个是虚拟socket(chip)的ID。在本例中,给虚拟机分配了8个sockets,那么physical id会有8个,分别是0-7.


siblings: 1
:一个虚拟socket上有多少虚拟CPU线程。如果=1,那么只有1个thread(processor)。说明这个socket上只有一个core,这个core里只有一个thread(processor)。


core id: 0
:这是虚拟core的id号,每个虚拟core可以有1个虚拟thread(processor),如果分配虚拟机的时候,虚拟核开启超线程(2),那么每个虚拟core可以有2个虚拟thread(processor)


cpu cores: 虚拟core的数量


收集全部cpuinfo的信息如下











CPU拓扑






即分配多少逻辑CPU,这些逻辑CPU是如何通过socket、core、超线程组合出来的。




分配虚拟机时,需要指定多少socket(插槽)、每个插槽有多少core,core有没有超线程。










不同的拓扑






同样是分配8个逻辑CPU,也可以采用其他的拓扑。




本例中,分配的方式我们再回顾一下


CPU(s):      
      8


Thread(s) per core:    1


Core(s) per socket:    1


Socket(s):    
      8


分配8个vCPU:该虚拟机一共有8个chip,每个chip里有1个核,每个核里有1个thread。这样就是81*1=8个thread,即8个vCPU。




换成拓扑B:


CPU(s):     
               8


Thread(s) per core:    2


Core(s) per socket:    4


Socket(s):      
           1




Cpuinfo对应的信息如下















换成拓扑C:


CPU(s):     
               8


Thread(s) per core:    1


Core(s) per socket:    8


Socket(s):      
           1




拓扑的排列组合还可以有很多其他方式。








不同的拓扑是否性能不同?








首先操作系统会看这个拓扑,在进程调度时为了保持亲和性,会优先把同一个进程调度到同一个core上,如果不能调度到同一个core,则尽量调度到同一个socket上。


虚拟化平台,也许也会倾向于把同一个虚拟core、虚拟socket调度到同一个物理core、物理socket上。至于具体到某个虚拟化平台(VMware、KVM、Hyper-V、Citrix)是怎么调度的,肯定是各有各的算法。


因此,如果想收获比较好的虚拟机性能表现,把虚拟机的CPU拓扑设置为和物理机一致,这样在亲和性保持上比较有利。如果不一致,就不利。


举一个不一致的例子。


物理机拓扑:2个sockets、每个socket有4个cores,每个core有一个thread。


虚拟机拓扑:1个sockets、每个socket有8个cores,每个core有一个thread。


在OS进程调度时,如果同一个进程不能调度到同一个虚拟core(名叫A)上,它会调度到同一个socket上其他core,OS一看拓扑,大家都在同一个socket,于是就随便调度到一个core(名叫F)。


而在物理机层面,这个8个虚拟core不可能调度到同一个socket(假设叫1)上,因为一个socket只有4个cores。结果,core(F)就被调度到Socket(名叫2)上了。


于是上下文切换的代价就明显增高。


本文链接:http://hqyman.cn/post/6643.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

您的IP地址是: