在管理内存资源之前,应当了解 ESXi 是如何虚拟化和使用这些内存资源的。

VMkernel 管理主机上所有物理内存。VMkernel 会将这种受管物理内存的一部分拿来自己使用。剩余的内存可供虚拟机使用。

虚拟和物理内存空间划分为块,块也称为页。当物理内存占满时,不在物理内存中的虚拟页的数据将存储到磁盘上。根据处理器架构的不同,页通常为 4 KB 或 2 MB。请参见高级内存属性

虚拟机内存

每个虚拟机均会根据其配置大小消耗内存,还会消耗额外开销内存以用于虚拟化。

配置大小是提供给客户机操作系统的内存量。这与分配给虚拟机的物理内存量不同。后者取决于主机上的资源设置(份额、预留和限制)和内存压力级别。

例如,请考虑配置大小为 1GB 的虚拟机。当客户机操作系统引导时,系统会检测到它正运行在具有 1 GB 物理内存的专用计算机上。有些情况下,可能向虚拟机分配全部内容(即 1GB)。在其他情况下,可能会得到较小的分配量。无论实际分配如何,客户机操作系统都会继续运行,就好像正运行在具有 1 GB 物理内存的专用计算机上一样。

份额
如果可用量超过预留,则会为虚拟机指定相对优先级。
预留
主机保证为虚拟机预留的物理内存量下限,即使内存过载也是如此。将预留设置为确保虚拟机高效运行的足够内存水平,这样就不会有过多的内存分页。

在虚拟机消耗其预留的全部内存后,会允许其保留该内存量,并且不会将该内存回收,即使该虚拟机闲置也是如此。某些客户机操作系统(例如 Linux)在引导之后可能不会立即访问所配置的全部内存。在虚拟机消耗其预留的全部内存之前,VMkernel 可以将其预留的任何未使用部分分配给其他虚拟机。但是,在客户机的工作负载增加并且虚拟机消耗其全部预留之后,允许其保留此内存。

限制
主机可分配给虚拟机的物理内存量的上限。虚拟机的内存分配还受其配置大小的隐式限制。

内存过载

对于每个正在运行的虚拟机,系统会为虚拟机的预留(如果有)和虚拟化开销预留物理内存。

所有虚拟机的已配置内存大小总量可能超过了主机上的可用物理内存量。但是,这并不一定意味着内存已过载。当所有虚拟机的组合工作内存占用超过主机内存大小的组合工作内存占用时,内存已过载。

由于 ESXi 主机使用内存管理技术,虚拟机可以使用的虚拟内存大于主机上可用的物理内存。例如,您有一个内存为 2 GB 的主机,其上运行四个虚拟机,每个虚拟机的内存为 1 GB。这种情况下,内存会过载。例如,如果所有 4 个虚拟机均闲置,则组合消耗内存可能远低于 2GB。但是,如果所有 4GB 虚拟机均主动消耗内存,则其内存占用可能超过 2GB,并且 ESXi 主机将过载。

过载有一定的意义,因为通常情况下有些虚拟机负载较轻,而有些虚拟机负载较重,相对活动水平会随着时间的推移而有所差异。

为了改善内存利用率,ESXi 主机将闲置虚拟机的内存转移给需要更多内存的虚拟机。使用“预留”或“份额”参数可优先向重要的虚拟机分配内存。如果这部分内存未使用,可以用于其他虚拟机。ESXi 实施了多种机制(如膨胀、内存共享、内存压缩和交换)来提供合理性能,即使主机尚未严重内存过载。

如果虚拟机在内存过载环境下消耗了所有可预留内存, ESXi 主机可能会内存不足。虽然已打开电源的虚拟机不受影响,但新虚拟机可能会由于内存不足而无法打开电源。
注: 所有虚拟机内存开销也被视为预留。

此外,ESXi 主机上默认还会启用内存压缩,以在内存过载时提高虚拟机性能,如内存压缩中所述。

内存共享

内存共享是一项专用的 ESXi 技术,有助于增加主机上的内存密度。

内存共享取决于以下观察结果:几个虚拟机可能正在运行同一客户机操作系统的多个实例。这些虚拟机可能已加载相同的应用程序或组件,或者包含公用数据。这些情况下,主机使用专用的透明页面共享 (TPS) 技术消除内存页的冗余副本。采用内存共享后,在虚拟机中运行的工作负载消耗的内存通常要少于其在物理机上运行时可能需要的内存。因此,可以高效地支持更高级别的超额分配。通过内存共享节省的内存量取决于工作负载是否由几乎相同的虚拟机组成,这些虚拟机可能会释放更多内存。如果工作负载差异较大,则可能会导致节省的内存百分比明显降低。

注:

