15
2024
06
00:10:01

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

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 知识库文章,网址为 vmware.com/s/article/87651" target="_blank" rel="external noopener" style="box-sizing: border-box; text-decoration-line: none; background-color: transparent; transition: all 0s ease 0s; outline: 0px; line-height: 24px; letter-spacing: 0px; color: rgb(0, 121, 184) !important;">https://kb.vmware.com/s/article/87651。

    NUMA 节点打开电源时自动配置 NUMA 节点数或手动进行配置。
    设备分配如果选择手动配置 NUMA 节点,要将设备分配给 NUMA 节点,请单击每个设备前面显示的垂直省略号图标 (性能优化调优 | 如何分配虚拟机CPU拓扑会得到较好的性能),然后选择一个 NUMA 节点。
  4. 单击确定

结果

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



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


物理CPU

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

一个服务器可以有多个socket

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

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

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

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

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

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

虚拟机的CPU


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

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

拿一台虚拟的linux举例

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

这个是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,这些逻辑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对应的信息如下






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








换成拓扑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)上了。


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




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

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

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

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

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

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: