VM 内存
创建 VM 时,会为该 VM 分配固定量的内存。您可以使用动态内存控制 (DMC) 来提高 XenServer® 环境中物理内存的利用率。DMC 是一种内存管理功能,可实现 VM 之间内存的动态重新分配。
XenCenter 在其内存选项卡中提供内存使用情况的图形显示。有关详细信息,请参阅 (/zh-cn/xencenter/current-release/vms-memory.html)。
动态内存控制 (DMC) 具有以下优点:
-
您可以在不重新启动 VM 的情况下添加或删除内存,从而为用户提供无缝体验。
-
当主机已满时,DMC 允许您在这些主机上启动更多 VM,从而按比例减少分配给正在运行的 VM 的内存量。
什么是动态内存控制 (DMC)?
XenServer DMC 通过自动调整正在运行的 VM 的内存来工作,将分配给每个 VM 的内存量保持在指定的最小和最大内存值之间,从而保证性能并允许每个主机上更高的 VM 密度。
如果没有 DMC,当主机已满时,启动额外的 VM 将因“内存不足”错误而失败。要减少现有 VM 内存分配并为更多 VM 腾出空间,请编辑每个 VM 的内存分配,然后重新启动 VM。使用 DMC 时,XenServer 会尝试通过在其定义的内存范围内自动减少正在运行的 VM 的当前内存分配来回收内存。即使主机已满,XenServer 也会尝试回收内存。
注意:
具有虚拟 GPU 的 VM 不支持动态内存控制。
动态范围的概念
对于每个 VM,管理员可以设置一个动态内存范围。动态内存范围是指可以在不要求重新启动的情况下从 VM 添加/删除内存的范围。当 VM 正在运行时,管理员可以调整动态范围。XenServer 始终保证将分配给 VM 的内存量保持在动态范围内。因此,在 VM 运行时调整它可能会导致 XenServer 调整分配给 VM 的内存量。最极端的情况是管理员将动态最小值/最大值设置为相同的值,强制 XenServer 确保将此内存量分配给 VM。如果需要在“已满”主机上启动新的 VM,则会“挤压”正在运行的 VM 的内存以启动新的 VM。所需的额外内存是通过在其预定义的动态范围内按比例挤压现有正在运行的 VM 来获得的
DMC 允许您配置动态最小和最大内存级别 – 创建 VM 运行的动态内存范围 (DMR)。
-
动态最小内存:您分配给 VM 的较低内存限制。
-
动态上限:您分配给虚拟机的内存上限。
例如,如果动态最小内存设置为 512 MB,动态最大内存设置为 1,024 MB,它会为虚拟机提供一个 512–1024 MB 的动态内存范围 (DMR),虚拟机在此范围内运行。使用 DMC 时,XenServer 保证始终在每个虚拟机指定的 DMR 范围内分配内存。
静态范围的概念
XenServer 支持的许多操作系统无法完全“理解”动态添加或删除内存的概念。因此,XenServer 必须在虚拟机重新启动时声明虚拟机被要求消耗的最大内存量。声明最大内存量允许客户操作系统相应地调整其页表和其他内存管理结构的大小。这引入了 XenServer 中静态内存范围的概念。静态内存范围在虚拟机运行时无法调整。对于特定的引导,动态范围受到限制,使其始终包含在此静态范围之内。静态最小值(静态范围的下限)用于保护管理员,并设置为操作系统在 XenServer 上运行时所需的最低内存量。
注意:
我们建议您不要更改静态最小值,因为静态最小值是根据每个操作系统支持的级别设置的。有关详细信息,请参阅内存限制表。
将静态最大值设置得高于动态最大值,允许您将来在不重新启动虚拟机的情况下为虚拟机分配更多内存。
DMC 行为
自动虚拟机压缩
-
如果未启用 DMC,当主机已满时,新的虚拟机启动将因“内存不足”错误而失败。
-
启用 DMC 后,即使主机已满,XenServer 也会尝试通过在其定义的动态范围内减少正在运行的虚拟机的内存分配来回收内存。通过这种方式,主机上所有正在运行的虚拟机都会在动态最小值和动态最大值之间以相同的距离按比例压缩。
启用 DMC 时
-
当主机的内存充足时 - 所有正在运行的虚拟机都将获得其动态最大内存级别
-
当主机的内存稀缺时 - 所有正在运行的虚拟机都将获得其动态最小内存级别。
配置 DMC 时,请记住,仅为虚拟机分配少量内存可能会对其产生负面影响。例如,分配过少的内存可能会导致:
-
使用动态内存控制减少虚拟机可用的物理内存量可能会导致其重启缓慢。同样,如果为虚拟机分配的内存过少,它也可能启动缓慢。
-
将虚拟机的动态内存最小值设置得过低,可能会导致虚拟机启动时性能不佳或出现稳定性问题。
DMC 如何工作?
使用 DMC,可以通过以下两种模式之一操作客户虚拟机:
-
目标模式: 管理员为客户机指定一个内存目标。XenServer 会调整客户机的内存分配以达到该目标。在虚拟服务器环境以及您确切知道希望客户机使用多少内存的情况下,指定目标非常有用。XenServer 会调整客户机的内存分配以达到您指定的目标。
-
动态范围模式: 管理员为客户机指定一个动态内存范围。XenServer 会从该范围中选择一个目标,并调整客户机的内存分配以达到该目标。在您希望 XenServer 能够根据客户机数量的变化或主机内存压力的变化动态重新分配主机内存的任何情况下,指定动态范围都非常有用。XenServer 会从该范围中选择一个目标,并调整客户机的内存分配以达到该目标。
注意:
对于任何正在运行的客户机,可以随时在目标模式和动态范围模式之间切换。指定一个新的目标或一个新的动态范围,XenServer 会处理其余部分。
内存限制
XenServer 允许管理员对任何客户操作系统使用所有内存控制操作。但是,XenServer 对所有客户机强制执行以下内存属性排序约束:
0 < memory-static-min <= memory-dynamic-min <= memory-dynamic-max <= memory-static-max
XenServer 允许管理员将客户机内存属性更改为满足此约束的任何值,但需经过验证检查。然而,除了上述约束之外,我们仅支持每个受支持操作系统的某些客户机内存配置。支持的配置范围取决于所使用的客户操作系统。XenServer 不会阻止管理员将客户机配置为超出支持的限制。但是,建议客户将内存属性保持在支持的限制范围内,以避免性能或稳定性问题。有关每个受支持操作系统的最小和最大内存限制的详细指南,请参阅客户操作系统支持。
警告:
配置客户机内存时,我们建议不要超过操作系统可寻址的最大物理内存量。将内存最大值设置得高于操作系统支持的限制可能会导致客户机内部出现稳定性问题。
对于所有受支持的操作系统,动态最小值必须至少是静态最大值的 75%。较低的限制可能导致稳定性问题。建议管理员仔细校准其虚拟机的大小,并确保其应用程序的工作集在动态最小值下可靠运行。
xe CLI 命令
显示 VM 的静态内存属性
-
查找所需 VM 的 UUID:
xe vm-list <!--NeedCopy--> -
记下 uuid,然后运行命令
param-name=memory-staticxe vm-param-get uuid=uuid param-name=memory-static-{min,max} <!--NeedCopy-->例如,以下显示了 UUID 以 ec77 开头的 VM 的静态最大内存属性:
xe vm-param-get uuid= \ ec77a893-bff2-aa5c-7ef2-9c3acf0f83c0 \ param-name=memory-static-max; 268435456 <!--NeedCopy-->该示例显示此 VM 的静态最大内存为 268,435,456 字节 (256 MB)。
显示 VM 的动态内存属性
要显示动态内存属性,请按照上述步骤操作,但使用命令 param-name=memory-dynamic:
-
查找所需 VM 的 UUID:
xe vm-list <!--NeedCopy--> -
记下 uuid,然后运行命令
param-name=memory-dynamic:xe vm-param-get uuid=uuid param-name=memory-dynamic-{min,max} <!--NeedCopy-->例如,以下显示了 UUID 以 ec77 开头的 VM 的动态最大内存属性
xe vm-param-get uuid= \ ec77a893-bff2-aa5c-7ef2-9c3acf0f83c0 \ param-name=memory-dynamic-max; 134217728 <!--NeedCopy-->该示例显示此 VM 的动态最大内存为 134,217,728 字节 (128 MB)。
更新内存属性
警告:
设置静态/动态最小/最大参数时,请使用正确的顺序。此外,您不得违反以下约束:
0 < memory-static-min <= memory-dynamic-min <= memory-dynamic-max <= memory-static-max
更新虚拟机的静态内存范围:
xe vm-memory-static-range-set uuid=uuid min=value max=value
<!--NeedCopy-->
更新虚拟机的动态内存范围:
xe vm-memory-dynamic-range-set \
uuid=uuid min=value \
max=value
<!--NeedCopy-->
在虚拟服务器环境中,以及在任何您确切知道希望访客使用多少内存的情况下,指定目标都非常有用。XenServer 会调整访客的内存分配以满足您指定的目标。例如:
xe vm-memory-target-set target=value vm=vm-name
<!--NeedCopy-->
更新虚拟机的全部内存限制(静态和动态):
xe vm-memory-limits-set \
uuid=uuid \
static-min=value \
dynamic-min=value \
dynamic-max=value static-max=value
<!--NeedCopy-->
注意:
- 要为虚拟机分配一个不变的特定内存量,请将动态最大值和动态最小值设置为相同的值。
- 您不能将虚拟机的动态内存增加到超过静态最大值。
- 要更改虚拟机的静态最大值,您必须关闭虚拟机。
更新单个内存属性
警告:
请勿更改静态最小值,因为它已根据每个操作系统设置为支持的级别。有关更多信息,请参阅内存限制。
更新虚拟机的动态内存属性。
-
查找所需虚拟机的 UUID:
xe vm-list <!--NeedCopy--> -
记下 UUID,然后使用命令
memory-dynamic-{min,max}=valuexe vm-param-set uuid=uuid memory-dynamic-{min,max}=value <!--NeedCopy-->
以下示例将动态最大值更改为 128 MB:
xe vm-param-set uuid=ec77a893-bff2-aa5c-7ef2-9c3acf0f83c0 memory-dynamic-max=128MiB
<!--NeedCopy-->