出于安全考虑,默认情况下,虚拟机间透明页面共享处于停用状态,并且页面共享限于虚拟机内部内存共享。页面共享不能在多个虚拟机间进行,只能在虚拟机内部进行。有关详细信息,请参见在虚拟机之间共享内存

内存虚拟化

因为虚拟化引入了额外级别的内存映射,所以 ESXi可以跨所有虚拟机来管理内存。

虚拟机的一些物理内存可能映射到共享页面或未映射或换出的页面。

主机执行虚拟内存管理时无需了解客户机操作系统,也不会干涉客户机操作系统自身的内存管理子系统。

每个虚拟机的 VMM 保持了从客户机操作系统的物理内存页到基础计算机上物理内存页的映射。(VMware 将基础主机物理页称为“计算机”页,将客户机操作系统的物理页称为“物理”页。)

每个虚拟机均有连续的可寻址物理内存空间,该空间从零开始。每个虚拟机使用的服务器上的基础计算机内存不一定是连续的。

客户机虚拟地址到客户机物理地址的转换由客户机操作系统管理。管理程序仅负责将客户机物理地址转换为计算机地址。硬件辅助的内存虚拟化将利用硬件设施生成具有由管理程序维护的客户机页表和嵌套页表的组合映射。

该图说明了 ESXi如何实施内存虚拟化。

图 1. ESXi内存映射

此图说明了如何实施内存虚拟化。
  • 方框表示页,而箭头表示不同的内存映射。
  • 从客户机虚拟内存到客户机物理内存的箭头表示客户机操作系统中的页表所保持的映射。(未显示 x86 架构处理器从虚拟内存到线性内存的映射。)
  • 从客户机物理内存到计算机内存的箭头表示由 VMM 保持的映射。
  • 虚线箭头表示从客户机虚拟内存到计算机内存的映射,该映射也由 VMM 保持。运行虚拟机的基础处理器使用卷影页表映射。

硬件辅助的内存虚拟化

类似于 AMD SVM-V 和 Intel Xeon 5500 系列之类的部分 CPU 通过使用两层页表来提供对内存虚拟化的硬件支持。

注: 在本主题中,“内存”可以指物理内存或永久内存。

第一层页表存储客户机虚拟-物理转换,而第二层页表存储客户机物理-计算机转换。TLB(translation look-aside buffer,转换旁视缓冲区)是由处理器的内存管理单元 (MMU) 硬件维护的转换缓存。TLB 缺失是此缓存中的缺失,而且硬件需要访问内存(可能是多次)来查找所需转换。如果 TLB 中没有某个客户机虚拟地址,则硬件会查看这两个页表,将客户机虚拟地址转换成计算机地址。第一层页表由客户机操作系统维护。VMM 仅维护第二层页表。

性能注意事项

使用硬件辅助时,会消除软件内存虚拟化的开销。特别是,硬件辅助消除了使卷影页表与客户机页表保持同步所需的开销。但是,使用硬件辅助时 TLB 缺失延迟时间明显较长。默认情况下,管理程序在硬件辅助模式下使用大页以减少 TLB 缺失的成本。因此,工作负载是否受益于硬件辅助主要取决于在使用软件内存虚拟化时由内存虚拟化引起的开销。如果工作负载涉及少量页表活动(例如进程创建、映射内存或上下文切换),则软件虚拟化不会引起显著开销。相反,具有大量页表活动的工作负载可能会因使用硬件辅助而受益。

默认情况下,管理程序在硬件辅助模式下使用大页以减少 TLB 缺失的成本。通过在客户机虚拟到客户机物理以及客户机物理到计算机地址转换中使用大页,可以实现最佳性能。

LPage.LPageAlwaysTryForNPT 选项可以更改在客户机物理到计算机地址转换中使用大内存页的策略。有关详细信息,请参见高级内存属性

支持大内存页

ESXi 为大内存页提供有限的支持。

x86 架构允许系统软件使用 4KB、2MB 和 1GB 页面。我们将 4KB 页面称为小内存页,而将 2MB 和 1GB 页面称为大内存页。大内存页可缓解旁路转换缓冲 (TLB) 压力,降低页表遍历开销,从而提高工作负载的性能。

在虚拟化环境中,Hypervisor 和客户机操作系统可独立使用大内存页。虽然客户机和 Hypervisor 都使用大内存页时可实现最大的性能影响,但在大多数情况下,即使仅在 Hypervisor 级别使用大内存页也可以观察到性能影响。

默认情况下 ESXi Hypervisor 使用 2MB 页面来备份客户机 vRAM 。vSphere ESXi 支持使用 1 GB 页面备份客户机 vRAM,但提供的支持有限。有关详细信息,请参见使用 1GB 页面备份客户机 vRAM