XenServer

虚拟机内存

创建虚拟机时,会为虚拟机分配固定量的内存。您可以使用动态内存控制 (DMC) 来提高 XenServer® 环境中物理内存的利用率。DMC 是一种内存管理功能,可实现虚拟机之间内存的动态重新分配。

XenCenter 在其“内存”选项卡中提供内存使用情况的图形显示。有关详细信息,请参阅XenCenter 文档

动态内存控制 (DMC) 具有以下优点:

  • 您可以在不重启虚拟机的情况下添加或删除内存,从而为用户提供无缝体验。

  • 当主机已满时,DMC 允许您在这些主机上启动更多虚拟机,从而按比例减少分配给正在运行的虚拟机的内存量。

什么是动态内存控制 (DMC)?

XenServer DMC 通过自动调整正在运行的虚拟机的内存来工作,将分配给每个虚拟机的内存量保持在指定的最小和最大内存值之间,从而保证性能,并允许每个主机具有更高的虚拟机密度。

如果没有 DMC,当主机已满时,启动额外的虚拟机将因“内存不足”错误而失败。要减少现有虚拟机的内存分配并为更多虚拟机腾出空间,请编辑每个虚拟机的内存分配,然后重新启动虚拟机。使用 DMC 时,XenServer 会尝试通过在其定义的内存范围内自动减少正在运行的虚拟机的当前内存分配来回收内存。即使主机已满,XenServer 也会尝试回收内存。

注意:

具有虚拟 GPU 的虚拟机不支持动态内存控制。

动态范围的概念

对于每个虚拟机,管理员都可以设置一个动态内存范围。动态内存范围是指可以在不重启虚拟机的情况下添加/删除内存的范围。当虚拟机正在运行时,管理员可以调整动态范围。XenServer 始终保证将分配给虚拟机的内存量保持在动态范围内。因此,在虚拟机运行时调整它可能会导致 XenServer 调整分配给虚拟机的内存量。最极端的情况是管理员将动态最小值/最大值设置为相同的值,强制 XenServer 确保将此内存量分配给虚拟机。如果需要在“已满”主机上启动新虚拟机,则正在运行的虚拟机的内存会被“挤压”以启动新虚拟机。所需的额外内存是通过在其预定义的动态范围内按比例挤压现有正在运行的虚拟机来获得的。

DMC 允许您配置动态最小和最大内存级别,从而创建虚拟机运行的动态内存范围 (DMR)。

  • 动态最小内存:您分配给虚拟机的内存下限。

  • 动态上限:您分配给虚拟机的内存上限。

例如,如果动态最小内存设置为 512 MB,动态最大内存设置为 1,024 MB,则虚拟机的动态内存范围 (DMR) 为 512–1024 MB,虚拟机在此范围内运行。使用 DMC 时,XenServer 保证始终在指定 DMR 范围内为每个虚拟机分配内存。

静态范围的概念

XenServer 支持的许多操作系统无法完全“理解”动态添加或删除内存的概念。因此,XenServer 必须在虚拟机重新启动时声明虚拟机需要使用的最大内存量。声明最大内存量可让客户操作系统相应地调整其页表和其他内存管理结构的大小。这引入了 XenServer 中的静态内存范围概念。静态内存范围在虚拟机运行时无法调整。对于特定引导,动态范围受到限制,使其始终包含在此静态范围内。静态最小值(静态范围的下限)可保护管理员,并设置为操作系统在 XenServer 中可以运行的最低内存量。

注意:

我们建议您不要更改静态最小值,因为静态最小值是根据每个操作系统支持的级别设置的。有关详细信息,请参阅内存限制表。

将静态最大级别设置为高于动态最大级别,允许您将来为虚拟机分配更多内存,而无需重新启动虚拟机。

DMC 行为

自动虚拟机压缩

  • 如果未启用 DMC,当主机已满时,新的虚拟机启动将因“内存不足”错误而失败。

  • 启用 DMC 后,即使主机已满,XenServer 也会尝试通过减少正在运行的虚拟机在其定义的动态范围内的内存分配来回收内存。通过这种方式,主机上的所有虚拟机都会在动态最小值和动态最大值之间以相同的距离按比例压缩。

