14.6. 优化虚拟机 CPU 性能
与主机中的物理 CPU 非常相似,vCPU 对虚拟机 (VM) 性能至关重要。因此,优化 vCPU 会对虚拟机的资源效率产生重大影响。优化 vCPU:
- 调整分配给虚拟机的主机 CPU 数。您可以使用 CLI 或 Web 控制台进行此操作。
确保 vCPU 模型与主机的 CPU 型号一致。例如,将 testguest1 虚拟机设置为使用主机的 CPU 型号:
virt-xml testguest1 --edit --cpu host-model
# virt-xml testguest1 --edit --cpu host-modelCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 停止内核同页合并(KSM) 。
如果您的主机使用非统一内存访问(NUMA),您也可以为其虚拟机 配置 NUMA。这会尽可能将主机的 CPU 和内存进程映射到虚拟机的 CPU 和内存进程上。实际上,NUMA 调优为 vCPU 提供了对分配给虚拟机的系统内存更精简的访问,这可以提高 vCPU 的处理效率。
详情请参阅 在虚拟机中配置 NUMA 和 用于特定工作负载的虚拟机性能优化 。
14.6.1. vCPU 过量使用 复制链接链接已复制到粘贴板!
vCPU 过量使用允许您有一个设置,其中在主机上运行的虚拟机(VM)中所有 vCPU 总和超过主机上的物理 CPU 数。但是,当在虚拟机中同时运行比主机上物理提供的更多的核时,您可能会遇到性能下降。
为了获得最佳性能,请只给虚拟机分配在每个虚拟机中运行预期的工作负载所需的 vCPU 数。
vCPU 过量使用建议:
- 分配虚拟机工作负载所需的最小 vCPU 数,以获得最佳性能。
- 避免在未经过广泛测试的情况下在生产环境中过量使用 vCPU。
- 如果过量使用 vCPU,对于 100% 以下的负载,安全比例通常是 5 个 vCPU 对 1 个物理 CPU。
- 不建议每个物理处理器核分配的总 vCPU 数超过 10 个。
- 监控 CPU 使用率,以防止高负载下出现性能下降。
使用 100% 内存或处理资源的应用程序可能会在过度使用的环境中变得不稳定。不要在未经过广泛测试的情况下在生产环境中过量使用内存或 CPU,因为 CPU 过量使用比率取决于工作负载。
14.6.2. 使用命令行添加和删除虚拟 CPU 复制链接链接已复制到粘贴板!
要提高或优化虚拟机 (VM) 的 CPU 性能,您可以添加或删除分配给虚拟机的虚拟 CPU (vCPU) 。
当在运行的虚拟机上执行时,这也被称为 vCPU 热插和热拔。但请注意,vCPU 热拔在 RHEL 8 中不支持,红帽强烈反对使用它。
先决条件
可选:查看目标虚拟机中 vCPU 的当前状态。例如,要显示 testguest 虚拟机上 vCPU 的数量:
virsh vcpucount testguest
# virsh vcpucount testguest maximum config 4 maximum live 2 current config 2 current live 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此输出显示 testguest 目前使用 1 个 vCPU,另外 1 个 vCPu 可以热插入以提高虚拟机性能。但是,重新引导后,vCPU testguest 使用的数量会改为 2,而且能够热插 2 个 vCPU。
流程
调整可以附加到虚拟机的最大 vCPU 数量,其在虚拟机下次启动时生效。
例如,要将 testguest 虚拟机的最大 vCPU 数量增加到 8:
virsh setvcpus testguest 8 --maximum --config
# virsh setvcpus testguest 8 --maximum --configCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,最大值可能会受 CPU 拓扑、主机硬件、hypervisor 和其他因素的限制。
将当前附加到虚拟机的 vCPU 数量调整到上一步中配置的最大值。例如:
将附加到正在运行的 testguest 虚拟机的 vCPU 数量增加到 4:
virsh setvcpus testguest 4 --live
# virsh setvcpus testguest 4 --liveCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这会增加虚拟机的性能和主机的 testguest 负载占用,直到虚拟机下次引导为止。
将附加到 testguest 虚拟机的 vCPU 数量永久减少至 1:
virsh setvcpus testguest 1 --config
# virsh setvcpus testguest 1 --configCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这会降低虚拟机的性能和 testguest 的主机负载占用。但是,如果需要可热插入虚拟机以暂时提高性能。
验证
确认虚拟机的 vCPU 的当前状态反映了您的更改。
virsh vcpucount testguest
# virsh vcpucount testguest maximum config 8 maximum live 4 current config 1 current live 4Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.6.3. 使用 Web 控制台管理虚拟 CPU 复制链接链接已复制到粘贴板!
通过使用 RHEL 8 web 控制台,您可以查看并配置 web 控制台连接的虚拟机所使用的虚拟 CPU。
前提条件
- 您已安装了 RHEL 8 web 控制台。
- 您已启用了 cockpit 服务。
您的用户帐户被允许登录到 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
- Web 控制台 VM 插件 已安装在您的系统上。
步骤
登录到 RHEL 8 web 控制台。
详情请参阅 登录到 web 控制台。
在 界面中,点您要查看其信息的虚拟机。
此时将打开一个新页面,其中包含关于所选虚拟机基本信息的概述部分,以及用于访问虚拟机的图形界面的控制台部分。
点概述窗格中 vCPU 数旁边的 。
此时会出现 vCPU 详情对话框。
为所选虚拟机配置虚拟 CPU。
vCPU 数量 - 当前正在使用的 vCPU 数量。
注意vCPU 数量不能超过 vCPU 的最大值。
- vCPU 最大 - 可为虚拟机配置的最大虚拟 CPU 数。如果这个值大于 vCPU Count,可以为虚拟机附加额外的 vCPU。
- 插槽 - 向虚拟机公开的插槽数量。
- 每个插槽的内核数 - 向虚拟机公开的每个插槽的内核数。
每个内核的线程数 - 向虚拟机公开的每个内核的线程数。
请注意, 插槽、每个插槽的内核数和每个内核的线程数选项调整了虚拟机的 CPU 拓扑。这可能对 vCPU 性能有好处,但可能会影响客户机操作系统中某些软件的功能。如果您的部署不需要不同的设置,请保留默认值。
点。
配置了虚拟机的虚拟 CPU。
注意对虚拟 CPU 设置的更改仅在重启虚拟机后生效。
14.6.4. 在虚拟机中配置 NUMA 复制链接链接已复制到粘贴板!
以下方法可用于配置 RHEL 8 主机上虚拟机(VM)的非统一内存访问(NUMA)设置。
为便于使用,您可以使用自动化工具和服务设置虚拟机的 NUMA 配置。但是,手动 NUMA 设置可能会显著提高性能。
先决条件
主机是一个与 NUMA 兼容的机器。要检测是否是这种情况,请使用
virsh nodeinfo命令,并查看NUMA cell (s)行:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果行的值为 2 或更高,则主机与 NUMA 兼容。
可选: 您在主机上已安装了
numactl软件包。yum install numactl
# yum install numactlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
自动方法
将虚拟机的 NUMA 策略设为
Preferred。例如,要配置 testguest5 虚拟机:virt-xml testguest5 --edit --vcpus placement=auto virt-xml testguest5 --edit --numatune mode=preferred
# virt-xml testguest5 --edit --vcpus placement=auto # virt-xml testguest5 --edit --numatune mode=preferredCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
numad服务自动将 VM CPU 与内存资源保持一致。echo 1 > /proc/sys/kernel/numa_balancing
# echo 1 > /proc/sys/kernel/numa_balancingCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
numad服务,来自动将 VM CPU 与内存资源对齐。systemctl start numad
# systemctl start numadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
手动方法
要手动调整 NUMA 设置,您可以指定将哪些主机 NUMA 节点专门分配给某个虚拟机。这可提高虚拟机 vCPU 的主机内存用量。
可选: 使用
numactl命令查看主机上的 NUMA 拓扑:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑虚拟机的 XML 配置,来将 CPU 和内存资源分配给特定的 NUMA 节点。例如,以下配置将 testguest6 设置为在 NUMA 节点
0上使用 vCPU 0-7,在 NUMA 节点1上使用 vCPUS 8-15。两个节点也都分配了 16 GiB 内存。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 如果虚拟机正在运行,请重启它以应用配置。
为了获得最佳性能,建议尊重主机上每个 NUMA 节点的最大内存大小。
14.6.5. 配置虚拟 CPU 固定 复制链接链接已复制到粘贴板!
要提高虚拟机(VM)的 CPU 性能,您可以将虚拟 CPU (vCPU)固定到主机上的特定物理 CPU 线程。这确保 vCPU 有自己的专用物理 CPU 线程,这可以显著提高 vCPU 性能。
要进一步优化 CPU 性能,您还可以将与指定虚拟机关联的 QEMU 进程线程固定到特定的主机 CPU。
流程
检查主机上的 CPU 拓扑:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,输出中包含 NUMA 节点和主机上可用的物理 CPU 线程。
检查虚拟机中的 vCPU 线程数:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,输出中包含 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
# virsh vcpupin testguest6 0 1 # virsh vcpupin testguest6 1 3 # virsh vcpupin testguest6 2 5 # virsh vcpupin testguest6 3 7Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:验证 vCPU 线程是否已成功固定到 CPU。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 固定 vCPU 线程后,您还可以将与指定虚拟机关联的 QEMU 进程线程固定到特定的主机 CPU 或 CPU 范围。这可进一步帮助 QEMU 进程在物理 CPU 上更有效地运行。
例如,以下命令将 testguest6 的 QEMU 进程线程固定到 CPU 2 和 4,并验证是否成功:
virsh emulatorpin testguest6 2,4 virsh emulatorpin testguest6
# virsh emulatorpin testguest6 2,4 # virsh emulatorpin testguest6 emulator: CPU Affinity ---------------------------------- *: 2,4Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.6.6. 配置虚拟 CPU 上限 复制链接链接已复制到粘贴板!
您可以使用虚拟 CPU (vCPU)上限来限制虚拟机(VM)可以使用的 CPU 资源量。vCPU 上限可通过防止单个虚拟机过度使用主机的 CPU 资源来提高整体性能,并使 hypervisor 更轻松地管理 CPU 调度。
流程
查看主机上当前的 vCPU 调度配置。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要为虚拟机配置一个绝对 vCPU 上限,请设置
vcpu_period和vcpu_quota参数。两个参数都使用一个数字值,其代表以微秒为单位的持续时间。使用
virsh schedinfo命令设置vcpu_period参数。例如:virsh schedinfo <vm_name> --set vcpu_period=100000
# virsh schedinfo <vm_name> --set vcpu_period=100000Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,
vcpu_period被设置为 100,000 微秒,这意味着调度程序在此时间间隔内强制实施 vCPU 上限。您还可以使用
--live --config选项来配置一个正在运行的虚拟机,而无需重启它。使用
virsh schedinfo命令设置vcpu_quota参数。例如:virsh schedinfo <vm_name> --set vcpu_quota=50000
# virsh schedinfo <vm_name> --set vcpu_quota=50000Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,
vcpu_quota被设置为 50,000 微秒,它指定虚拟机在vcpu_period时间间隔内可以使用的最大 CPU 时间。在本例中,vcpu_quota被设置为vcpu_period的一半,因此虚拟机在此间隔内可使用最多 50% 的 CPU 时间。您还可以使用
--live --config选项来配置一个正在运行的虚拟机,而无需重启它。
验证
检查 vCPU 调度参数是否有正确的值。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.6.7. 调整 CPU 权重 复制链接链接已复制到粘贴板!
CPU 权重 (或 CPU 共享)设置控制与其他正在运行的虚拟机相比,虚拟机(VM)接收的 CPU 时间。通过增加特定虚拟机的 CPU 权重,您可以确保相对于其他虚拟机,此虚拟机获得更多的 CPU 时间。要在多个虚拟机之间优先分配 CPU 时间,请设置 cpu_shares 参数
可能的 CPU 权重值范围从 0 到 262144,新 KVM 虚拟机的默认值为 1024。
流程
检查虚拟机的当前 CPU 权重。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 CPU 权重 调整为希望的值。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,
cpu_shares被设置为 2048。这意味着,如果所有其他虚拟机的值被设置为 1024,则此虚拟机大约获得两倍的 CPU 时间。您还可以使用
--live --config选项来配置一个正在运行的虚拟机,而无需重启它。
14.6.8. 禁用内核同页合并 复制链接链接已复制到粘贴板!
内核同页合并 (KSM) 通过在虚拟机 (VM) 间共享相同的内存页面来提高内存密度。
但是,使用 KSM 会增加 CPU 使用率,并可能会对总体性能造成负面影响,具体取决于工作负载。
在 RHEL 8 中,KSM 默认被启用。因此,如果虚拟机部署中的 CPU 性能不是最优的,您可以通过禁用 KSM 来改进它。
先决条件
- 对主机系统的 root 访问权限。
流程
- 监控主机上虚拟机的性能和资源消耗,以评估 KSM 的好处。具体来说,请确保 KSM 使用的额外的 CPU 不会抵消内存改进,且不会造成额外的性能问题。在对延迟敏感的工作负载中,还要注意跨 NUMA 页合并。
可选:如果 KSM 没有提高虚拟机性能,请禁用它:
要为单个会话禁用 KSM,请使用
systemctl工具停止ksm和ksmtuned服务。systemctl stop ksm systemctl stop ksmtuned
# systemctl stop ksm # systemctl stop ksmtunedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要永久禁用 KSM,请使用
systemctl工具禁用ksm和ksmtuned服务。systemctl disable ksm systemctl disable 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.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意取消激活 KSM 前在虚拟机间共享的内存页将保持共享。要停止共享,请使用以下命令删除系统中的所有
PageKSM页:echo 2 > /sys/kernel/mm/ksm/run
# echo 2 > /sys/kernel/mm/ksm/runCopy to Clipboard Copied! Toggle word wrap Toggle overflow 但是,这个命令会增加内存使用率,并可能导致主机或虚拟机上出现性能问题。
验证
- 监控主机上虚拟机的性能和资源消耗,以评估停用 KSM 的好处。具体说明请查看 虚拟机性能监控工具。