18.4.2.3. 将 virtio-mem 设备附加到虚拟机
要将额外内存附加到正在运行的虚拟机(也称为内存热插拔),之后能够调整热插拔内存的大小,您可以使用 virtio-mem 设备。特别是,您可以使用 libvirt XML 配置文件和 virsh 命令来定义并将 virtio-mem 设备附加到虚拟机(VM)。
先决条件
- 主机使用 Intel 64、AMD64 或 ARM 64 CPU 架构。
- 主机使用 RHEL 10 作为操作系统。
运行在主机上的虚拟机使用以下操作系统版本之一:
在 Intel 64 和 AMD64 主机上: RHEL 8.10 或 RHEL 9.4 或更高版本
重要从正在运行的虚拟机中拔出内存在 RHEL 8.10 虚拟机中默认被禁用。
- 在 ARM 64 主机上: RHEL 9.6 或更高版本
- 在任何支持的主机上: RHEL 10
- 虚拟机配置了内存在线。具体步骤请参阅: 在虚拟机中配置内存
流程
确保目标虚拟机的 XML 配置包含
maxMemory参数:# virsh edit testguest1 <domain type='kvm'> <name>testguest1</name> ... <maxMemory unit='GiB'>128</maxMemory> ... </domain>在本例中,
testguest1虚拟机的 XML 配置定义了一个maxMemory参数,其大小为 128 G(GiB)。maxMemory大小指定虚拟机可以使用的最大内存,其包括初始内存和热插拔内存。创建并打开 XML 文件,来在主机上定义
virtio-mem设备,例如:# vim virtio-mem-device.xml在文件中添加
virtio-mem设备的 XML 定义并保存:<memory model='virtio-mem'> <target> <size unit='GiB'>48</size> <node>0</node> <block unit='MiB'>2</block> <requested unit='GiB'>16</requested> <current unit='GiB'>16</current> </target> <alias name='ua-virtiomem0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </memory> <memory model='virtio-mem'> <target> <size unit='GiB'>48</size> <node>1</node> <block unit='MiB'>2</block> <requested unit='GiB'>0</requested> <current unit='GiB'>0</current> </target> <alias name='ua-virtiomem1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </memory>在本例中,使用以下参数定义了两个
virtio-mem设备:-
size:这是设备的最大大小。在示例中,它是 48 GiB。size必须是block大小的倍数。 -
node:这是为virtio-mem设备分配的 vNUMA 节点。 -
block:这是设备的块大小。它必须至少是 Transparent Huge Page (THP)的大小,在 Intel 64 和 AMD64 CPU 构架上是 2 MiB。在 ARM64 架构上,THP 的大小可以是 2 MiB 或 512 MiB,具体取决于基本页大小。Intel 64 或 AMD64 架构上的 2 MiB 块大小通常是好的默认选择。当使用带有 虚拟功能 I/O(VFIO) 或 中介设备(mdev) 的virtio-mem时,跨所有virtio-mem设备的总块数不能大于 32768,否则 RAM 的插入可能会失败。 -
requested:这是您附加到具有virtio-mem设备的虚拟机的内存量。但是,它只对虚拟机的请求,可能无法成功解决,例如如果虚拟机没有正确配置。requested大小必须是block大小的倍数,且不能超过定义的size最大值。 -
current:这代表提供给虚拟机的当前virtio-mem设备的大小。current大小可能与requested不同,例如当请求无法完成或重启虚拟机时。 alias:这是一个可选d 用户定义的别名,您可用来指定预期的virtio-mem设备,例如使用 libvirt 命令编辑设备时。libvirt 中所有用户定义的别名必须以 "ua-" 前缀开头。除了这些特定的参数外,
libvirt像处理任何其他 PCI 设备一样处理virtio-mem设备。有关管理附加到虚拟机的 PCI 设备的更多信息,请参阅: 管理虚拟设备
-
使用 XML 文件将定义的
virtio-mem设备附加到虚拟机。例如,要将virtio-mem-device.xml中定义的两个设备永久附加到正在运行的testguest1虚拟机:# virsh attach-device testguest1 virtio-mem-device.xml --live --config--live选项仅将设备附加到正在运行的虚拟机,在引导间不持久。--config选项使配置更改持久。您还可以将设备附加到没有--live选项的关闭的虚拟机。可选:要动态更改附加到正在运行的虚拟机的
请求的virtio-mem设备的大小,请使用virsh update-memory-device命令:# virsh update-memory-device testguest1 --alias ua-virtiomem0 --requested-size 4GiB在本例中:
-
testguest1是您要更新的虚拟机。 -
--alias ua-virtiomem0是之前由定义的别名指定的virtio-mem设备。 --requested-size 4GiB将virtio-mem设备的requested大小更改为 4 GiB。警告通过减少
requested大小,从正在运行的虚拟机中拔出内存可能不可靠。此过程是否成功取决于各种因素,如所使用的内存在线策略。在某些情况下,客户机操作系统无法成功完成请求,因为当时无法更改热插拔内存量。
另外,从正在运行的虚拟机中拔出内存在 RHEL 8.10 虚拟机中默认被禁用。
-
可选:要从关闭的虚拟机中拔出
virtio-mem设备,请使用virsh detach-device命令:# virsh detach-device testguest1 virtio-mem-device.xml可选:要从正在运行的虚拟机中拔出
virtio-mem设备:将
virtio-mem设备的requested大小改为 0,否则尝试从正在运行的虚拟机中拔出virtio-mem设备将失败。# virsh update-memory-device testguest1 --alias ua-virtiomem0 --requested-size 0从正在运行的虚拟机中拔出
virtio-mem设备:# virsh detach-device testguest1 virtio-mem-device.xml --config
验证
在虚拟机中,检查可用的 RAM ,并查看总内存现在是否包含热插拔内存:
# free -h total used free shared buff/cache available Mem: 31Gi 5.5Gi 14Gi 1.3Gi 11Gi 23Gi Swap: 8.0Gi 0B 8.0Gi# numactl -H available: 1 nodes (0) node 0 cpus: 0 1 2 3 4 5 6 7 node 0 size: 29564 MB node 0 free: 13351 MB node distances: node 0 0: 10也可以通过显示正在运行的虚拟机的 XML 配置来查看主机上当前的插入的 RAM 量:
# virsh dumpxml testguest1 <domain type='kvm'> <name>testguest1</name> ... <currentMemory unit='GiB'>31</currentMemory> ... <memory model='virtio-mem'> <target> <size unit='GiB'>48</size> <node>0</node> <block unit='MiB'>2</block> <requested unit='GiB'>16</requested> <current unit='GiB'>16</current> </target> <alias name='ua-virtiomem0'/> <address type='pci' domain='0x0000' bus='0x08' slot='0x00' function='0x0'/> ... </domain>在本例中:
-
<currentMemory unit='GiB'>31</currentMemory>代表虚拟机中所有源的可用 RAM 总量。 -
<current unit='GiB'>16</current>代表virtio-mem设备提供的插入的 RAM 的当前大小。
-