要提高虚拟机(VM)的性能,您可以将额外的主机 RAM 分配给虚拟机。类似地,您可以减少分配给虚拟机的内存量,从而使主机内存可以分配给其他虚拟机或任务。

17.4.1. 内存过量使用复制链接链接已复制到粘贴板!

在 KVM hypervisor 上运行的虚拟机(VM)没有给它们分配的专用物理 RAM 块。相反,每个虚拟机都作为一个 Linux 进程,其中仅在请求时主机的 Linux 内核才分配内存。此外,主机的内存管理器可以在其自身的物理内存和交换空间之间移动虚拟机的内存。如果启用了内存过量使用,内核可以决定分配比虚拟机请求的少的物理内存,因为请求的内存量通常没有被虚拟机的进程完全使用。

默认情况下,在 Linux 内核中启用了内存过量使用,内核会为虚拟机请求估算安全的内存过量使用量。但是,对于内存密集型工作负载,频繁的内存过量使用仍然会使系统变得不稳定。

内存过量使用要求您在主机物理机上分配足够的交换空间,以容纳所有虚拟机,并为主机物理机器的进程分配足够的内存。有关基本推荐的 swap 空间大小的说明,请参阅 推荐的 swap 大小是多少?(红帽知识库)。

处理主机上内存短缺的可能的方法:

为每个虚拟机分配较少的内存。

向主机添加更多的物理内存。

使用更大的 swap 空间。

重要

如果交换频繁,虚拟机将会运行较慢。另外,过度使用会导致系统用尽内存(OOM),这可能会导致 Linux 内核关闭重要的系统进程。

设备分配不支持内存过度使用。这是因为,在使用设备分配时,必须静态预分配所有虚拟机内存,以对分配的设备启用直接内存访问(DMA)。

其他资源

虚拟内存参数

为红帽平台推荐的 swap 大小是多少?(红帽知识库)

17.4.2. 使用 virtio-mem 添加和删除虚拟机内存复制链接链接已复制到粘贴板!

RHEL 10 提供 virtio-mem 半虚拟内存设备。此设备可以在虚拟机(VM)中动态添加或删除主机内存。

17.4.2.1. virtio-mem 概述复制链接链接已复制到粘贴板!

virtio-mem 是一个半虚拟化内存设备,可用于在虚拟机中动态添加或删除主机内存。例如,您可以使用这个设备在运行的虚拟机之间移动内存资源,或者根据您当前的要求在云设置中调整虚拟机内存大小。

通过使用 virtio-mem,您可以将虚拟机的内存增加到超出其初始大小,将其缩减回其原始大小,单位为 2 到几百兆字节(MiB),具体取决于使用的内存和虚拟机中运行的操作系统。但请注意,virtio-mem 也依赖于特定的客户机操作系统配置,特别是为了可靠地拔出内存。

virtio-mem 功能限制

virtio-mem 目前与以下功能不兼容:

对主机上的实时应用程序使用内存锁定

在主机上使用加密的虚拟化

在主机上将 virtio-mem 与 memballoon 膨胀和收缩合并

在虚拟机中卸载或重新载入 virtio_mem 驱动程序

使用 vhost-user 设备,但 virtiofs 除外

其他资源

在虚拟机中配置内存在线

将 virtio-mem 设备附加到虚拟机

17.4.2.2. 在虚拟机中配置内存在线复制链接链接已复制到粘贴板!

在使用 virtio-mem 将内存附加到正在运行的虚拟机(也称为内存热插拔)之前,您必须配置虚拟机(VM)操作系统,以便可将热插拔内存自动设置为在线状态。否则,客户端操作系统无法使用额外的内存。您可以从以下内存在线的配置中选择:

online_movable

online_kernel

auto-movable

要了解这些配置之间的区别,请参阅:内存在线配置的比较

RHEL 中默认内存在线是使用 udev 规则配置的。但是,在使用 virtio-mem 时,建议直接在内核中配置内存在线。

先决条件

主机使用 Intel 64、AMD64、ARM 64 或 IBM Z CPU 架构。

主机使用 RHEL 10 作为操作系统。

运行在主机上的虚拟机使用以下操作系统版本之一:

