本文章整合了一下(vSphere&FusionSphere)内存的相关知识:
1.虚拟化CPU与VCPU关系
2.虚拟化的内存分配

1、vSphere 物理CPU与VCPU的关系
为方便识别虚拟的资源和物理(或叫真实的)资源,本人文章中以小写字母v前缀标识虚拟资源,小写字母p前缀标识物理资源。例如:

vCPU = 虚拟CPU
  pCPU = 物理CPU
  vRAM = 虚拟机的内存,也称之为Guest OS配置内存(Configured Size),或者说GOS的物理内存
  pRAM = 物理内存,也称机器内存(Machine Memory),或主机物理内存(Host Physical Memory)
  =========================================================================================================
  
  VM的内存资源分配,有3个可以配置的项:Limit,Reservation和Shares,如下:
 【Memory Limit】

Memory Limit,顾名思义,内存上限,就是Host可以分配给此VM的pRAM数的上限。

默认情况下是选中unlimited复选框的,也就是不设上限。不设上限不意味着没有上限,隐含的上限值是分配给VM的内存值。

Q: 什么情况下要设置Memory Limit呢?(或者说Memory Limt有什么好处?)

A: 一般情况下不用设置Memory Limt。

Limit通常用来管理用户预期。开始的时候,Host上的VM数量比较少,没有资源争用,因此VM的性能完全可以保证;随后,当一台又一台VM创建出来,对于资源的争用渐渐变的频繁起来。于是VM的性能下降了,用户便会产生抱怨。因此,设置limit可以从一开始就限定VM的性能,也就是让用户一开始就觉得他的VM就应该是这样的性能,当VM数量增加的时候,也不会感觉到性能的下降。当然,Memory Limit设置在什么数值比较合理应该具体情况具体分析。

那为啥不把VM的内存(Configured Size)设小呢?这也是考虑用户心理。有用户会觉得自己的应用就是需要4GB内存,虽然我们经过分析得出的结论是只需要1GB内存就够了,但是为了考虑用户的感受,就给他设置VM的内存为4GB,于是用户看见自己的OS显示有4GB内存,就很满意,但是他不知道的是我们给他的VM设置了1GB 的Memory Limt,这样,既保证了Host的资源可以更合理的利用,又让用户感到满意。

当用户的应用越来越频繁,其对内存的需求增加的时候,这时再来调整Memory limt,以满足其对性能的要求。调整Memory Limt无需停机,而如果开始时虚拟机的内存设的小了,此时调整内存数量就要停机了。设置Memory limt的好处就在于减少了不必要的downtime。

调整memory limit的动作,其实就是通知Hypervisor将某一VM可用的pRAM放大,而无需通知GOS,所以无需GOS重启。(简单的说,就是改Hypervisor,而和GOS无关)

专用名词解释 Configured Size

Configured Size可以翻译成配置内存,就是用户在创建一个VM的时候设定的内存值,也是Guest OS认为自己拥有的内存值。Configured Size在VM看来就是自己可用内存的总量,有的时候我们也称之为Guest Physical Memory。

【Memory Reservation】

Memory Reservation就是给一台VM保留的内存。这些pRAM将被占用,只能用于此VM,而不会被重新分配。VM默认的Memory Reservation是0,也就是不保留内存。如果给1台VM配置了1GB内存,但是Memory Reservation是默认的0MB,也就是说没有给这台VM分配任何专属的pRAM,那么这台VM的内存从哪里获得呢?答案是Swap(可以翻译为交换文件),也叫VMKernel swap,这是一个存放在硬盘资源上的交换文件(扩展名为vswp),这个swap文件大小在默认情况下等同于VM设定内存的大小。

所以,即使1台VM没有获得任何pRAM,它还是可以运行的,因为从VM Guest OS看来,自己还是有RAM的,这个RAM就是硬盘上的swap文件。

但是,我们知道,硬盘的访问是一种机械运动(注:非SSD硬盘情况下),速度要远远比物理内存慢。慢到什么程度呢?RAM速度大概是纳秒级的,而硬盘的速度是毫秒级的,2者相差近100万倍。所以使用swap越多,速度就越慢。对Windows Paging技术熟悉的同学们一定知道,缺少内存的电脑速度非常之慢,主要就是因为经常访问存放在硬盘上的pagefile,这种问题的解决方案就一定是添加物理内存。对于VM也是如此,如果大量使用swap,VM一定会显得非常之慢。

那么当ESX/ESXi还有可用内存的情况下,VM是不是还一定要用swap当内存呢?

