1、内存管理的相关概念
在vSphere5.x中,内存管理分为3大类型,分别是:主机内存(HostMemory)、客户机内存(GuestMemory)和资源设置(ResourceSettings)。如图1所示:
图1
下面,分别介绍前面主机内存、客户机内存和资源设置所代表的意义:
已消耗(Consumed):表示在ESXiHost为VM分配的Total Memory中实际开销。
开销消耗(Overhead consumption):运行一个VM,ESXI Host生成一个VMM,而此部分就是VMM运行的开销,大小是浮动的,取决于VM的配置信息。
专用(Private):表示VM在ESXi Host上开销的实际物理内存数。
已共享(Shared):表示多台虚拟机通过TransparentPageSharing(TPS)共享的部分内存。
已交换(Swapped):表示由于内存资源不足导致的即将被Swapped out和被vmkernel回收的部分虚拟机物理内存。
已压缩(Compressed):表示vmkernel压缩后的虚拟机物理内存部分。
虚拟增长(Ballooned):是balloondriver从虚拟机操作系统回收的内存部分。
未访问过(Unaccessed):表示虚拟机OS里面,部分一直没有用到的内存,通常,在Ballooned时,这部分的内存就会被优先取走;
活动(Active):表示虚拟机系统里面,当前处于活动状态下的内存数。
预留(Reservation):指定了保证为虚拟机分配的最少资源量。预留的单位为 MB。如果无法满足预留,则无法打开虚拟机。
限制(Limit):该虚拟机的内存分配上限。选择无限可指定无上限。此值的单位为 MB。
份额(Configured):每个虚拟机都会授予许多内存份额。虚拟机具有的份额越多,其接收的主机内存份额越大。份额代表分配内存容量的相对度衡量指标(备注:低、正常、高和自定义)。
2、VMware vSphere内存管理技术概述
TransparentPageSharing(TPS):通过将相同部分虚拟机内存地址段映射到同一个物理内存地址,实现内存层面的消重,达到内存利用率提升的目的。
Memory Compression:通过压缩待被Swap Out的页面到Physical Memory Cache空间,实现提升虚拟机内存地址空间的物理利用率。
Balloon Driver:通过利用随VMware Tools安装到Virtual Guest OS里面的一个系统驱动,来实现从虚拟机OS里面回收Unused和Inactive部分内存,以便为ESXi提供更多for Virtual Machine用途的资源,用于支撑更多VMs或更高优先级VM的资源需求。
Swap Out:运行任何一台虚拟机时,都会随之伴生1个*.swap文件和1个vmx-*.swap文件,它相当于WindowsOS里面的Pagefile或Linux OS里面的Swap分区,用作物理内存不足时临时补充物理内存用,是一种物理内存的补充技术手段,为迫不得以情况下的最后变通手段。在vSphere5.1里,它由Host Swap和Swap两个部分构成,前者用于将Cache部分放置到Host的专有存储上(例如:SSD),用于提升性能。后者常规情况下和VMs存放在一起。
备注:关于VMware vSphere内存管理技术具体原理大约需要阅读15分钟,可选择阅读VMwarevSphere内存最佳配置实践。
3、VMware vSphere内存管理技术具体原理
3.1.Transparent Page Sharing(TPS)
正常情况下,运行单台虚拟机,例如下图2中的vcenter-vm01,它会消耗若干的地址段,例如下图2中的a、b、c、d、e、f、g之类的地址段。运行任何一台VM,都会有相同的情况出现, 例如下图2中的vcenter-vm01、vcenter-vm02和vcenter-vm03,都会消耗不同或相同的一批内存地址空间,每台VMs都会有a、b、c、d之类的地址空间消耗。本例中,通过分析下面的图2,可以得知,由于每台VM都是vcenter,它们运行相同的OS,因此,一定会有相同的地址。
图2
vcenter-vm01 - 它的LPN中,包含a、 b、 a、 c、 d、 b、 d,那么,体现到它的PPN,也就会对应生成a、 b、 a、 c、 d、 b、 d,如下图3所示:
图3
将PPN的内容体现到MPN时,在开启了TPS之后,它就会执行消重动作,将LPN >PPN > MPN中的相同地址段通过Hash计算后,指向MPN中同一个空间位置,因为相同的LPN或PPN都会有一个相同的hash值。本例中以a为例, Hash值为06af;同样的vcenter-vm02和vcenter-vm03也是一样。
TPS通过系列消重处理和Hash计算之后,3台VMs的内存消耗将为a、b、c、d、e、f、g,而在执行TPS消重之前,应该为a、a、a、a、b、b、b、b、b、b、c、d、d、d、e、f、g(如下图4),节省了3个a空间、5个b空间和2个d空间,变相节省了物理内存。TPS的消重,选用了透明页面共享技术,它通过将VMs相同的内存开销部分,映射到底层物理内存的相同位置,并且将这部分设为只读模式,提升了内存空间利用率。不过,如果当发生了内存地址变更时,则这个会自动在底层增加新的内存页面。因此,TPS的工作能力自然也是有限制的,毕竟不是所有地址页面都相同的,比如本例中就有a、b、c、d、e、f、g等页面。
图4
默认情况下,ESXi会开启TPS选项,当然,用户也可以根据需求自行选择是否进入到高级设置里关闭掉,但是TPS并不以牺牲性能为代价,所以,强烈建议保持默认开启。
如下图5所示,图中红色框选部分,就是TransparentPage Sharing在VMs上的体现:
图5
3.2.Memory Compression
图6
当启用了Memory Compression这种内存回收技术之后,系统会对计划被Swap Out到存储的 页面执行压缩动作。Memory Compression会首先将内存页面移动到位于ESXi主机上的单独Cache空间。在执行Memory Compression之前,ESXi系统会对所有页面进行检测,当它确认页面压缩比可以大于等50%时,系统会执行压缩动作。相反,如果经检测发现压缩比小于 50%时,系统将不对这部分页面执行压缩动作。主要注意的是,Memory Compression只针对计划Swap Out的页面执行压缩动作,其它的Active Memory页面将不会被压缩;只有当其它的内存回收技术无效的情况下,Memory Compression才会生效,在没有发生ESXi主机的Memory Overconmmit前,MemoryCompression是不会执行的,因此,当系统执行MemoryCompression时,必然是发生了MemoryOvercommitted的情况。
注意看看上面的配图6,大家可以看到,MemoryCompression的发生是在MPN,也就是物理内存地址区间上,包括Cache空间也是在物理内存区间上,虽然被压缩的是可能要被SwapOut到Disk上的内存页面,但是,毕竟这个页面还没有被Swapped Out。因此,整个过程都是发生在PhysicalMemory上的,那么,对于整体的性能影响,自然不会太大;不过,由于有一部分内存页面被压缩,因此,当这部分被压缩的页面如果发生了新的数据变化,比如:变化后的数据导致这部分页面的压缩比不再大于等50%时,系统会从Cache空间里解压缩这部分地址空间,恢复正常大小。由于这个部分的计算动作是CPU来完成的,因此,MemoryCompression自然会增大CPU的负担了,但是毕竟内存数据交换没有去到Storage层面,因此,虽然略有内存损耗,但是,依然无伤大雅。
如下图7所示,图中红色框选部分,就是MemoryCompression在VMs上的体现:
图7
3.3.Balloon Driver
和前两者不同的是,Balloon Driver这个内存回收机制的主力不是VMkernel,而是位于Virtual Machine OS里面的一个随着VMwareTools安装而潜伏的驱动,众所周知,驱动在OS里的优先级别最高,会被系统优先满足资源需求。所以,以驱动的形式存在的Balloon Driver将会在必要时,优先获得系统的资源倾斜。下图8是Balloon Driver的工作示意图:
图8
Ballooning的工作过程,大家可以看看上图8所示的从Inflate到Deflate过程中底层MPN和上层LPN于PPN之间的变化得出结论;简单描述而言,工作流程如下:
1. 首先,ESXi Host需要更多资源的时候,预先安装到VM理的Balloon Driver就会Inflate,告诉VM所在OS:它需要更多的内存资源用于驱动计算,前面我们说了,驱动在OS里的优先级最高,因此,系统不得不优先满足驱动的资源需求。那么,此时Guest OS就会尽可能调取资源来满足这个BalloonDriver的需求;
2. 问题就来了,Guest OS到底从哪里调取资源来满足BalloonDriver的资源请求呢?这就好比南水北调工程一样,如果南边压根没水,或者水资源本身就匮乏,那么,这个工程就没啥意义了,因为人家南边自己都缺水呢,调北方去那南边人自己就渴死了。因此, 调取资源也得有个地方去调取。此时,系统就会去检查在它上面所运行的App所开销 的物理内存中,哪些是Unused和Inactive的,委屈它们,把它们的内存调走来满足Balloon Driver的内存需求。问题是,这些A的内存即使是Unused或Inactive,那至少它也是需要象征性的存在的,那么,系统就会把被抽走部分的内存用Pagefile(Windows)或Swap(Linux)来代替,换句话说:此时,VM的内存有一部分是由交换文件,此时的VM内存 = Physical Memory + Swap File,表面上还是1G,实质上这1G = 256MB + 768MB。交换文件存放于VMDK里面,而VMDK存放在Storage上,因此,有一部分跑到磁盘上去了;
3. 当位于VM所在OS里的Balloon Driver拿到内存后,就会交还给ESXiHost,此时,ESXi Host的可支配内存就变多了,这个过程叫做Deflate。ESXi Host有更多可支配内存了,就可以开启更多的VMs或者满足优先级较高的VMs的内存资源请求了;
4、回顾整个过程,我们不难看到,Balloon Driver这种内存回收机制中,VM会和磁盘发生交集,因此,或多或少,还是会带来一些不好的影响;
另外,Balloon Driver也不是万能的,它不可能偷走VM所在OS的所有物理内存,缺省情况下, 它只能偷走最多65%的物理内存,可以通过调整高级参数保证它最多偷走VM所在OS 75%的物理内存,换句话说,VM所在OS的底线是:物理内存最少为25% ~ 35%。
如下图9所示,图中红色框选部分,就是BalloonDriver在VMs上的体现:
图9
3.4 Swap Out
这是最后的防线了,当TPS、Compression和Balloon都解决不了问题后,ESXi还提供了最后一种危机环境中的解决方案,也就是基于Hypervisor的Swapping技术,下图10是它的工作基础模型:
图10
通过TPS、Compression和Balloon等技术回收的内存总量依然无法满足vmkernel对于Physical Memory的需求时,为了解决最紧需要的内存资源,hypervisor会启swapping,来执行紧急内存回收。Swapping技术分为2个子分支:Host-Level SSD Swapping、Swap File。
Host-Level SSDSwapping存在的核心是解决Host Swap作为Cache Space的预分配空间使用,工作原理就是利用SSD高速访问性能,用于为同一台ESXi Host上的所有VMs建立起回写缓存空间。进而实现所有虚拟机共享相同的HostCache空间。管理员可以预先分配好Host-LevelSSD Swapping所需的空间;注意,Host-Level SSDSwapping和传统的基于SSD存放的Swap Files这种Datastore模式是不一样的,即使是系统激活了Host-Level SSD Swapping,每台运行状态的虚拟机一样会创建独立的Swap Files,只不过,当我们使用了SwapTo Host Cache这个功能时,虚拟机们的Swap Files所在的存储区间的性能影响不到这里就是了。
Swap File这个Swapping技术则是为每台VM单独创建2个Swap文件,分别为vmx-*.vswp和*.vswp,用于当VM的物理内存不足时,紧急状况下,临时顶替VM的物理内存工作。它的存在是因为在合理合法的模式下,TPS、Compression和Balloon所能做的事情都是有其局限性的。因此,为了解决紧急关头的资源调度,满足最最需要保障部分的资源需求,才有了Swap Out这个技术。换句话说,Swapped Out的出现,就意味着VMs的Active Memory会跑到Disk上,此时,必然会严重影响到VMs和Storage的性能,会导致整体环境的极大性能衰减。
4、VMwarevSphere内存最佳配置实践
4.1.不建议禁止掉TransparentPageSharing(TPS),默认是开启的。它会合理且无损性能的页面删重功能,既不会带来额外的开销,同时,也能极大的提升整体资源利用率。下图11是TPS的配置方式,参数:1表示开启,0表示关闭。
图11
4.2.不建议禁止掉Balloon Driver,默认是开启的。它可以实现合理、合法和有效的Virtual Guest OS里的资源快速回收。当然,务必安装VMwareTools给虚拟机,因为Balloon Driver技术的实现前提就是要有VMwareTools部署一个驱动到VMs里面。驱动名称如下图12所示:
图12
4.3.合理的分配好虚拟机的内存Limits和Reservations,因为虚拟机的内存分配工作的核心就是Reservations和Limits。如果这两个参数的分配失当,则可能导致ESXiHost还剩余大量的Host freememory的情况下Ballooning或Swapping提前发生。例如:当为某台VM的内存分配太小或为虚拟机的Reservation设定过大,都可能导致内存回收的提前激活。
4.4.ESXi Host Memory的大小应该大于GuestMemory Usage。例如:某台ESXi Host只有2GB的Memory,管理员却为虚拟机分配了3GB或4GB的Memory。因为,在这个场景下,Hypervisor会通过Ballooning和Swapping技术来执行内存回收,以保障有效物理内存,进而就会导致ESXiHost上所有VMs的整体性能下降。
- 本文固定链接: https://www.maimengkong.com/morejc/1904.html
- 转载请注明: : 萌小白 2025年4月2日 于 卖萌控的博客 发表
- 百度已收录