17.6. 优化虚拟机 CPU 性能
与主机中的物理 CPU 非常相似,vCPU 对虚拟机(VM)性能至关重要。因此,优化 vCPU 会对虚拟机的资源效率产生重大影响。优化 vCPU:
- 调整分配给虚拟机的主机 CPU 数。您可以使用 CLI 或 Web 控制台 进行此操作。
确保 vCPU 模型与主机的 CPU 型号一致。例如,将 testguest1 虚拟机设置为使用主机的 CPU 型号:
# virt-xml testguest1 --edit --cpu host-model在 ARM 64 系统上,请使用
--cpu host-passthrough。- 管理内核相同的页面合并 (KSM) 。
如果您的主机使用非统一内存访问 (NUMA) ,您也可以为其虚拟机 配置 NUMA。这会尽可能将主机的 CPU 和内存进程映射到虚拟机的 CPU 和内存进程上。实际上,NUMA 调优为 vCPU 提供了对分配给虚拟机的系统内存更精简的访问,这可以提高 vCPU 的处理效率。
详情请参阅 在虚拟机中配置 NUMA 和 对特定工作负载 的虚拟机性能优化。
17.6.1. vCPU 过量使用 复制链接链接已复制到粘贴板!
虚拟 CPU (vCPU)过量使用允许您有一个设置,其中运行在主机上的虚拟机(VM)中的所有 vCPU 总和可以超过主机上的物理 CPU 数。但是,当在虚拟机中同时运行比主机上物理提供的更多的核时,您可能会遇到性能下降。
为了获得最佳性能,请只给虚拟机分配在每个虚拟机中运行预期的工作负载所需的 vCPU 数。
vCPU 过量使用建议:
- 分配虚拟机工作负载所需的最小 vCPU 数,以获得最佳性能。
- 避免在未经过广泛测试的情况下在生产环境中过量使用 vCPU。
- 如果过量使用 vCPU,对于 100% 以下的负载,安全比例通常是 5 个 vCPU 对 1 个物理 CPU。
- 不建议每个物理处理器核分配的总 vCPU 数超过 10 个。
- 监控 CPU 使用率,以防止高负载下出现性能下降。
使用 100% 内存或处理资源的应用程序可能会在过度使用的环境中变得不稳定。不要在未经过广泛测试的情况下在生产环境中过量使用内存或 CPU,因为 CPU 过量使用比率取决于工作负载。
17.6.2. 使用命令行添加和删除虚拟 CPU 复制链接链接已复制到粘贴板!
要提高或优化虚拟机(VM)的 CPU 性能,您可以添加或删除分配给虚拟机的虚拟 CPU(vCPU)。
当在运行的虚拟机上执行时,这也被称为 vCPU 热插和热拔。但请注意,RHEL 10 不支持 vCPU 热插拔,红帽强烈建议不要使用。
流程
可选:查看所选虚拟机中 vCPU 的当前状态。例如,要显示 testguest 虚拟机上 vCPU 的数量:
# virsh vcpucount testguest maximum config 4 maximum live 2 current config 2 current live 1此输出显示 testguest 目前使用 1 个 vCPU,另外 1 个 vCPu 可以热插入以提高虚拟机性能。但是,重新引导后,vCPU testguest 使用的数量会改为 2,而且能够热插 2 个 vCPU。
调整可连接到虚拟机的最大 vCPU 数,这虚拟机下次启动时生效。
例如,要将 testguest 虚拟机的最大 vCPU 数量增加到 8:
# virsh setvcpus testguest 8 --maximum --config请注意,最大值可能会受 CPU 拓扑、主机硬件、hypervisor 和其他因素的限制。
调整当前连接到虚拟机的 vCPU 数,最多为上一步中配置的最大值。例如:
将附加到正在运行的 testguest 虚拟机的 vCPU 数量增加到 4:
# virsh setvcpus testguest 4 --live这会增加虚拟机的性能和主机的 testguest 负载占用,直到虚拟机下次引导为止。
将附加到 testguest 虚拟机的 vCPU 数量永久减少至 1:
# virsh setvcpus testguest 1 --config这会降低虚拟机的性能和 testguest 的主机负载占用。但是,如果需要可热插入虚拟机以暂时提高性能。
验证
确认虚拟机的 vCPU 的当前状态反映了您的更改。
# virsh vcpucount testguest maximum config 8 maximum live 4 current config 1 current live 4
17.6.3. 使用 Web 控制台管理虚拟 CPU 复制链接链接已复制到粘贴板!
通过使用 RHEL 10 web 控制台,您可以查看并配置 web 控制台连接的虚拟机所使用的虚拟 CPU。
先决条件
您已安装了 RHEL 10 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
- Web 控制台 VM 插件 已安装在您的系统上。
流程
- 登录到 RHEL 10 web 控制台。
在 界面中,点击您要查看其信息的虚拟机。
此时将打开一个新页面,其中包含关于所选虚拟机基本信息的概述部分,以及用于访问虚拟机的图形界面的控制台部分。
单击概述窗格中 vCPU 数旁边的 。
此时会出现 vCPU 详情对话框。
为所选虚拟机配置虚拟 CPU。
vCPU 数量 - 当前正在使用的 vCPU 数量。
注意vCPU 数量不能超过 vCPU 的最大值。
- vCPU 最大 - 可为虚拟机配置的最大虚拟 CPU 数。如果这个值大于 vCPU Count,可以为虚拟机附加额外的 vCPU。
- 插槽 - 向虚拟机公开的插槽数量。
- 每个插槽的内核数 - 向虚拟机公开的每个插槽的内核数。
每个内核的线程数 - 向虚拟机公开的每个内核的线程数。
重要请注意, 插槽、每个插槽的内核数和每个内核的线程数选项调整了虚拟机的 CPU 拓扑。这可能对 vCPU 性能有好处,但可能会影响客户机操作系统中某些软件的功能。如果您的部署不需要不同的设置,请保留默认值。
点。
配置了虚拟机的虚拟 CPU。
- 如果虚拟机正在运行,重启它以使虚拟 CPU 设置的更改生效。
17.6.4. 在虚拟机中配置 NUMA 复制链接链接已复制到粘贴板!
您可以使用多种方法配置 RHEL 10 主机上虚拟机(VM)的非统一内存访问(NUMA)设置。
为便于使用,您可以使用自动化工具和服务设置虚拟机的 NUMA 配置。但是,手动 NUMA 设置可能会显著提高性能。
先决条件
主机是一个与 NUMA 兼容的机器。要检测是否是这种情况,请使用
virsh nodeinfo命令,并查看NUMA cell(s)行:# virsh nodeinfo CPU model: x86_64 CPU(s): 48 CPU frequency: 1200 MHz CPU socket(s): 1 Core(s) per socket: 12 Thread(s) per core: 2 NUMA cell(s): 2 Memory size: 67012964 KiB如果行的值为 2 或更高,则主机与 NUMA 兼容。
可选:您已在主机上安装了
numactl软件包。# dnf install numactl
流程
将虚拟机的 NUMA 策略设为
Preferred。例如,要配置 testguest5 虚拟机:# virt-xml testguest5 --edit --vcpus placement=auto # virt-xml testguest5 --edit --numatune mode=preferred设置
numad服务,以自动将 VM CPU 与内存资源匹配。# echo 1 > /proc/sys/kernel/numa_balancing启动
numad服务。# systemctl start numad可选:手动调整 NUMA 设置。指定将哪些主机 NUMA 节点专门分配给特定的虚拟机。这可提高虚拟机 vCPU 的主机内存用量。
使用
numactl命令查看主机上的 NUMA 拓扑:# numactl --hardware available: 2 nodes (0-1) node 0 size: 18156 MB node 0 free: 9053 MB node 1 size: 18180 MB node 1 free: 6853 MB node distances: node 0 1 0: 10 20 1: 20 10编辑虚拟机的 XML 配置,来将 CPU 和内存资源分配给特定的 NUMA 节点。例如,以下配置将 testguest6 设置为在 NUMA 节点
0上使用 vCPU 0-7,在 NUMA 节点1上使用 vCPUS 8-15。两个节点也都分配了 16 GiB 内存。# virsh edit <testguest6> <domain type='kvm'> <name>testguest6</name> ... <vcpu placement='static'>16</vcpu> ... <cpu ...> <numa> <cell id='0' cpus='0-7' memory='16' unit='GiB'/> <cell id='1' cpus='8-15' memory='16' unit='GiB'/> </numa> ... </domain>注意为了获得最佳性能,最好遵守主机上每个 NUMA 节点的最大内存大小。
- 如果虚拟机正在运行,请重启它以应用配置。
17.6.5. 配置虚拟 CPU 固定 复制链接链接已复制到粘贴板!
要提高虚拟机(VM)的 CPU 性能,您可以将虚拟 CPU (vCPU)固定到主机上的特定物理 CPU 线程。这确保 vCPU 有自己的专用物理 CPU 线程,这可以显著提高 vCPU 性能。
要进一步优化 CPU 性能,您还可以将与指定虚拟机关联的 QEMU 进程线程固定到特定的主机 CPU。
流程
检查主机上的 CPU 拓扑:
# lscpu -p=node,cpu Node,CPU 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7在本例中,输出中包含 NUMA 节点和主机上可用的物理 CPU 线程。
检查虚拟机中的 vCPU 线程数:
# lscpu -p=node,cpu Node,CPU 0,0 0,1 0,2 0,3在本例中,输出中包含 NUMA 节点和虚拟机中可用的 vCPU 线程。
将虚拟机中特定的 vCPU 线程固定到特定的主机 CPU 或 CPU 范围。建议作为一种安全的提高 vCPU 性能的方法。
例如,以下命令将 testguest6 虚拟机的 vCPU 线程 0 到 3 分别固定到主机 CPU 1, 3, 5, 7 :
# virsh vcpupin testguest6 0 1 # virsh vcpupin testguest6 1 3 # virsh vcpupin testguest6 2 5 # virsh vcpupin testguest6 3 7可选:验证 vCPU 线程是否已成功固定到 CPU。
# virsh vcpupin testguest6 VCPU CPU Affinity ---------------------- 0 1 1 3 2 5 3 7可选:固定 vCPU 线程后,您还可以将与指定的虚拟机关联的 QEMU 进程线程固定到一个特定的主机 CPU 或 CPU 范围。这可进一步帮助 QEMU 进程在物理 CPU 上更有效地运行。
例如,以下命令将 testguest6 的 QEMU 进程线程固定到 CPU 2 和 4,并验证是否成功:
# virsh emulatorpin testguest6 2,4 # virsh emulatorpin testguest6 emulator: CPU Affinity ---------------------------------- *: 2,4
17.6.6. 配置虚拟 CPU 上限 复制链接链接已复制到粘贴板!
您可以使用虚拟 CPU (vCPU)上限来限制虚拟机(VM)可以使用的 CPU 资源量。vCPU 上限可通过防止单个虚拟机过度使用主机的 CPU 资源来提高整体性能,并使 hypervisor 更轻松地管理 CPU 调度。
流程
查看主机上当前的 vCPU 调度配置。
# virsh schedinfo <vm_name> Scheduler : posix cpu_shares : 0 vcpu_period : 0 vcpu_quota : 0 emulator_period: 0 emulator_quota : 0 global_period : 0 global_quota : 0 iothread_period: 0 iothread_quota : 0要为虚拟机配置一个绝对 vCPU 上限,请设置
vcpu_period和vcpu_quota参数。两个参数都使用一个数字值,其代表以微秒为单位的持续时间。使用
virsh schedinfo命令设置vcpu_period参数。例如:# virsh schedinfo <vm_name> --set vcpu_period=100000在本例中,
vcpu_period被设置为 100,000 微秒,这意味着调度程序在此时间间隔内强制实施 vCPU 上限。您还可以使用
--live --config选项来配置一个正在运行的虚拟机,而无需重启它。使用
virsh schedinfo命令设置vcpu_quota参数。例如:# virsh schedinfo <vm_name> --set vcpu_quota=50000在本例中,
vcpu_quota被设置为 50,000 微秒,它指定虚拟机在vcpu_period时间间隔内可以使用的最大 CPU 时间。在本例中,vcpu_quota被设置为vcpu_period的一半,因此虚拟机在此间隔内可使用最多 50% 的 CPU 时间。您还可以使用
--live --config选项来配置一个正在运行的虚拟机,而无需重启它。
验证
检查 vCPU 调度参数是否有正确的值。
# virsh schedinfo <vm_name> Scheduler : posix cpu_shares : 2048 vcpu_period : 100000 vcpu_quota : 50000 ...
17.6.7. 调整 CPU 权重 复制链接链接已复制到粘贴板!
CPU 权重 (或 CPU 共享)设置控制与其他正在运行的虚拟机相比,虚拟机(VM)接收的 CPU 时间。通过增加特定虚拟机的 CPU 权重,您可以确保相对于其他虚拟机,此虚拟机获得更多的 CPU 时间。要在多个虚拟机之间优先分配 CPU 时间,请设置 cpu_shares 参数
可能的 CPU 权重值范围从 0 到 262144,新 KVM 虚拟机的默认值为 1024。
流程
检查虚拟机的当前 CPU 权重。
# virsh schedinfo <vm_name> Scheduler : posix cpu_shares : 1024 vcpu_period : 0 vcpu_quota : 0 emulator_period: 0 emulator_quota : 0 global_period : 0 global_quota : 0 iothread_period: 0 iothread_quota : 0将 CPU 权重 调整为希望的值。
# virsh schedinfo <vm_name> --set cpu_shares=2048 Scheduler : posix cpu_shares : 2048 vcpu_period : 0 vcpu_quota : 0 emulator_period: 0 emulator_quota : 0 global_period : 0 global_quota : 0 iothread_period: 0 iothread_quota : 0在本例中,
cpu_shares被设置为 2048。这意味着,如果所有其他虚拟机的值被设置为 1024,则此虚拟机大约获得两倍的 CPU 时间。您还可以使用
--live --config选项来配置一个正在运行的虚拟机,而无需重启它。
17.6.8. 启用和禁用内核相同页合并 复制链接链接已复制到粘贴板!
内核同页合并 (KSM) 通过在虚拟机 (VM) 间共享相同的内存页面来提高内存密度。因此,启用 KSM 可能会提高虚拟机部署的内存效率。
但是,启用 KSM 也会增加 CPU 使用率,并可能会对总体性能造成负面影响,具体取决于工作负载。
在 RHEL 10 中, KSM 默认被禁用。要启用 KSM 并测试其对虚拟机性能的影响,请参阅以下说明。
先决条件
- 对主机系统的 root 访问权限。
流程
启用 KSM:
警告启用 KSM 会增加 CPU 使用率并影响整体 CPU 性能。
安装
ksmtuned服务:# dnf install ksmtuned启动服务:
要为单个会话启用 KSM,请使用
systemctl程序启动ksm和ksmtuned服务。# systemctl start ksm # systemctl start ksmtuned要永久启用 KSM,请使用
systemctl程序启用ksm和ksmtuned服务。# systemctl enable ksm Created symlink /etc/systemd/system/multi-user.target.wants/ksm.service/usr/lib/systemd/system/ksm.service # systemctl enable ksmtuned Created symlink /etc/systemd/system/multi-user.target.wants/ksmtuned.service /usr/lib/systemd/system/ksmtuned.service
- 监控主机上虚拟机的性能和资源消耗,以评估激活 KSM 的好处。具体来说,请确保 KSM 的额外的 CPU 使用率不会抵消内存改进,且不会造成额外的性能问题。在对延迟敏感的工作负载中,还要注意跨 NUMA 页合并。
可选:如果 KSM 没有提高虚拟机性能,请禁用它:
要为单个会话禁用 KSM,请使用
systemctl工具停止ksm和ksmtuned服务。# systemctl stop ksm # systemctl stop ksmtuned要永久禁用 KSM,请使用
systemctl工具禁用ksm和ksmtuned服务。# systemctl disable ksm Removed /etc/systemd/system/multi-user.target.wants/ksm.service. # systemctl disable ksmtuned Removed /etc/systemd/system/multi-user.target.wants/ksmtuned.service.注意取消激活 KSM 前在虚拟机间共享的内存页将保持共享。要停止共享,请使用以下命令删除系统中的所有
PageKSM页:# echo 2 > /sys/kernel/mm/ksm/run但是,这个命令会增加内存使用率,并可能导致主机或虚拟机上出现性能问题。