答案是不用。Memory Reservation为0的VM没有专属的pRAM,但并不意味着这台VM没有物理内存可以用,只是没有独占某些物理内存而已,在共享物理内存池中的内存还是可以使用的。VMware ESX/ESXi在物理内存资源充足的情况下,总是会给VM分配足额的pRAM,因此VM无需使用Swap,这保证了VM的运行速度。比如1台可用物理内存是3GB(忽略COS和Hypervisor所占用的内存开销)的ESX/ESXi主机上,运行了2台VM,每台VM各配置了1GB的内存,此时,共享内存池中有3GB的内存,而实际需求只有2GB,因此2台VM都能获得1GB的pRAM。

当你给这2台VM各自的Memory Reservation都设置成512MB的时候,这2台VM将各自获得512MB的专属内存,也就是说,无论这2台VM是否实际用到了这512MB内存,这些内存都将保留给它们。此时,共享内存池中可用的内存就只有2GB了。

当获得了512MB专属内存之后,VM就不需要1GB那么大的swap了,而只需要512MB的swap就足够保证Guest OS不会没有内存可用。所以此时的swap大小就只有512MB。如果继续增大Memory Reservation到1GB,此时swap就为0。

所以VM内存1GB可能有:

  • 0MB的Memroy Reservation和1024MB的swap,或者
  • 512MB的Memory Reservation和512MB的swap,或者
  • 1024MB的Memory Reservation和0MB的swap。

因此我们总结出以下公式:

VM的配置内存 (MB) = Swap文件大小 (MB) + Memory Reservation (MB)

(注:原文可参《vSphere resource mgmt guide》 p31:“You must reserve swap space for any unreserved virtual machine memory (the difference between the reservation and the configured memory size) on per-virtual machine swap files.”)

Q: 为什么要配置Memory Reservation?
  A: 因为硬盘内存的速度太慢,而保留一些物理内存给VM可以保证该VM能至少拥有一部分高速的pRAM资源。

Q: 那么,是不是要给一台VM配置等于其内存大小的Memory Reservation呢?
  A: No,这是为什么呢?

这是因为Memory Reservation设的越大,可共享的内存池中的内存也就越少,可配置的VM数量就越少。

还是拿上面的例子来说,如果每台VM的Memory Reservation都是512MB的情况下,3GB的ESX/ESXi的主机最多只能配置6台VM(这是不考虑memory overhead的假想情况下,实践情况可能不到6台),如果Memory Reservation继续增加到每台VM 1GB,那就最多只能配置3台VM了。但是每台VM实际在用内存数可能都没那么多,假设每台VM在用内存的平均数只有256MB,这台主机应该可以运行12台VM,在做了Memory Reservation之后,就只能开启3台或者6台的VM了。

Q:Memory Reservation的那部分内存是不是其他VM就无法使用?
  A:不是绝对不能用。但是因为Memory Reservation部分的内存不能被reclaim,所以当1台VM开机的时候,如果当时使用的内存不到Memory reservation的大小,那多余的部分还是可以被其他VM用的;但是当此VM占用的内存达到过Memory Reservation的大小以后,这部分内存就不会交还到可以共享的内存pool中了,就不能再被其他VM用了。

【关于Swap的Q&A】

Q: Swap何时产生?何时消亡?
  A: swap文件在一台VM开机的时候生成,关机的时候被删除。

Q: VM开机时,存放位置没有足够的空间来放置Swap,会发生什么?
  A: VM无法开机。

Q: Swap的大小?
  A: Swap = VM Configured Memory Size – Memory Reservation

swap的大小是固定的,是静态的,是预先分配好空间的,既不会变大也不会缩小。即使VM从来不去用它,也牢牢霸占着磁盘空间。大多数情况下,swap的利用率很低。(swap利用率高了就意味着VM缺少pRAM,就要想办法调整内存设置,或者增加Host的物理内存,或者调整配置以满足VM需求)

Q: Swap的默认位置?
  A: 和VM的文件 e.g. VMX, VMDK等在同一目录下

Q: Swap的位置可以改变么?为什么?
  A: 可以改,但不建议改。

Swap的存放位置可以改到共享存储的另外的位置,或者Host本地存储的某个位置(Host-local方式)。但是Host-local有个缺点,就是会影响到VMotion的效率,因为在Host本地存储的Swap文件必须在VMotion的时候迁移到另外的主机上;而swap如果是在共享存储上的话,就不需要移动。

Q: Host-local Swap如何设置?如果修改默认swap位置到Host-local?
  A: 见vSphere Resouce Management Guide p31

关于host-local swap的更多精妙解释,强烈推荐您读以下Frank的这篇文章:http://frankdenneman.nl/2010/02/impact-of-host-local-vm-swap-on-ha-and-drs/

【Memory Shares】

Memory shares简单的说就是份额。当内存资源不足时,VM之间就会产生内存资源的争用。Share就是用来设定VM在争用时能够获得多少份额的内存。

