14.6. 优化虚拟机 CPU 性能


与主机中的物理 CPU 非常相似,vCPU 对虚拟机 (VM) 性能至关重要。因此,优化 vCPU 会对虚拟机的资源效率产生重大影响。优化 vCPU:

  1. 调整分配给虚拟机的主机 CPU 数。您可以使用 CLIWeb 控制台进行此操作。
  2. 确保 vCPU 模型与主机的 CPU 型号一致。例如,将 testguest1 虚拟机设置为使用主机的 CPU 型号:

    # virt-xml testguest1 --edit --cpu host-model
    Copy to Clipboard Toggle word wrap
  3. 停止内核同页合并(KSM)
  4. 如果您的主机使用非统一内存访问(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
    maximum      config         4
    maximum      live           2
    current      config         2
    current      live           1
    Copy to Clipboard Toggle word wrap

    此输出显示 testguest 目前使用 1 个 vCPU,另外 1 个 vCPu 可以热插入以提高虚拟机性能。但是,重新引导后,vCPU testguest 使用的数量会改为 2,而且能够热插 2 个 vCPU。

流程

  1. 调整可以附加到虚拟机的最大 vCPU 数量,其在虚拟机下次启动时生效。

    例如,要将 testguest 虚拟机的最大 vCPU 数量增加到 8:

    # virsh setvcpus testguest 8 --maximum --config
    Copy to Clipboard Toggle word wrap

    请注意,最大值可能会受 CPU 拓扑、主机硬件、hypervisor 和其他因素的限制。

  2. 将当前附加到虚拟机的 vCPU 数量调整到上一步中配置的最大值。例如:

    • 将附加到正在运行的 testguest 虚拟机的 vCPU 数量增加到 4:

      # virsh setvcpus testguest 4 --live
      Copy to Clipboard Toggle word wrap

      这会增加虚拟机的性能和主机的 testguest 负载占用,直到虚拟机下次引导为止。

    • 将附加到 testguest 虚拟机的 vCPU 数量永久减少至 1:

      # virsh setvcpus testguest 1 --config
      Copy to Clipboard Toggle word wrap

      这会降低虚拟机的性能和 testguest 的主机负载占用。但是,如果需要可热插入虚拟机以暂时提高性能。

验证

  • 确认虚拟机的 vCPU 的当前状态反映了您的更改。

    # virsh vcpucount testguest
    maximum      config         8
    maximum      live           4
    current      config         1
    current      live           4
    Copy to Clipboard Toggle word wrap

14.6.3. 使用 Web 控制台管理虚拟 CPU

通过使用 RHEL 8 web 控制台,您可以查看并配置 web 控制台连接的虚拟机所使用的虚拟 CPU。

前提条件

步骤

  1. 登录到 RHEL 8 web 控制台。

    详情请参阅 登录到 web 控制台

  2. Virtual Machines 界面中,点您要查看其信息的虚拟机。

    此时将打开一个新页面,其中包含关于所选虚拟机基本信息的概述部分,以及用于访问虚拟机的图形界面的控制台部分。

  3. 点概述窗格中 vCPU 数旁边的 edit

    此时会出现 vCPU 详情对话框。

  1. 为所选虚拟机配置虚拟 CPU。

    • vCPU 数量 - 当前正在使用的 vCPU 数量。

      注意

      vCPU 数量不能超过 vCPU 的最大值。

    • vCPU 最大 - 可为虚拟机配置的最大虚拟 CPU 数。如果这个值大于 vCPU Count,可以为虚拟机附加额外的 vCPU。
    • 插槽 - 向虚拟机公开的插槽数量。
    • 每个插槽的内核数 - 向虚拟机公开的每个插槽的内核数。
    • 每个内核的线程数 - 向虚拟机公开的每个内核的线程数。

      请注意, 插槽每个插槽的内核数每个内核的线程数选项调整了虚拟机的 CPU 拓扑。这可能对 vCPU 性能有好处,但可能会影响客户机操作系统中某些软件的功能。如果您的部署不需要不同的设置,请保留默认值。

  2. 应用

    配置了虚拟机的虚拟 CPU。

    注意

    对虚拟 CPU 设置的更改仅在重启虚拟机后生效。

14.6.4. 在虚拟机中配置 NUMA

以下方法可用于配置 RHEL 8 主机上虚拟机(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
    Copy to Clipboard Toggle word wrap

    如果行的值为 2 或更高,则主机与 NUMA 兼容。

  • 可选: 您在主机上已安装了 numactl 软件包。

    # yum install numactl
    Copy to Clipboard Toggle word wrap

流程

自动方法

  • 将虚拟机的 NUMA 策略设为 Preferred。例如,要配置 testguest5 虚拟机:

    # virt-xml testguest5 --edit --vcpus placement=auto
    # virt-xml testguest5 --edit --numatune mode=preferred
    Copy to Clipboard Toggle word wrap
  • 使用 numad 服务自动将 VM CPU 与内存资源保持一致。

    # echo 1 > /proc/sys/kernel/numa_balancing
    Copy to Clipboard Toggle word wrap
  • 启动 numad 服务,来自动将 VM CPU 与内存资源对齐。

    # systemctl start numad
    Copy to Clipboard Toggle word wrap

手动方法

要手动调整 NUMA 设置,您可以指定将哪些主机 NUMA 节点专门分配给某个虚拟机。这可提高虚拟机 vCPU 的主机内存用量。

  1. 可选: 使用 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
    Copy to Clipboard Toggle word wrap
  2. 编辑虚拟机的 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>
    Copy to Clipboard Toggle word wrap
  3. 如果虚拟机正在运行,请重启它以应用配置。
注意

为了获得最佳性能,建议尊重主机上每个 NUMA 节点的最大内存大小。

14.6.5. 配置虚拟 CPU 固定

要提高虚拟机(VM)的 CPU 性能,您可以将虚拟 CPU (vCPU)固定到主机上的特定物理 CPU 线程。这确保 vCPU 有自己的专用物理 CPU 线程,这可以显著提高 vCPU 性能。

要进一步优化 CPU 性能,您还可以将与指定虚拟机关联的 QEMU 进程线程固定到特定的主机 CPU。

流程

  1. 检查主机上的 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
    Copy to Clipboard Toggle word wrap

    在本例中,输出中包含 NUMA 节点和主机上可用的物理 CPU 线程。

  2. 检查虚拟机中的 vCPU 线程数:

    # lscpu -p=node,cpu
    
    Node,CPU
    0,0
    0,1
    0,2
    0,3
    Copy to Clipboard Toggle word wrap

    在本例中,输出中包含 NUMA 节点和虚拟机中可用的 vCPU 线程。

  3. 将虚拟机中特定的 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
    Copy to Clipboard Toggle word wrap
  4. 可选:验证 vCPU 线程是否已成功固定到 CPU。

    # virsh vcpupin testguest6
    VCPU   CPU Affinity
    ----------------------
    0      1
    1      3
    2      5
    3      7
    Copy to Clipboard Toggle word wrap
  5. 固定 vCPU 线程后,您还可以将与指定虚拟机关联的 QEMU 进程线程固定到特定的主机 CPU 或 CPU 范围。这可进一步帮助 QEMU 进程在物理 CPU 上更有效地运行。

    例如,以下命令将 testguest6 的 QEMU 进程线程固定到 CPU 2 和 4,并验证是否成功:

    # virsh emulatorpin testguest6 2,4
    # virsh emulatorpin testguest6
    emulator: CPU Affinity
    ----------------------------------
           *: 2,4
    Copy to Clipboard Toggle word wrap

14.6.6. 配置虚拟 CPU 上限

您可以使用虚拟 CPU (vCPU)上限来限制虚拟机(VM)可以使用的 CPU 资源量。vCPU 上限可通过防止单个虚拟机过度使用主机的 CPU 资源来提高整体性能,并使 hypervisor 更轻松地管理 CPU 调度。

流程

  1. 查看主机上当前的 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
    Copy to Clipboard Toggle word wrap
  2. 要为虚拟机配置一个绝对 vCPU 上限,请设置 vcpu_periodvcpu_quota 参数。两个参数都使用一个数字值,其代表以微秒为单位的持续时间。

    1. 使用 virsh schedinfo 命令设置 vcpu_period 参数。例如:

      # virsh schedinfo <vm_name> --set vcpu_period=100000
      Copy to Clipboard Toggle word wrap

      在本例中,vcpu_period 被设置为 100,000 微秒,这意味着调度程序在此时间间隔内强制实施 vCPU 上限。

      您还可以使用 --live --config 选项来配置一个正在运行的虚拟机,而无需重启它。

    2. 使用 virsh schedinfo 命令设置 vcpu_quota 参数。例如:

      # virsh schedinfo <vm_name> --set vcpu_quota=50000
      Copy to Clipboard Toggle word wrap

      在本例中,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
    ...
    Copy to Clipboard Toggle word wrap

14.6.7. 调整 CPU 权重

CPU 权重 (或 CPU 共享)设置控制与其他正在运行的虚拟机相比,虚拟机(VM)接收的 CPU 时间。通过增加特定虚拟机的 CPU 权重,您可以确保相对于其他虚拟机,此虚拟机获得更多的 CPU 时间。要在多个虚拟机之间优先分配 CPU 时间,请设置 cpu_shares 参数

可能的 CPU 权重值范围从 0262144,新 KVM 虚拟机的默认值为 1024

流程

  1. 检查虚拟机的当前 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
    Copy to Clipboard Toggle word wrap
  2. 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
    Copy to Clipboard Toggle word wrap

    在本例中,cpu_shares 被设置为 2048。这意味着,如果所有其他虚拟机的值被设置为 1024,则此虚拟机大约获得两倍的 CPU 时间。

    您还可以使用 --live --config 选项来配置一个正在运行的虚拟机,而无需重启它。

14.6.8. 禁用内核同页合并

内核同页合并 (KSM) 通过在虚拟机 (VM) 间共享相同的内存页面来提高内存密度。

但是,使用 KSM 会增加 CPU 使用率,并可能会对总体性能造成负面影响,具体取决于工作负载。

在 RHEL 8 中,KSM 默认被启用。因此,如果虚拟机部署中的 CPU 性能不是最优的,您可以通过禁用 KSM 来改进它。

先决条件

  • 对主机系统的 root 访问权限。

流程

  1. 监控主机上虚拟机的性能和资源消耗,以评估 KSM 的好处。具体来说,请确保 KSM 使用的额外的 CPU 不会抵消内存改进,且不会造成额外的性能问题。在对延迟敏感的工作负载中,还要注意跨 NUMA 页合并。
  2. 可选:如果 KSM 没有提高虚拟机性能,请禁用它:

    • 要为单个会话禁用 KSM,请使用 systemctl 工具停止 ksmksmtuned 服务。

      # systemctl stop ksm
      # systemctl stop ksmtuned
      Copy to Clipboard Toggle word wrap
    • 要永久禁用 KSM,请使用 systemctl 工具禁用 ksmksmtuned 服务。

      # 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 Toggle word wrap
      注意

      取消激活 KSM 前在虚拟机间共享的内存页将保持共享。要停止共享,请使用以下命令删除系统中的所有 PageKSM 页:

      # echo 2 > /sys/kernel/mm/ksm/run
      Copy to Clipboard Toggle word wrap

      但是,这个命令会增加内存使用率,并可能导致主机或虚拟机上出现性能问题。

验证

  • 监控主机上虚拟机的性能和资源消耗,以评估停用 KSM 的好处。具体说明请查看 虚拟机性能监控工具
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat