XenServer

VM 内存

在创建 VM 时,会为 VM 分配固定的内存量。可以使用动态内存控制 (DMC) 提高您的 XenServer 环境中的物理内存利用率。DMC 是用于在 VM 之间动态重新分配内存的内存管理功能。

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

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

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

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

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

XenServer DMC 的工作原理如下:自动调整正在运行的 VM 的内存,使分配给每个 VM 的内存量保持在指定的最小内存值与最大内存值之间,确保性能并允许每个主机具有更大的 VM 密度。

如果没有 DMC,则当主机满载时,启动其他 VM 会失败并显示“内存不足”错误。要减少现有 VM 内存分配,为更多 VM 预留空间,请编辑每个 VM 的内存分配,然后重新启动 VM。使用 DMC 时,XenServer 可通过在 VM 定义的内存范围内自动减少正在运行的 VM 的当前内存分配来尝试回收内存。即使主机已满载,XenServer 也会尝试回收内存。

备注:

配备了虚拟 GPU 的 VM 不支持动态内存控制功能。

动态范围的概念

对于每个 VM,管理员可以设置一个动态内存范围。动态内存范围是指可以在 VM 中添加/删除内存而无需重新启动 VM 的范围。当 VM 运行时,管理员可以调整动态范围。XenServer 始终保证为 VM 分配的内存量保持在动态范围内。因此,在 VM 运行时调整动态范围可能会导致 XenServer 调整分配给 VM 的内存量。最极端的情况是管理员将动态最小/最大内存设置为相同值,从而强制 XenServer 确保为 VM 分配此内存量。如果需要在满载的主机上启动新 VM,则正在运行的 VM 会腾出自己的内存以启动新的 VM。获取所需的额外内存的方法是:在正在运行的现有 VM 的预定义动态范围内按比例腾出内存

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

  • 动态最小内存:分配给 VM 的内存下限。

  • 动态上限:分配给 VM 的内存上限。

例如,如果最小动态内存设置为 512 MB,最大动态内存设置为 1024 MB,则 VM 的动态内存范围 (DMR) 为 512 -1024 MB,VM 将在此范围内运行。使用 DMC 时,XenServer 可确保始终为每个 VM 分配指定 DMR 范围内的内存量。

静态范围的概念

XenServer 支持的许多操作系统不完全“理解”动态添加或删除内存的概念。因此,XenServer 必须声明 VM 在重新启动时需要占用的最大内存量。声明最大内存量允许来宾操作系统相应调整其页表及其他内存管理结构的大小。这在 XenServer 中引入了静态内存范围的概念。静态内存范围无法在 VM 运行时进行调整。对于特定引导,动态范围受到限制,例如始终限制在此静态范围内。静态最小内存(静态范围的下限)可保护管理员,并设置为操作系统可以在 XenServer 上运行时占用的最小内存量。

注意:

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

将静态最大级别设置为高于动态最大级别后,您以后为 VM 分配更多内存时,无需重新启动 VM。

DMC 行为

VM 自动腾出内存

  • 如果未启用 DMC,则当主机满载时,新 VM 会因“内存不足”错误而导致启动失败。

  • 启用了 DMC 时,即使在主机满载时,XenServer 仍会尝试在正在运行的 VM 的规定动态范围内减少其内存分配来回收内存。这样,正在运行的 VM 在动态最小内存与动态最大内存之间以相同的间距按比例为主机上的所有 VM 腾出内存

启用了 DMC 时

  • 主机内存足够时 - 正在运行的所有 VM 都将达到其动态最大内存级别

  • 主机内存不足时 - 正在运行的所有 VM 都将达到其动态最小内存级别。

配置 DMC 时,请记住,只将少量内存分配给 VM 会对其造成负面影响。例如,分配过少内存:

  • 使用动态内存控制减少 VM 可用的物理内存量可能会导致 VM 重新启动缓慢。同样,如果为 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 的静态最大内存为 268435456 字节 (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 的动态最大内存为 134217728 字节 (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-->

备注:

  • 要为 VM 分配不会变化的特定内存量,请将动态最大内存和动态最小内存设置为相同值。
  • 不能将 VM 的动态内存增加到超过静态最大内存。
  • 要更改某个 VM 的静态最大内存,必须关闭该 VM。

更新各个内存属性

警告:

请勿更改静态最小级别,因为此级别设置为每个操作系统支持的级别。有关详细信息,请参阅内存限制

更新 VM 的动态内存属性。

  1. 查找所需 VM 的 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-->
VM 内存