在 Intel 64 和 AMD64 主机上:RHEL 8.10、RHEL 9.4 或更高版本、RHEL 10.0 或更高版本,或者支持 64 位版本的 Windows

重要

从正在运行的虚拟机中拔出内存在 RHEL 8.10 虚拟机中默认被禁用。

有关支持的 Windows 版本列表,请参阅: 认证的客户机操作系统

在 ARM 64 主机上: RHEL 9.6 或更高版本或 RHEL 10.0 或更高版本

在 IBM Z 主机上: RHEL 9.7 或更高版本或 RHEL 10.1 或更高版本

流程

要在虚拟机中设置内存在线,以使用 online_movable 配置:

将 memhp_default_state 内核命令行参数设置为 online_movable :

grubby --update-kernel=ALL --remove-args=memhp_default_state --args=memhp_default_state=online_movable

# grubby --update-kernel=ALL --remove-args=memhp_default_state --args=memhp_default_state=online_movable

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

重启虚拟机。

要在虚拟机中设置内存在线,以使用 online_kernel 配置:

将 memhp_default_state 内核命令行参数设置为 online_kernel :

grubby --update-kernel=ALL --remove-args=memhp_default_state --args=memhp_default_state=online_kernel

# grubby --update-kernel=ALL --remove-args=memhp_default_state --args=memhp_default_state=online_kernel

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

重启虚拟机。

要在虚拟机中使用 auto-movable 内存在线策略:

将 memhp_default_state 内核命令行参数设置为 online :

grubby --update-kernel=ALL --remove-args=memhp_default_state --args=memhp_default_state=online

# grubby --update-kernel=ALL --remove-args=memhp_default_state --args=memhp_default_state=online

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

将 memory_hotplug.online_policy 内核命令行参数设置为 auto-movable :

grubby --update-kernel=ALL --remove-args="memory_hotplug.online_policy" --args=memory_hotplug.online_policy=auto-movable

# grubby --update-kernel=ALL --remove-args="memory_hotplug.online_policy" --args=memory_hotplug.online_policy=auto-movable

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

可选:要进一步调优 auto-movable 在线策略,请更改 memory_hotplug.auto_movable_ratio 和 memory_hotplug.auto_movable_numa_aware 参数:

grubby --update-kernel=ALL --remove-args="memory_hotplug.auto_movable_ratio" --args=memory_hotplug.auto_movable_ratio=

grubby --update-kernel=ALL --remove-args="memory_hotplug.memory_auto_movable_numa_aware" --args=memory_hotplug.auto_movable_numa_aware=

# grubby --update-kernel=ALL --remove-args="memory_hotplug.auto_movable_ratio" --args=memory_hotplug.auto_movable_ratio=

# grubby --update-kernel=ALL --remove-args="memory_hotplug.memory_auto_movable_numa_aware" --args=memory_hotplug.auto_movable_numa_aware=

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

与可用于任何分配的内存相比,memory_hotplug.auto_movable_ratio 参数 设置仅可用于可移动分配的最大内存比率。比率以百分比表示,默认值为 301 (%),它是 3:1 的比率。

memory_hotplug.auto_movable_numa_aware 参数控制 memory_hotplug.auto_movable_ratio 参数是否应用到跨所有可用 NUMA 节点的内存,或仅应用到单个 NUMA 节点上的内存。默认值为:y (yes)

例如,如果最大比率设置为 301%,并且 memory_hotplug.auto_movable_numa_aware 设置为 y (yes),即使在附加了 virtio-mem 设备的 NUMA 节点内也应用 3:1 比率。如果参数设置为 n (no),则最大 3:1 比率仅应用于整个 NUMA 节点。

另外,如果没有超过比率,则新热插拔内存将只可用于可移动分配。否则,新热拔插内存将同时可用于可移动和不可移动分配。

重启虚拟机。

验证

要查看 online_movable 配置是否已正确设置,请检查 memhp_default_state 内核参数的当前值:

cat /sys/devices/system/memory/auto_online_blocks

online_movable

# cat /sys/devices/system/memory/auto_online_blocks

online_movable

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

要查看 online_kernel 配置是否已正确设置,请检查 memhp_default_state 内核参数的当前值:

