怀德维宁

大邦维屏,大宗维翰。怀德维宁,宗子维城。

0%

【翻译】libvirt虚拟机xml配置文件格式(7)Memory Allocation、Memory Backing和Memory Tuning

原文网址:https://libvirt.org/formatdomain.html#id8

Memory Allocation

<domain>
  ...
  <maxMemory slots='16' unit='KiB'>1524288</maxMemory>
  <memory unit='KiB'>524288</memory>
  <currentMemory unit='KiB'>524288</currentMemory>
  ...
</domain>

memory

boot时虚拟机的最大分配内存。内存分配包含了在启动时或在之后热插拔的全部可能的额外内存设备。该值的单位由可选属性项unit设置,默认以KiB为单位(kibibytes,2^10或1024字节块)。有效的单位还有b或byte代表字节,KB代表kilobytes(10^3或1000字节),k或KiB代表kibibytes(1024字节)。MB代表megabytes(10^6或1000000字节),M或MiB代表 mebibytes(2^20或1048576字节),GB代表gigabytes(10^9或1000000000字节),T或TiB代表tebibytes(2^40或1099511627776字节).然而,该值会被libvirt四舍五入到最近的kibibytes,也可能进一步四舍五入到虚拟机管理程序支持的粒度。一些虚拟机管理程序也会强制设置一个最小值,例如4000KiB。这种情况下,虚拟机配置的numa的memory元素会被忽略。如果发生crash,可选属性项dumpCore可用来控制是否将虚拟机内存包含在生成的coredump文件中(属性值为on和off)。unit自0.9.11起,dumpCore自0.10.2起(仅限于qemu)。

maxMemory

运行时虚拟机的最大内存分配。被numa的memory元素或者numa cell大小配置的初始内存可通过内存热插拔方式增长到该元素限制的最大内存大小。unit属性项与memory中的同名属性项表现完全一致。slots属性项指定了将内存添加到虚拟机时可用slot的数量。数量上下限与虚拟机管理程序有关。注意由于内存对齐的限制,通过内存条热插拔所获得的完整内存大小可能无法达到该元素的设置值。自1.2.14起在qemu中支持。

currentMemory

虚拟机真实分配的内存。该值小于最大分配数值,允许动态扩充虚拟机内存。如果未设置该项,则默认与memory元素具有同样的数值设置。unit属性项与memory中的unit作用一致。

Memory Backing

<domain>
  ...
  <memoryBacking>
    <hugepages>
      <page size="1" unit="G" nodeset="0-3,5"/>
      <page size="2" unit="M" nodeset="4"/>
    </hugepages>
    <nosharepages/>
    <locked/>
    <source type="file|anonymous|memfd"/>
    <access mode="shared|private"/>
    <allocation mode="immediate|ondemand" threads='8'/>
    <discard/>
  </memoryBacking>
  ...
</domain>

可选元素项memoryBacking包含多个影响主机内存页备份虚拟内存的元素项。

hugepages

该元素项告知虚拟机管理程序虚拟机使用大页而非通常的主机内存页大小进行内存分配。自1.2.5起。可以为每个numa节点详尽的设置大页。page元素项被引入。其包含一个强制属性项size用于指定具体使用哪些大页(在支持不同大小大页的系统中尤其有用)。size属性项的默认单位是kilobytes(1024的整数倍)。如果想要使用不同的单位,可使用可选属性项unit。对于numa系统,可选的nodeset属性可能会派上用场,因为它将给定虚拟机的NUMA节点与某些大页大小相关联。在某些例子中,除了4#节点之外的其他numa节点都使用了1G大小的大页。相关语法可以查看NUMA Node Tuning章节。

nosharepages

告知虚拟机管理程序虚拟机禁用共享内存页(内存合并,ksm)。自1.0.6起。

locked