还是拿前面的例子举例。3GB pRAM的ESX/ESXi主机上配置了2台VM,没有配置Reservation,当它们都只有1GB内存的时候,这1GB都可以使用pRAM,现在让我们把这2台VM的内存增加到2GB。现在内存需求的总量是4GB了,VMware将如何分配内存?

首先要明确的是,内存资源只有在争用的情况下才会用到share。上面2台VM虽然都分配了2GB vRAM,但是如果其应用还是都只用到1GB的话,此时没有争用发生,share也就没有发生作用。

当这2台VM都请求2GB内存的时候,就发生了争用。假设他们的share都是1000,那么也就是说,我们把可用内存3GB分成2000份,每台VM可以分到1000份。因此此时每台VM可以获得3GB*1000/2000=1.5GB的内存。

假设VM1用于开发,VM2用于生产,所以我们想把VM2的优先级别设高,便调整VM2的share为2000。此时VM1将获得3GB1000/(1000+2000)=1GB内存。而VM2将获得3GB2000/(1000+2000)=2GB的物理内存。

当我们调整VM1的share为500,VM2的share为2000. 此时,根据计算,VM2争用获得的内存是3GB2000/(500+2000)=2.4GB,而VM1将获得3GB500/(500+2000)=0.6GB。对吗?且慢,还记得内存limit隐含的上限是VM的配置内存吗?VM2只配置了2GB内存,因此最多只用到2GB内存。所以VM2还是只用2GB内存,剩下的1GB内存VM1可以占用。
  ==================================================================================================================================================================================================================
2、FusionSphere 物理CPU与VCPU的关系梳理总结
http://forum.huawei.com/enterprise/zh/forum.php?mod=viewthread&tid=322397

背景说明:
在项目和培训中多次被问题FusionSphere物理CPU和vCPU的对应或分配关系,一个物理CPU能虚拟出多少个vCPU,一个vCPU的主频是多少等问题。设置了CPU预留、份额与限制之后又是什么情况。
看过之前的一些讨论,也没有定论,本着实践是检验整理的唯一标准,本文通过实验,并对照相关文档来梳理这些问题,希望能让大家有更清楚的理解。

  1. 系统可用的VCPU总数计算

服务器CPU信息:
1台R2288H V3,2个CPU, 10 核,超线程为2。总共2x10x2= 40个thread,每个Thread 2.3GHz。
Haswell EP CPU 02311CDJ BC1M12CPU X86 series,2300**z,1.8V,64bit,105000mW,Haswell EP Xeon E5-2650 v3,10Core,with heatsink 2 2
服务器BMC管理界面上查看 CPU信息
在这里插入图片描述
http://ark.intel.com/products/81705/Intel-Xeon-Processor-E5-2650-v3-25M-Cache-2_30-GHz
在主机上部署FusionCompute R5C00, 登录CNA主机运行xentop命令查看CPU信息
CPUs:40 @ 2294 z,主频总容量为40 x 2.294 GHz = 91.76 GHz。
Domain 0默认配置2个VCPU,占用2 x 2.294 = 4.588 GHz
用户可用的主频总容量 = 91.76 - 4.588 = 87.172 GHz
在这里插入图片描述
结论1: 系统可用的vCPU总数(逻辑处理器) = Socket数(CPU个数)x Core数(内核)x Thread数(超线程)
1个VCPU = 1个超线程Thread。如下图:
在这里插入图片描述
CPU QoS
如图所示,CPU预留容量为4.59GHz,可用容量为82.58GHz,说明除了VRM01的2个VCPU预留容量4588
z之外的VCPU主频均是可用的,尽管该环境已创建了7台4 VCPU的VM,还可以创建更多VM,这些VM的VCPU总数可以远远超过当前系统显示可用的38个VCPU。

在不对VRM01的VCPU进行限制的情况下,将VCPU份额自定义为128000,显示可使用的CPU数为38,说明如果需要的话VRM01可以占用该主机上的除了Domain 0之外的所有VCPU(Domain 0占用了2个VCPU)。
在这里插入图片描述
2. 虚拟机VCPU的分配与调度
对虚拟机来说,不直接感知物理CPU,虚拟机的计算单元通过vCPU对象来呈现。虚拟机只看到VMM呈现给它的vCPU。在VMM中,每个vCPU对应一个VMCS(Virtual-Machine Control Structure)结构,当VCPU被从物理CPU上切换下来的时候,其运行上下文会被保存在其对应的VMCS结构中;当VCPU被切换到PCPU上运行时,其运行上下文会从对应的VMCS结构中导入到物理CPU上。通过这种方式,实现各vCPU之间的独立运行。