启用 DMC 时

  • 当主机的内存充足时 - 所有正在运行的虚拟机都将获得其动态最大内存级别

  • 当主机的内存稀缺时 - 所有正在运行的虚拟机都将获得其动态最小内存级别。

配置 DMC 时,请记住,仅为虚拟机分配少量内存可能会对其产生负面影响。例如,分配过少的内存会导致:

  • 使用动态内存控制来减少 VM 可用的物理内存量可能会导致其重新启动缓慢。同样,如果您为 VM 分配的内存过少,它也可能启动缓慢。

  • 将 VM 的动态内存最小值设置得过低可能会导致 VM 启动时性能不佳或出现稳定性问题。

DMC 如何工作?

使用 DMC,可以使客户虚拟机在以下两种模式之一中运行:

  1. 目标模式: 管理员为客户机指定一个内存目标。XenServer 会调整客户机的内存分配以达到该目标。指定目标在虚拟服务器环境中以及在您确切知道希望客户机使用多少内存的情况下非常有用。XenServer 会调整客户机的内存分配以达到您指定的目标。

  2. 动态范围模式: 管理员为客户机指定一个动态内存范围。XenServer 会从该范围中选择一个目标,并调整客户机的内存分配以达到该目标。在任何您希望 XenServer 动态重新分区主机内存以响应客户机数量变化或主机内存压力变化的情况下,指定动态范围都非常有用。XenServer 会从该范围中选择一个目标,并调整客户机的内存分配以达到该目标。

注意:

对于任何正在运行的客户机,可以随时在目标模式和动态范围模式之间切换。指定一个新的目标或新的动态范围,XenServer 会处理其余部分。

内存限制

XenServer 允许管理员对任何客户操作系统使用所有内存控制操作。但是,XenServer 对所有客户机强制执行以下内存属性排序约束:

0 < memory-static-min <= memory-dynamic-min <= memory-dynamic-max <= memory-static-max

XenServer 允许管理员将客户机内存属性更改为满足此约束的任何值,但需经过验证检查。但是,除了上述约束之外,我们仅支持每个受支持操作系统的某些客户机内存配置。支持的配置范围取决于所使用的客户操作系统。XenServer 不会阻止管理员将客户机配置为超出支持的限制。但是,建议客户将内存属性保持在支持的限制内,以避免性能或稳定性问题。有关每个受支持操作系统的最小和最大内存限制的详细指南,请参阅客户操作系统支持

警告:

配置客户机内存时,我们建议不要超过您的操作系统可寻址的最大物理内存量。设置的内存最大值超过操作系统支持的限制可能会导致客户机内部出现稳定性问题。

对于所有受支持的操作系统,动态最小值必须至少是静态最大值的 75%。较低的限制可能会导致稳定性问题。建议管理员仔细校准其 VM 的大小,并确保其应用程序的工作集在动态最小值下可靠运行。

xe CLI 命令

显示 VM 的静态内存属性

  1. 查找所需 VM 的 UUID:

    xe vm-list
    <!--NeedCopy-->
    
  2. 记下 UUID,然后运行命令 param-name=memory-static

    xe 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

  1. 查找所需 VM 的 UUID:

    xe vm-list
    <!--NeedCopy-->
    
  2. 记下 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-->

注意:

  • 要为虚拟机分配一个不变的特定内存量,请将动态最大值和动态最小值设置为相同的值。
  • 您不能将虚拟机的动态内存增加到超出静态最大值。
  • 要更改虚拟机的静态最大值,您必须关闭虚拟机。

更新单个内存属性

警告:

请勿更改静态最小值,因为它已根据每个操作系统设置为支持的级别。有关更多信息,请参阅内存限制

更新虚拟机的动态内存属性。

  1. 查找所需虚拟机的 UUID:

    xe vm-list
    <!--NeedCopy-->
    
  2. 记下 UUID,然后使用命令 memory-dynamic-{min,max}=value

    xe 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-->
虚拟机内存