当虚拟机管理程序支持并设置相关数值后,虚拟机内存页将会在主机内存中锁定,而且主机也不会将其换出,这在某些工况下如实时场景中是十分必要的。对于QEMU/KVM虚拟机,qemu进程自身使用的内存也会被锁定;与虚拟机内存不同,libvirt无法提前获取相应内存的数量,所以必须移除对于锁定内存的限制。因此,启用该可选元素项存在潜在的安全风险;当主机内存耗尽时主机无法从虚拟机回复内存,这就意味着大量的虚拟机将会造成大量内存被锁定,主机上会遭受到拒绝服务攻击。因为该原因,除非确实需要否则不建议使用该元素项;即便如此,强烈推荐为特定环境的内存分配设置 hard_limit属性项(参阅Memory Tuning章节),这可以有效的缓解上述描述的风险的发生。自1.0.6起。

source

使用type属性项,可提供“file”以利用文件内存备份或保持默认的”anonymous”。自4.10.0起,也可选择memfd备份。(仅限于QEMU/KVM)

access

使用mode属性项,指明内存是shared还是private。该元素会被每个numa节点的memAccess元素覆盖。

allocation

使用可选属性项mode,通过提供”immediate”或”ondemand”参数指明何时进行内存分配。自8.2.0起。也可以通过threads属性设置虚拟机管理程序用来进行内存分配的线程数量。

discard

当虚拟机管理程序支持并设置该元素时,在虚拟机关机之前(或当DIMM模块被拔出时)内存内容被丢弃。注意这仅仅只是一个优化项,并不保证在所有场景下都会起作用(例如虚拟机管理程序crash时)。自4.4.0起(仅限于QEMU/KVM)。

Memory Tuning

<domain>
  ...
  <memtune>
    <hard_limit unit='G'>1</hard_limit>
    <soft_limit unit='M'>128</soft_limit>
    <swap_hard_limit unit='G'>2</swap_hard_limit>
    <min_guarantee unit='bytes'>67108864</min_guarantee>
  </memtune>
  ...
</domain>

memtune

可选元素项memtune提供与虚拟机内存调度参数相关的细节描述。如果忽略该项设置,则默认由操作系统提供默认值。对于QEMU/KVM,应用于qemu进程的参数被看做一个整体。因此,对其进行计数时,需要加上虚拟机ram、虚拟机显卡ram和qemu自身的一些内存。最后一点很难确定具体数值,因此需要猜想与尝试。对于每个可调参数,可以使用与memory相同的值来指定输入时数字所使用的单位。为了向后兼容,输出始终以KiB为单位。unit自0.9.11起。全部*_limit参数的可能值在0到VIR_DOMAIN_MEMORY_PARAM_UNLIMITED的范围内。

hard_limit

可选元素项hard_limit是虚拟机可使用的最大内存。该值的单位是kibibytes(1024字节的块)。qemu和kvm的使用者清冽建议不要设置相关限制项,因为如果虚拟机运行过少则虚拟机可能被内核关闭,决定进程运行所需的内存是一个无法决定的问题;也就是说,如果因工况需要已在 Memory Backing中设置了locked属性,您必须考虑部署的具体细节,并确定一个足够大的hard_limit值,以支持您的虚拟机的内存需求,但是该值足够小也可以保护主机以避免虚拟机锁定全部的内存。

soft_limit

可选元素项soft_limit就是内存争用期间强制设置的内存限制。该值的单位是kibibytes(1024字节块)。

swap_hard_limit

可选元素项swap_hard_limit就是加上交互内存swap后虚拟机可食用的最大内存。该值的单位是kibibytes(1024字节块)。该值应大于hard_limit的设置值。

min_guarantee

可选元素项min_guarantee就是应保证的虚拟机最小分配内存。该值的单位是kibibytes(1024字节块)。该元素仅被VMware ESX和OpenVZ支持。

本章节描述了用来代表作用域的xml文件格式,根据运行的作用于种类的格式变化,有一些可选配置项用来加载文件。对于特定虚拟机的细节可以查看
相关文件