从虚拟机系统的结构与功能划分可以看出,客户操作系统与虚拟机监视器共同构成了虚拟机系统的两级调度框架,如图所示是一个多核环境下虚拟机系统的两级调度框架。客户操作系统负责第2 级调度,即线程或进程在vCPU 上的调度(将核心线程映射到相应的VCPU上)。虚拟机监视器负责第1 级调度, 即vCPU在物理处理单元上的调度。两级调度的调度策略和机制不存在依赖关系。vCPU调度器负责物理处理器资源在各个虚拟机之间的分配与调度,本质上即把各个虚拟机中的vCPU按照一定的策略和机制调度在物理处理单元上可以采用任意的策略来分配物理资源, 满足虚拟机的不同需求。vCPU可以调度在一个或多个物理处理单元执行(分时复用或空间复用物理处理单元), 也可以与物理处理单元建立一对一固定的映射关系(限制访问指定的物理处理单元)。

在这里插入图片描述
3. CPU QoS说明
Hypervisor层根据分时复用的原理实现对VCPU的调度,CPU QoS的原理是定期给各VCPU分配运行时间片,并对各VCPU运行的时间进行记账,对于消耗完时间片的虚拟CPU将被限制运行,直到获得时间片。以此控制虚拟机获得物理计算资源的比例。以上分配时间片和记账的时间周期很短,对虚拟机用户来说会感觉一直在运行。
CPU预留定义了分配给该VM的最少CPU资源。
CPU限制定义了分配虚拟机占用CPU资源的上限。
CPU份额定义多个虚拟机在竞争CPU资源的时候按比例分配。
CPU份额只在各虚拟机竞争计算资源时发挥作用,如果没有竞争,有需求的虚拟机可以独占主机的物理CPU资源。
如果虚拟机根据份额值计算出来的计算能力小于虚拟机预留值,调度算法会优先按照虚拟机预留值分配给虚拟机,对于预留值超出按份额分配的计算资源的部分,调度算法会从主机上其他虚拟机的CPU上按各自的份额比例扣除。
如果虚拟机根据份额值计算出来的计算能力大于虚拟机预留值,那么虚拟机的计算能力会以份额值计算为准。
以一台主频为2800**z的单核物理机为例,如果满负载运行3台单VCPU的虚拟机A、B、C,分配情况如下。
在这里插入图片描述
结论2:由于采用分时复用的方式,在不做VCPU预留的条件下,系统可分配给VM的VCPU总数远远大于实际可提供的VCPU数目(具体能创建多少额外的VCPU依赖于物理CPU的性能和VCPU的使用情率),在出现资源争用的时根据CPU QoS中的预留和份额来分配资源。

============================================================================================================================================

FusionCloud云计算vCPU资源计算公式(MHz)
http://forum.huawei.com/enterprise/zh/forum.php?mod=viewthread&tid=301167

vCPU 资源 = 物理CPU个数 * 物理CPU核数 * 单核线程数 * CPU频率

举例:1个CPU,双核,每核2个线程,3.0GHz,那么vCPU资源 = 1 * 2 * 2 * 3.0GHz = 12GHz = 12000MHz。

FusionCompute发放虚拟机流程中可对CPU资源进行限制,有2个重要参数:
份额预留:分配的vCPU资源最小值
份额限制:分配的vCPU资源最大值

份额预留<=份额限制

只有将份额预留选最大值时,vCPU独占1个物理CPU线程

举例:创建1台2U2G的虚拟机,份额预留最大值为 2 * 3000MHz = 6000MHz。

虚拟化场景,重载,许多情况下1台虚拟机每vCPU独占1个物理CPU线程。因此,为了云计算工程师快速方便估算物理服务器可承载的虚拟机数量,可认为1个物理CPU线程 = 1个vCPU。

举例1:虚拟化场景,10台服务器,每台服务器2路8核2.8GHz的CPU,提供的vCPU个数 = 10 * 2 * 8 * 2 = 320个vCPU,可承载2U2G的虚拟机160个。

举例2:虚拟化场景,10台服务器,每台服务器2路8核2.8GHz的CPU,提供的vCPU资源 = 10 * 2 * 8 * 2 * 2.8GHz = 896GHz,可承载2个vCPU 2.8GHz的虚拟机160个。

桌面云场景,重载,许多情况下每个物理CPU核可承载5台虚拟机,因此,为了云计算工程师快速方便估算物理服务器的虚拟机密度,可认为 1个物理核 = 5个虚拟机。

举例:桌面云场景,10台服务器,每台服务器2路8核2.8GHz的CPU,虚拟机密度 = 10 * 2 * 8 * 5 = 800 个虚拟机。

总结:
虚拟化场景:1个物理CPU线程 = 1个vCPU
桌面云场景:1个物理核 = 5个虚拟机

说明:上述场景的计算方法仅供快速估算,准确vCPU个数、虚拟机密度与CPU型号、频率、domain0规格、虚拟机规格强相关,需要进行详细分析和计算

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