cat /sys/devices/system/memory/auto_online_blocks

online_kernel

# cat /sys/devices/system/memory/auto_online_blocks

online_kernel

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

要查看 auto-movable 配置是否已正确设置,请检查以下内核参数:

memhp_default_state :

cat /sys/devices/system/memory/auto_online_blocks

online

# cat /sys/devices/system/memory/auto_online_blocks

online

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

memory_hotplug.online_policy:

cat /sys/module/memory_hotplug/parameters/online_policy

auto-movable

# cat /sys/module/memory_hotplug/parameters/online_policy

auto-movable

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

memory_hotplug.auto_movable_ratio:

cat /sys/module/memory_hotplug/parameters/auto_movable_ratio

301

# cat /sys/module/memory_hotplug/parameters/auto_movable_ratio

301

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

memory_hotplug.auto_movable_numa_aware:

cat /sys/module/memory_hotplug/parameters/auto_movable_numa_aware

y

# cat /sys/module/memory_hotplug/parameters/auto_movable_numa_aware

y

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

其他资源

virtio-mem 概述

将 virtio-mem 设备附加到虚拟机

配置内存热插拔

17.4.2.3. 将 virtio-mem 设备附加到虚拟机复制链接链接已复制到粘贴板!

要将额外内存附加到正在运行的虚拟机(也称为内存热插拔),之后能够调整热插拔内存的大小,您可以使用 virtio-mem 设备。特别是,您可以使用 libvirt XML 配置文件和 virsh 命令来定义并将 virtio-mem 设备附加到虚拟机(VM)。

先决条件

主机使用 Intel 64、AMD64、ARM 64 或 IBM Z CPU 架构。

主机使用 RHEL 10 作为操作系统。

运行在主机上的虚拟机使用以下操作系统版本之一:

在 Intel 64 和 AMD64 主机上:RHEL 8.10、RHEL 9.4 或更高版本、RHEL 10.0 或更高版本,或者支持 64 位版本的 Windows

重要

从正在运行的虚拟机中拔出内存在 RHEL 8.10 虚拟机中默认被禁用。

有关支持的 Windows 版本列表,请参阅: 认证的客户机操作系统

在 ARM 64 主机上: RHEL 9.6 或更高版本或 RHEL 10.0 或更高版本

在 IBM Z 主机上: RHEL 9.7 或更高版本或 RHEL 10.1 或更高版本

虚拟机配置了内存在线。具体说明请参阅:在虚拟机中配置内存在线

流程

确保目标虚拟机的 XML 配置包含 maxMemory 参数:

virsh edit testguest1

testguest1

...

128

...

# virsh edit testguest1

testguest1

...

128

...

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

在本例中,testguest1 虚拟机的 XML 配置定义了一个 maxMemory 参数,其大小为 128 G(GiB)。maxMemory 大小指定虚拟机可以使用的最大内存,其包括初始内存和热插拔内存。

创建并打开 XML 文件,来在主机上定义 virtio-mem 设备,例如:

vim virtio-mem-device.xml

# vim virtio-mem-device.xml

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

在文件中添加 virtio-mem 设备的 XML 定义并保存:

48

0

2

16

16

48

1

2

0

0

48

0

2

16

16

48

1

2

0

0

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

在本例中,使用以下参数定义了两个 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

# virsh attach-device testguest1 virtio-mem-device.xml --live --config

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

--live 选项仅将设备附加到正在运行的虚拟机,在引导间不持久。--config 选项使配置更改持久。您还可以将设备附加到没有 --live 选项的关闭的虚拟机。

可选:要动态更改附加到正在运行的虚拟机的 请求的 virtio-mem 设备的大小,请使用 virsh update-memory-device 命令:

virsh update-memory-device testguest1 --alias ua-virtiomem0 --requested-size 4GiB

# virsh update-memory-device testguest1 --alias ua-virtiomem0 --requested-size 4GiB

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

在本例中:

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

# virsh detach-device testguest1 virtio-mem-device.xml

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

可选:要从正在运行的虚拟机中拔出 virtio-mem 设备:

