Vincent
作者Vincent·2021-03-24 11:27
存储工程师·china

为什么虚拟机CPU数量不是“越多越好”?

字数 2906阅读 3098评论 0赞 1

前言:

许多虚拟化管理员和云管理员经常吐槽,业务申请虚拟机很多情况下申请的资源远远大于实际需要的资源,当虚拟化或者云资源紧张需要回收资源时却比较困难(主要是增加可以在线,回收往往需要关机)。由于篇幅有限,本文主要从两方面阐述为什么虚拟机CPU数量不是“越多越好”,由于本人水平有限,文中难免会有错误,希望以后大家多多批评指正,相互探讨。


1、什么是VM WORLD

WORD是在逻辑核心上调度的执行上下文,就像常规操作系统里面的进程,一个虚拟机可以看作是许多world的一个组,一个集合。在虚拟机的概念里,有许多world的类型,例如一个vCPU,虚拟机的鼠标,键盘以及屏幕(vmx-mks) ,SVGA 设备(vmx-svga) 等。对world的理解可以有多种方式,正所谓“一花一世界,一树一菩提”。其实最主要的知道CPU调度就是选择将哪个WORLD调度到逻辑核心上。

2、CPU调度的特点

  • CPU调度主要是分配并协调CPU资源的使用
  • 使用动态透明的方式进行CPU资源分配(一般情况下2-30毫秒检查一次物理CPU的使用,确认是否有必要进行资源迁移)
  • 一般情况下vCPU在逻辑核心上默认的运行时间是50毫秒(一个vCPU在逻辑核心上运行的时候,其余的vCPU如果需要此逻辑核心进行调度则需要等待,这时候就有可能产生排队)
  • CPU调度默认使用比例份额(proportional-share)算法

    当CPU资源被过度使用的时候,根据所有虚拟机的CPU分配策略(共享,预留及限制),进行物理CPU资源的时间片分配。

    要记住,当物理CPU资源使用过高的时候,虚拟机CPU的分配策略就会发生作用(共享,预留,限制),所以建议对不同的业务配置不同的策略。

    3、先看一张图

    这张图是WORLD在不同状态之间的转换图。

首次添加时WORLD处于RUN或者READY状态,如果有可用的资源,CPU将调度WORLD到逻辑核心运行,WORLD的状态从READY到RUN。处于RUN状态的WORLD会进入COSTOP状态,如果需要等待其它资源则会进入WAIT状态,等待的资源准备完成后则会被Wakeup。处于COSTOP状态的WORLD会被CoStart然后进入REDAY状态等待被调用。 * 4、解释下COSTOP状态*
上面解释了处于RUN状态的WORLD如果等待其他资源则会进入WAIT状态,时间片到会进入READY状态,但是什么原因会进入COSTOP状态呢?这里要说一下协同调度(co-scheduling),协同调度(co-scheduling)是一个将多个相关联的WORLD调度到不同的处理器上同时运行的技术。既然是调度到不同的处理器,处理器的负载和性能不尽相同,则有可能出现多个WORLD不能同时完成的情况,最慢的vCPU与其他vCPU之间会存在进度差,这种进度差叫做偏差(skew)。

为了减少这种偏差则引入了松弛协同调度(relaxed co-scheduling)的策略, 使用松弛协同调度(relaxed co-scheduling)的策略能保证任何一个WORLD被调用,其余的WORLD也立即被调用,用来减少偏差。所以COSTOP状态可以理解为是多个vCPU处于偏差时的状态。在ESXTOP输出中的 %CSTP 就是表示从COSTOP到CoStart的时间百分比,如果此值较高,对数据复制到虚拟机或从虚拟机复制数据时,传输速度慢;备份作业超时或速度极慢;虚拟机性能低时则需要考虑是否为虚拟机分配了过多的vCPU,所以CPU资源紧张时,vCPU个数少的虚拟机等待时间少,竞争机会大; 敲重点:这也就是CPU数量不是“越多越好”的第一个原因。
5、简单说说NUMA 先看一张 NUMA 服务器的图

从上面这张图应该能知道为什么物理服务器在内存不是满配的情况下,插几根内存以及插到哪个插槽为什么是有讲究的。需要知道的是对于一个CPU来说,内存分为本地与远程。 NUMA是什么?NUMA(Non Uniform Memory Access)非统一内存访问,这里仅仅是提一下,不做详细解释。
我们看看ESXi是怎么分配虚拟机的

当虚拟机开机的时候,ESXi NMUA调度器分配虚拟机到Home Node。Home Node是系统的NUMA Node。在选择Home Node的时候,ESXi NMUA调度器为了保证虚拟机的性能尽量将所有虚拟机的内存在同一个NUMA Node。另外在NUMA Node中每个CPU都是通过一个或者多个内存控制器直接访问内存的。在CPU中执行的程序访问本地CPU直连的内存要快于不是CPU直连的内存,也就是本地的快于远程的。
6,几个概念说明

ESXi为每个VM提供vCPU和虚拟套接字(vSocket)。一个vSocket根据虚拟机vCPU的数量不同映射给一个或多个pCPU。pCPU是CPU的一个逻辑核(core)或者一个超线程(开启超线程的情况下) 7、宽虚拟机是什么? 如果一个虚拟机的vCPU数量大于一个NUMA Node,这个虚拟机将被拆分成多个NUMA Client(可以理解为一个虚拟机里面的vCPU和内存的组合,这个组合将被分配到一个独立的单元,这个单元就叫做NMUA Clinent),这样的虚拟机叫做宽虚拟机。如下图

在一台ESXi主机上有两颗物理CPU(Socket)每颗物理CPU有8个逻辑核心(core)上创建一个包含10个vCPU的虚拟机,则这个虚拟机叫做宽虚拟机。这种情况下会存在vCPU跨NUMA Node访问内存的情况,这时会产生延时,影响虚拟机的性能。 敲重点:这 也是CPU数量不是越多越好的第二个原因 。另外在宽虚拟机创建的时候需要考虑虚拟机每个插槽的内核数,由于篇幅有限,本文不再进行阐述,需要了解的朋友可以参考https://blogs.vmware.com/performance/2017/03/virtual-machine-vcpu-and-vnuma-rightsizing-rules-of-thumb.html#comment-112552
总结 不知道上面这些有没有让朋友理解为什么CPU分配的不是越多越好,其实这只是两种最常见的原因,在申请虚拟机的时候建议尽量按照实际需求去申请,如果不知道需要多少,则按照最少申请原则去申请,在上线之前进行测试,根据测试结果进行调整。 题外话 这几年DevOps越来越火,开发运维一体化能大大减少沟通成本,提高工作效率。但是在实际落地的过程中,也会有不少的阻力,业务的需求,导致生产力的变革,生产力变革肯定会造成组织方式的变革。潮流不可阻挡,只能面对,是主动出击还是被动接受,是每位相关人员都应该思考的问题,希望有机会探讨DevOps在实际落地场景中,都带来了哪些变革。

    • -

备注: _1,文章仅供参考,具体情况还需具体分析。_ _2,图片来源网络,侵删。
参考文章:_ _《The CPU Scheduler in VMware vSphere 5.1》
《vSphere 监控和性能》_

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广