使用 vSphere Client,可以查看有关内存分配设置的信息并对其进行更改。为了有效管理内存资源,还必须熟悉内存开销、闲置内存消耗以及 ESXi 主机回收内存的方式。
当管理内存资源时,可以指定内存分配。如果未自定义内存分配,则 ESXi 主机使用适合大多数情况下的默认值。
可以通过几种方式指定内存分配。
- 使用可通过 vSphere Client 访问的属性和特殊功能。通过 vSphere Client,可以连接到 ESXi 主机或 vCenter Server 系统。
- 使用高级设置。
- 将 vSphere SDK 用于脚本式内存分配。
了解内存开销
内存资源的虚拟化会涉及一些相关开销。
ESXi 虚拟机可以引起两种内存开销:
- 在虚拟机内访问内存所需的额外时间。
- 超出向每个虚拟机分配的内存后,ESXi 主机自身代码和数据结构所需的额外空间。
ESXi 内存虚拟化向内存访问添加很少的时间开销。因为处理器分页硬件直接使用页表(基于软件的卷影页表方法或硬件辅助的两级页表方法),所以虚拟机中的大多数内存访问在执行时没有地址转换开销。
内存空间开销有两部分:
- VMkernel 系统范围内的固定开销。
- 每个虚拟机的额外开销。
开销内存包括为虚拟机框架缓冲区和各种虚拟化数据结构(如卷影页表)预留的空间。开销内存取决于虚拟 CPU 数量以及为客户机操作系统配置的内存。
虚拟机上的开销内存
要打开虚拟机电源,需要一定数量的可用开销内存。您应当了解此开销量。
虚拟机所需的开销内存量取决于多种因素,包括 vCPU 数量和内存大小、设备数量和类型、监控器使用的执行模式以及虚拟机的硬件版本。您使用的 vSphere 版本也会影响所需的内存量。VMX 将自动计算虚拟机所需的开销内存量。
要了解特定配置所需的开销内存量,请先打开相应虚拟机的电源。查看 vmware.log 文件。打开虚拟机电源后,所需的开销内存量会打印到该日志。在该日志中搜索 VMMEM 以查看为虚拟机预留的初始和精确开销内存量。
ESXi 主机如何分配内存
主机将由 Limit 参数指定的内存分配给每个虚拟机,除非内存过载。ESXi 向虚拟机分配的内存决不会超过指定的物理内存大小。
例如,1 GB 虚拟机可能具有默认的限制(无限)或用户指定的限制(例如 2 GB)。在这两种情况下,ESXi 主机分配的内存决不会超过 1 GB,即不会超过为其指定的物理内存大小。
当内存过载时,向每个虚拟机分配的内存量介于预留和限制指定的内存量之间。授予虚拟机的高于预留量的内存量会因当前的内存负载而异。
主机根据分配给虚拟机的份额数和对最近工作集大小的估计,确定每个虚拟机的分配量。
- 份额 — ESXi 主机使用经过修改的按比例份额内存分配策略。内存份额给予虚拟机一部分可用物理内存。
- 工作集大小 — ESXi 主机通过在连续的虚拟机执行时间周期监控内存活动,来估计工作集。采用快速响应工作集大小增加且慢速响应工作集大小减小的技术,在几个时间周期内进行平稳估计。
该方法确保虚拟机开始更活跃地使用其内存时,已经回收闲置内存的虚拟机可以快速达到基于完整份额的分配量。
在默认情况下将对内存活动监控 60 秒以估计工作集大小。要修改此默认值,请调整 Mem.SamplePeriod 高级设置。请参见设置高级主机属性。
闲置虚拟机的内存消耗
如果虚拟机未在使用当前为其分配的所有内存,则 ESXi 对闲置内存的消耗量大于对正在使用的内存的消耗量。这样有助于防止虚拟机累积闲置内存。
闲置内存消耗以渐进方式应用。随着虚拟机闲置内存与活动内存的比率的提高,有效消耗率将增加。(在不支持分层资源池的早期版本 ESXi 中,虚拟机的所有闲置内存是以同等比率消耗的。)
可以使用 Mem.IdleTax 选项来修改闲置内存消耗率。使用该选项以及 Mem.SamplePeriod 高级属性可控制系统如何确定虚拟机的目标内存分配。请参见设置高级主机属性。
VMX 交换文件
使用虚拟机可执行 (VMX) 交换文件,主机可大幅减少为 VMX 进程预留的开销内存量。
ESXi 出于多种原因预留每个虚拟机的内存。打开虚拟机电源时,将完全预留特定组件(如虚拟机监控程序 (VMM) 和虚拟设备)所需的内存。但可以交换为 VMX 进程预留的一些开销内存。VMX 交换功能大大减少了 VMX 内存预留(例如,从每个虚拟机大约 50 MB 或更多减少为每个虚拟机大约 10 MB)。这样可在主机内存过载时换出剩余内存,从而减少了每个虚拟机的开销内存预留。
如果打开虚拟机电源时有足够的可用磁盘空间,主机便可自动创建 VMX 交换文件。
内存回收
ESXi 主机可以从虚拟机中回收内存。
主机会将预留功能指定的内存量直接分配给虚拟机。超出预留的任何部分都使用主机的物理资源进行分配,如果物理资源不可用,则使用膨胀或交换等特殊技术进行处理。主机可使用两种技术来动态增加或减少分配给虚拟机的内存量:
- ESXi 系统使用已加载到虚拟机中所运行的客户机操作系统的内存气球驱动程序 (
vmmemctl
)。请参见内存气球驱动程序。 - ESXi 系统将分页从虚拟机换出到服务器交换文件,无需客户机操作系统参与。每个虚拟机均有自己的交换文件。
内存气球驱动程序
内存气球驱动程序 (vmmemctl
) 与服务器协作回收客户机操作系统认为最不重要的页面。
该驱动程序使用专用膨胀技术,提供在类似的内存限制下与本机系统的行为极为相近的可预测性能。该技术可增加或减少客户机操作系统的内存压力,使得客户机能够使用自己的本机内存管理算法。当内存很紧张时,客户机操作系统决定要回收哪些页面,并在必要时将这些页面换到自己的虚拟磁盘上。
如有必要,可以通过为特定虚拟机设置 sched.mem.maxmemctl 参数,限制由 vmmemctl
回收的内存量。该选项指定了可以从虚拟机中回收的最大内存量,以兆字节 (MB) 为单位。请参见设置高级虚拟机属性。
在虚拟机之间共享内存
许多 ESXi 工作负载存在跨虚拟机(以及在单个虚拟机中)共享内存的机会。
ESXi 内存共享作为后台活动运行,随着时间的推移而扫描共享机会。节省的内存量随着时间而变化。对于相当固定的工作负载,在使用所有共享机会之前,内存量一般会缓慢增加。
要确定给定工作负载内存共享的有效性,请尝试运行工作负载,并使用 resxtop
或 esxtop
观察实际节省的内存量。此信息可在“内存”页面中交互模式的 PSHARE
字段中找到。
使用 Mem.ShareScanTime 和 Mem.ShareScanGHz 高级设置可控制系统扫描内存以确定内存共享机会的速率。
还可以通过设置 sched.mem.pshare.enable 选项为单个虚拟机配置共享。
出于安全考虑,默认情况下,虚拟机间透明页面共享处于停用状态,并且页面共享限于虚拟机内部内存共享。这意味着页面共享不会在多个虚拟机间出现,而是仅发生在虚拟机内部。为帮助解决系统管理员对透明页面共享所造成安全影响可能存在的疑问,我们引入了盐的概念。通过使用盐,可以前所未有的方式更加细化地管理参与透明页面共享的虚拟机。在新的盐设置中,仅当页面的加密盐值和内容完全相同时,虚拟机才可共享页面。新主机配置选项 Mem.ShareForceSalting 可配置为激活或停用撒盐加密。
有关如何设置高级选项的信息,请参见vSphere中的高级属性。
内存压缩
ESXi 提供内存压缩缓存,可在内存超额分配使用时改进虚拟机性能。内存压缩默认处于激活状态。当主机内存超额分配时,ESXi 会压缩虚拟页面并将其存储在内存中。
由于访问压缩的内存比访问交换到磁盘的内存更快,因此通过 ESXi 中的内存压缩可以使内存超额分配,但不会显著影响性能。当需要交换虚拟页面时,ESXi 会首先尝试压缩虚拟页面。可压缩至 2 KB 或更小的页面存储在虚拟机的压缩缓存中,从而增加主机的容量。
使用 vSphere Client 中的“高级设置”对话框,您可以设置压缩缓存的最大大小和停用内存压缩。
激活或停用内存压缩缓存
内存压缩默认处于激活状态。您可以使用 vSphere Client 中的“高级系统设置”来激活或停用主机的内存压缩。
过程
- 在 vSphere Client 中,浏览到主机。
- 单击配置。
- 在系统下,选择高级系统设置。
- 找到“Mem.MemZipEnable”,然后单击编辑按钮。
- 输入 1 和 0 可分别激活和停用内存压缩缓存。
- 单击确定。
设置内存压缩缓存的最大大小
您可以设置主机虚拟机的内存压缩缓存的最大大小。
您可以将压缩缓存的大小设置为虚拟机的内存大小百分比。例如,如果输入 20 并且虚拟机的内存大小为 1000 MB,则 ESXi 最多可使用 200 MB 的主机内存来存储虚拟机的已压缩页面。
如果您未设置压缩缓存的大小,ESXi 会使用默认值 10%。
过程
衡量和区分各种内存使用情况
vSphere Client 的性能选项卡将显示可用于分析内存使用情况的多个衡量指标。
某些内存衡量指标用于衡量客户机物理内存,而另一些衡量指标用于衡量计算机内存。例如,可以使用性能衡量指标检查的两种内存使用情况是客户机物理内存和计算机内存。可以使用“已分配的内存”衡量指标(对于虚拟机)或“共享的内存”(对于主机)衡量客户机物理内存。但是,要衡量计算机内存,需要使用“消耗的内存”(对于虚拟机)或“共享的公用内存”(对于主机)。了解这些类型的内存使用情况之间的概念性差异对知道这些衡量指标的衡量对象以及如何对其进行解释十分重要。
VMkernel 会将客户机物理内存映射到计算机内存,但是它们不总是一对一映射。它可能会将客户机物理内存的多个区域映射到计算机内存的同一区域(当存在内存共享时),或者可能不会将客户机物理内存的特定区域映射到计算机内存(当 VMkernel 换出或膨胀客户机物理内存时)。在这些情况中,单个虚拟机或主机的客户机物理内存使用情况和计算机内存使用情况的计算有所不同。
请考虑下图中的示例,该图中显示了在一台主机上运行的两台虚拟机。每块代表 4 KB 内存,每个颜色/字母代表相应块上的数据集。
可以按照如下方式确定虚拟机的性能衡量指标:
- 要确定虚拟机 1 的“已分配的内存”(映射到计算机内存的客户机物理内存量),请计算虚拟机 1 的客户机物理内存中的块(含有指向计算机内存的箭头)的数量并乘以 4 KB。由于有 5 个块含有箭头,因此“已分配的内存”是 20 KB。
- “消耗的内存”是分配给虚拟机的计算机内存量,包括从共享的内存中节省的内存量。首先,计算计算机内存中的块(含有从虚拟机 1 的客户机物理内存指出的箭头)的数量。这样的块有三个,但有一个块与虚拟机 2 共享。因此,计算两个完整的块加上半个第三个块并乘以 4 KB,得到总计 10 KB 的“消耗的内存”。
- 主机的“共享的内存”是每个虚拟机“共享的内存”的总和。通过查看每个虚拟机的客户机物理内存并计算含有指向计算机内存块(计算机内存块本身也含有多个指向自己的箭头)的箭头的块数量,可计算共享的内存。在本示例中,这样的块有六个,因此主机的“共享的内存”是 24 KB。
- “共享的公用内存”是由虚拟机共享的计算机内存量。要确定公用内存,请查看计算机内存,并计算有多个箭头指向自身的块数量。这样的块有三个,因此“共享的公用内存”是 12 KB。
用于衡量客户机物理内存和计算机内存的内存衡量指标可能会出现矛盾。事实上,它们衡量的是虚拟机内存使用情况的不同方面。通过了解这些衡量指标之间的差异,可以更好地利用它们来诊断性能问题。
内存可靠性
通过内存可靠性(也称为错误隔离),ESXi 可在其确定故障可能出现时以及已出现故障时停止使用部分内存。
在特定地址报告了足够的已更正错误时,ESXi 会停止使用该地址阻止已更正错误成为未更正的错误。
内存可靠性提高了 VMkernel 可靠性,与 RAM 中更正的和未更正的错误无关。通过内存可靠性,系统还可避免使用可能包含错误的内存页。
更正错误隔离通知
借助内存的可靠性,VMkernel 可停止使用接收错误隔离通知的页面。
当 VMkernel 从不可更正的内存错误中恢复,VMkernel 因大量可更正错误而注销显著比例的系统内存,或者存在大量无法注销的页面时,用户会在 vSphere Client 中收到事件。
过程
- 腾出主机。
- 迁移虚拟机。
- 运行内存相关的硬件测试。
系统交换
系统交换是一种内存回收过程,可以利用整个系统内未使用的内存资源。
系统交换允许系统从内存使用者处(非虚拟机)回收内存。启用系统交换后,需要在回收其他进程内存的影响与将内存分配给可使用它的虚拟机的能力之间进行权衡。系统交换所需的空间量为 1 GB。
内存的回收通过将数据移出内存并写入后台存储实现。从后台存储访问数据的速度比从内存访问数据的速度慢,因此一定要仔细选择存储交换数据的位置。
ESXi 可自动确定系统交换应存储到的位置,这是首选交换文件位置。选择某一组选项可帮助确定存储位置。系统会选择最可行的选项。如果任何选项都不可行,则不会激活系统交换。
可用选项包括:
- 数据存储 - 允许使用指定的数据存储。请注意,无法为系统交换文件指定 vSAN 数据存储或 VMware vSphere® Virtual Volumes™ 数据存储。
- 主机交换缓存 - 允许使用部分主机交换缓存。
- 首选交换文件位置 - 允许使用为主机配置的首选交换文件位置。
配置系统交换
您可自定义用于确定系统交换位置的选项。
前提条件
在编辑系统交换设置对话框中选中已启用复选框。
过程
- 在 vSphere Client 中,浏览到主机。
- 单击配置。
- 在系统下,选择系统交换。
- 单击编辑。
- 选中要启用的每个选项对应的复选框。
- 如果选择数据存储选项,请从下拉菜单中选择一个数据存储。
- 单击确定。