将 virtio-mem 设备的 requested 大小改为 0,否则尝试从正在运行的虚拟机中拔出 virtio-mem 设备将失败。

virsh update-memory-device testguest1 --alias ua-virtiomem0 --requested-size 0

# virsh update-memory-device testguest1 --alias ua-virtiomem0 --requested-size 0

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

从正在运行的虚拟机中拔出 virtio-mem 设备:

virsh detach-device testguest1 virtio-mem-device.xml --config

# virsh detach-device testguest1 virtio-mem-device.xml --config

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

验证

在虚拟机中,检查可用的 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

# free -h

total used free shared buff/cache available

Mem: 31Gi 5.5Gi 14Gi 1.3Gi 11Gi 23Gi

Swap: 8.0Gi 0B 8.0Gi

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

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

# 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

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

也可以通过显示正在运行的虚拟机的 XML 配置来查看主机上当前的插入的 RAM 量:

virsh dumpxml testguest1

testguest1

...

31

...

48

0

2

16

16

...

# virsh dumpxml testguest1

testguest1

...

31

...

48

0

2

16

16

...

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

在本例中:

31 代表虚拟机中所有源的可用 RAM 总量。

16 代表 virtio-mem 设备提供的插入的 RAM 的当前大小。

其他资源

virtio-mem 概述

在虚拟机中配置内存在线

17.4.2.4. 内存在线配置的比较复制链接链接已复制到粘贴板!

将内存附加到正在运行的 RHEL 虚拟机(也称为内存热插拔)时,您必须在虚拟机(VM)操作系统中将热插拔内存设置为在线状态。否则,系统将无法使用内存。

下表总结了在可用内存在线配置间选择时的主要注意事项。

Expand表 17.2. 内存在线配置的比较配置名称从虚拟机中拔出内存创建内存区不平衡的风险一个潜在的用例预期工作负载的内存要求

online_movable

热插内存可以可靠地拔出。

热插拔相对较少的内存

主要是用户空间内存

auto-movable

热插内存的可移动部分可以可靠地拔出。

最小

热插拔大量内存

主要是用户空间内存

online_kernel

热插拔内存无法可靠地拔出。

不可靠内存拔出是可以接受的。

用户空间或内核空间内存

Show more

区域不平衡 是某个 Linux 内存区域中缺少可用内存页。区域不平衡 会对系统性能造成负面影响。例如,如果内核用完了不可移动分配的可用内存,则内核可能会崩溃。通常,可移动分配主要包含用户空间内存页,不可移动分配主要包含内核空间内存页。

其他资源

在线和离线内存块

区域不平衡

在虚拟机中配置内存在线

17.4.3. 配置虚拟机以使用巨页复制链接链接已复制到粘贴板!

在某些情况下,您可以使用巨页而不是默认的 4 KiB 内存页来为虚拟机提高内存分配。例如,巨页可以提高具有高内存使用率的虚拟机的性能,如数据库服务器。

先决条件

主机被配置为在内存分配中使用巨页。具体说明请参阅 在引导时配置 HugeTLB

流程

如果所选的虚拟机正在运行,请关闭它。

打开所选虚拟机的 XML 配置。例如,要编辑 testguest 虚拟机,请运行以下命令:

virsh edit testguest

# virsh edit testguest

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

调整虚拟机的巨页配置。例如,要将虚拟机配置为使用 1 GiB 巨页,请将以下行添加到配置中的 部分中:

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

验证

启动虚拟机。

确认主机已成功为正在运行的虚拟机分配了巨页。在主机上运行以下命令:

cat /proc/meminfo | grep Huge

HugePages_Total: 4

HugePages_Free: 2

HugePages_Rsvd: 1

Hugepagesize: 1024000 kB

# cat /proc/meminfo | grep Huge

HugePages_Total: 4

HugePages_Free: 2

HugePages_Rsvd: 1

Hugepagesize: 1024000 kB

Copy to Clipboard

Copied!

Toggle word wrap

Toggle overflow

当您将空闲的和保留的巨页数加在一起(HugePages_Free + HugePages_Rsvd)时,结果应小于总巨页数(HugePages_Total)。差距是正在运行的虚拟机所使用的巨页数。

其他资源

配置巨页