VMware ESXi 虚拟机内存管理全解析
在虚拟化环境中,内存是虚拟机(VM)运行的关键资源之一 。很多时候,内存会首先受到限制,因此了解虚拟机内存的分配和管理至关重要。
虚拟机内存分配基础
当通过 Web 客户端创建新虚拟机时,系统会根据所选的客户操作系统(如 Windows Server 2008 R2)建议一个默认的内存值。在这个界面分配的内存量,就是客户操作系统能看到的内存量。例如,分配 4096MB 内存,安装 Windows Server 2008 R2 后,系统会报告安装了 4096MB 的 RAM。这就如同在物理系统中安装四根 1024MB 的内存条一样,该虚拟机最多只能使用 4096MB 的物理 RAM。
假设一个 ESXi 主机有 16GB 的物理 RAM 可用于运行虚拟机。创建一个配置为 4GB 内存的新虚拟机后,还会剩余约 12GB 供其他虚拟机使用。但如果再运行三个同样配置为 4GB 内存的虚拟机,此时四个虚拟机将占用全部 16GB 内存,ESXi 主机就会面临内存不足的问题。
那如果再启动第五个虚拟机呢?答案是可以运行。这得益于一些先进的技术,使得管理员能够超额分配内存,即给虚拟机分配的内存超过 VMware ESXi 主机实际安装的内存。
ESXi 高级内存管理技术
VMware ESXi 支持多种高级内存管理技术,使其成为市场上唯一能以与客户操作系统无关的方式进行内存超额分配的商用虚拟机管理程序。这些技术包括:
1.
空闲内存税(Idle Memory Tax)
:在 ESXi 主动采取措施缓解内存压力之前,会通过对空闲内存“收费”,确保虚拟机不会过度占用内存。最多可借用每个虚拟机分配内存的 75% 来服务其他虚拟机。该设置可在虚拟机的高级设置中进行配置,但通常情况下,除非有特定需求,否则不建议这样做。在客户操作系统内部,VMware Tools 会使用其气球驱动程序来识别已分配但空闲的内存块,以便将其用于其他地方。
2.
透明页面共享(Transparent Page Sharing)
:ESXi 通过计算内存页面内容的哈希值来识别相同的内存页面。如果找到匹配的哈希值,会进一步比较页面以排除误判。确认页面相同后,会透明地重新映射虚拟机的内存页面,使它们共享相同的物理内存页面,从而减少主机的内存消耗。通常,ESXi 在 4KB 的内存页面上工作,并对所有页面使用透明页面共享。但当利用 CPU 中的硬件卸载功能(如 Intel 扩展页表(EPT)硬件辅助或 AMD 快速虚拟化索引(RVI)硬件辅助)时,会使用 2MB 的大页面。在这种情况下,ESXi 不会共享大页面,但会为大页面内的 4KB 页面计算哈希值。当需要进行交换时,大页面会被拆分为小页面,预先计算的哈希值可使 ESXi 在页面交换出去之前进行页面共享。
3.
气球技术(Ballooning)
:气球驱动程序是 VMware Tools 的一部分,安装在客户操作系统中。当 ESXi 主机物理内存不足时,虚拟机管理程序会向气球驱动程序发送信号,使其向客户操作系统请求内存,这个过程称为膨胀。气球驱动程序将获得的内存返回给虚拟机管理程序,供其他虚拟机使用。当主机内存压力缓解时,气球驱动程序会收缩,将内存返回给客户操作系统。使用特定于客户操作系统的气球驱动程序的好处是,允许客户操作系统决定哪些页面可以提供给气球驱动程序,从而在某些情况下,不会降低虚拟机的性能。
4.
内存压缩(Memory Compression)
:从 vSphere 4.1 开始,VMware 引入了内存压缩技术。当 ESXi 主机需要进行虚拟机管理程序交换时,VMkernel 会尝试压缩内存页面,并将其保留在压缩内存缓存中。如果页面能成功压缩至少 50%,则会放入压缩内存缓存,而不是写入磁盘。当客户操作系统需要这些内存页面时,可以更快地恢复。内存压缩可以显著减少必须交换到磁盘的页面数量,从而提高内存压力较大的 ESXi 主机的性能。默认情况下,用于压缩缓存的虚拟机内存配置量为 10%,但该值从 0 开始,随着虚拟机内存开始交换而按需增长。只有当 ESXi 主机需要进行 VMkernel 交换时,才会调用压缩功能。
5.
交换(Swapping)
:在 VMware ESXi 中,有两种交换形式。一种是客户操作系统交换,即虚拟机内的客户操作系统根据自身的内存管理算法将页面交换到虚拟磁盘。这通常是由于内存需求高于可用内存导致的。另一种是虚拟机管理程序交换,当上述技术无法有效减少客户操作系统的内存使用时,ESXi 主机将被迫将内存页面交换到磁盘以回收内存。虚拟机管理程序交换会严重影响客户操作系统的性能,因为磁盘响应时间比内存响应时间慢数千倍。因此,ESXi 只有在万不得已时才会调用交换功能。
控制内存分配
为了更精细地控制 ESXi 如何分配内存,管理员可以使用以下三种机制:
1.
编辑步骤
:
- 使用 Web 客户端连接到 vCenter Server 实例。
- 导航到“主机和集群”或“虚拟机和模板”视图,然后通过清单找到要编辑的虚拟机。
- 选择虚拟机,并在内容区域中选择“编辑设置”选项。
- 在“虚拟硬件”选项卡上,点击 CPU 或内存项旁边的三角形。
- 根据需要调整“份额”、“预留”和“限制”值。
技术名称
作用
空闲内存税
防止虚拟机过度占用空闲内存,可借用部分内存服务其他虚拟机
透明页面共享
通过共享相同内存页面减少主机内存消耗
气球技术
在主机内存不足时,回收客户操作系统的空闲内存
内存压缩
压缩内存页面,减少交换到磁盘的页面数量
交换
在其他技术无法满足需求时,将内存页面交换到磁盘
mermaid 流程图如下:
graph LR
A[创建虚拟机] --> B{内存是否足够}
B -- 是 --> C[正常运行]
B -- 否 --> D[使用高级内存技术]
D --> E{是否需要交换}
E -- 是 --> F[进行交换]
E -- 否 --> G[继续运行]
这些高级内存管理技术虽然允许 ESXi 为虚拟机分配比物理服务器实际内存更多的内存,但并不能保证内存或对内存访问进行优先级排序。因此,管理员需要使用预留、限制和份额这三种机制来控制虚拟机对内存的访问和使用。接下来,我们将详细介绍这些机制的具体应用。
VMware ESXi 虚拟机内存管理全解析
使用内存预留
在虚拟机设置中指定的内存预留量,是 ESXi 主机为使虚拟机开机必须提供给该虚拟机的实际物理内存量。默认情况下,内存预留为 0MB,这意味着 ESXi 主机无需为虚拟机提供任何物理内存。在没有预留的情况下,VMkernel 可以选择从 VMkernel 交换中为虚拟机提供内存。
VMkernel 交换是 ESXi 采用的一种虚拟机管理程序交换机制,实现为一个扩展名为 .vswp 的文件,在虚拟机开机时创建。默认情况下,这些每个虚拟机的交换文件与虚拟机的配置文件和虚拟磁盘文件位于同一数据存储位置。在没有内存预留的默认配置下,该文件的大小将等于为虚拟机配置的 RAM 量。
理论上,虚拟机可以完全从 VMkernel 交换(即磁盘)获取其内存分配,但这会导致虚拟机性能下降,因为磁盘访问时间比 RAM 访问时间慢几个数量级。例如,假设 RAM 访问时间为 10 纳秒,SSD 寻道时间为 500 微秒,旋转磁盘寻道时间为 8 毫秒,那么 RAM 比传统旋转磁盘快 800,000 倍,比 SSD 快 50,000 倍。
当为虚拟机设置内存预留时,情况会有所不同。例如,为一个配置了 4GB RAM 的虚拟机设置 1,024MB 的内存预留,那么 ESXi 主机在启动该虚拟机时必须至少提供 1,024MB 的物理 RAM。主机可以从物理 RAM 或 VMkernel 交换中提供剩余的 3,072MB RAM。同时,ESXi 会将 VMkernel 交换文件的大小减少预留的量。
使用内存预留的好处是,在 ESXi 主机运行的虚拟机数量超过其实际可用 RAM 时,能确保虚拟机至少有一些高速内存可用。但也有缺点,如果每个虚拟机都设置了 1,024MB 的预留,而主机只有 8GB 的可用 RAM 用于运行虚拟机,那么只能同时启动八个虚拟机。
此外,需要注意的是,内存预留是在虚拟机的客户操作系统请求内存时按需分配的。一旦分配,这部分内存就会锁定给该虚拟机,不会通过气球驱动程序回收,也不会交换到磁盘或压缩。不过,预留内存可以通过透明页面共享进行共享,透明页面共享不会影响预留内存的可用性。
使用内存限制
默认情况下,新创建的虚拟机没有内存限制,即创建时分配的初始 RAM 量就是其有效限制。设置内存限制的目的是规定虚拟机可以使用的实际物理 RAM 量。
例如,一个配置了 4,096MB RAM 的虚拟机,设置了 1,024MB 的内存预留和 2,048MB 的内存限制。那么,ESXi 主机必须为该虚拟机分配 1,024MB 的物理 RAM,这部分 RAM 是保证给该虚拟机的。在主机有足够物理 RAM 可用的情况下,虚拟机管理程序会按需为虚拟机分配内存,直到达到 2,048MB 的限制。当达到限制时,气球驱动程序会启动,防止客户操作系统使用超过 2,048MB 的内存。当客户操作系统的内存需求下降到 2,048MB 以下时,气球驱动程序会收缩并将内存返回给客户操作系统。
内存限制的一个关键问题是,它们在客户操作系统不知情的情况下强制执行。如果虚拟机配置了 4GB 的 RAM,而客户操作系统认为自己有 4GB 的 RAM 可用,但实际设置了 2GB 的限制,那么当客户操作系统及其应用程序的工作集大小超过内存限制时,会导致虚拟机性能下降,因为客户操作系统会不断将页面交换到磁盘。
因此,一般来说,内存限制应作为临时措施使用,当需要减少 ESXi 主机的物理内存使用,并且可以接受性能的负面影响时才考虑使用。不建议长期为虚拟机过度配置 RAM 并通过限制来约束内存使用。
使用内存份额
内存份额是 VMware 中的一种比例份额系统,用于在 ESXi 主机出现物理 RAM 争用时为虚拟机分配资源优先级。只有当 ESXi 主机无法满足虚拟机的内存请求时,份额才会发挥作用。如果主机有足够的空闲内存,份额不会起作用。
例如,有两个虚拟机(VM1 和 VM2),都有 1,024MB 的预留和 4,096MB 的最大配置,运行在一个可供虚拟机使用的 RAM 少于 2GB 的 ESXi 主机上。如果两个虚拟机的份额相等(假设各为 1,000),那么当它们请求超过预留值的内存时,每个虚拟机将从 ESXi 主机获得相等数量的 RAM。如果将 VM1 的份额设置为 2,000,那么 VM1 获得的份额是 VM2 的两倍。当它们请求超过预留值的 RAM 时,VM1 每获得两个 RAM 页面,VM2 只能获得一个。VM1 将获得可用内存的 67%,VM2 获得 33%。
即使不专门为虚拟机分配份额,VMware vSphere 在创建虚拟机时也会自动分配份额。默认情况下,每分配给虚拟机 1MB 的内存,就会授予 10 个份额。例如,一个配置了 4,096MB RAM 的虚拟机,其默认内存份额值为 40,960。
随着更多虚拟机在同一 ESXi 主机上运行,预测每个虚拟机的实际内存利用率和访问量会变得更加困难。后续可以使用资源池为一组虚拟机分配内存限制、预留和份额,这将在“使用资源池”部分详细讨论。
检查内存开销
在使用 ESXi 时,还需要考虑内存开销。ESXi 主机上的几个基本进程会消耗主机内存,包括 VMkernel 本身、运行在 ESXi 主机上的各种守护进程(服务)以及每个运行的虚拟机。每个虚拟机开机所需分配的 RAM 量取决于其虚拟 CPU 和内存配置。以下是 vSphere 5.5 版本的虚拟机内存开销示例(值已四舍五入到最接近的整数):
虚拟内存分配 (MB)
1 vCPU
2 vCPUs
4 vCPUs
8 vCPUs
256
20 MB
20 MB
32 MB
48 MB
1,024
26 MB
30 MB
38 MB
54 MB
4,096
49 MB
53 MB
61 MB
77 MB
16,384
140 MB
144 MB
152 MB
169 MB
在规划虚拟机的内存分配时,务必牢记这些内存开销数字,并将其包含在计算中。
mermaid 流程图如下:
graph LR
A[内存分配决策] --> B{是否设置预留}
B -- 是 --> C[按预留分配物理内存]
B -- 否 --> D[考虑 VMkernel 交换]
C --> E{是否设置限制}
E -- 是 --> F[按限制控制内存使用]
E -- 否 --> G[按需分配到最大配置]
F --> H{是否有内存争用}
H -- 是 --> I[按份额分配内存]
H -- 否 --> J[正常运行]
D --> K{内存是否足够}
K -- 是 --> L[正常运行]
K -- 否 --> M[使用高级内存技术]
综上所述,VMware ESXi 的内存管理涉及多种技术和机制。通过合理运用空闲内存税、透明页面共享、气球技术、内存压缩和交换等高级内存管理技术,以及预留、限制和份额等控制机制,并考虑内存开销,管理员可以更高效地管理 ESXi 主机上的内存资源,确保虚拟机的稳定运行和性能优化。