18.5. 优化虚拟机 I/O 性能


虚拟机(VM)的输入和输出(I/O)能力可能会显著限制虚拟机的整体效率。要解决这个问题,您可以通过配置块 I/O 参数来优化虚拟机的 I/O。

18.5.1. 在虚拟机中调整块 I/O

当一个或多个虚拟机正在使用多个块设备时,可能需要通过修改虚拟设备的 I/O 优先级来调整虚拟设备的 I/O 权重

增加设备的 I/O 权重会增加设备的 I/O 带宽的优先级,从而为它提供更多主机资源。同样的,降低设备的权重可使其消耗较少的主机资源。

注意

每个设备的 weight 值必须在 1001000 之间。或者,该值可以是 0,它会从每个设备列表中删除该设备。

流程

显示和设置虚拟机的块 I/O 参数:

  1. 显示虚拟机当前的 <blkio> 参数:

    # virsh dumpxml VM-name

    <domain>
      [...]
      <blkiotune>
        <weight>800</weight>
        <device>
          <path>/dev/sda</path>
          <weight>1000</weight>
        </device>
        <device>
          <path>/dev/sdb</path>
          <weight>500</weight>
        </device>
      </blkiotune>
      [...]
    </domain>
    Copy to Clipboard Toggle word wrap
  2. 编辑指定设备的 I/O 加权:

    # virsh blkiotune VM-name --device-weights device, I/O-weight
    Copy to Clipboard Toggle word wrap

    例如,以下命令将 testguest1 虚拟机中 /dev/sda 设备的权重改为 500。

    # virsh blkiotune testguest1 --device-weights /dev/sda, 500
    Copy to Clipboard Toggle word wrap

验证

  • 检查虚拟机的块 I/O 参数是否已正确配置。

    # virsh blkiotune testguest1
    
    Block I/O tuning parameters for domain testguest1:
    
        weight                        : 800
        device_weight                  : [
                                          {"sda": 500},
                                         ]
    ...
    Copy to Clipboard Toggle word wrap
    重要

    某些内核不支持为特定设备设置 I/O 权重。如果上一步没有按预期显示权重,则可能是这个功能与您的主机内核不兼容。

18.5.2. 虚拟机中的磁盘 I/O 节流

当多个虚拟机同时运行时,它们可能会使用过量的磁盘 I/O 而干扰系统性能。KVM 虚拟化中的磁盘 I/O 节流使得能够对从虚拟机发送到主机的磁盘 I/O 请求设定限制。这可以防止虚拟机过度使用共享资源并影响其他虚拟机的性能。

要启用磁盘 I/O 节流,请对从附加到虚拟机的每个块设备发送给主机的磁盘 I/O 请求设置限制。

流程

  1. 使用 virsh domblklist 命令列出指定虚拟机上所有磁盘设备的名称。

    # virsh domblklist testguest1
    Target     Source
    ------------------------------------------------
    vda        /var/lib/libvirt/images/testguest1.qcow2
    sda        -
    sdb        /home/sample-disk.iso
    Copy to Clipboard Toggle word wrap
  2. 找到您要节流的虚拟磁盘挂载的主机块设备。

    例如,如果您想要从上一步中节流 sdb 虚拟磁盘,以下输出显示该磁盘挂载在 /dev/nvme0n1p3 分区上。

    $ lsblk
    NAME                                          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    zram0                                         252:0    0     4G  0 disk  [SWAP]
    nvme0n1                                       259:0    0 238.5G  0 disk
    ├─nvme0n1p1                                   259:1    0   600M  0 part  /boot/efi
    ├─nvme0n1p2                                   259:2    0     1G  0 part  /boot
    └─nvme0n1p3                                   259:3    0 236.9G  0 part
      └─luks-a1123911-6f37-463c-b4eb-fxzy1ac12fea 253:0    0 236.9G  0 crypt /home
    Copy to Clipboard Toggle word wrap
  3. 使用 virsh blkiotune 命令为块设备设置 I/O 限制。

    # virsh blkiotune VM-name --parameter device,limit
    Copy to Clipboard Toggle word wrap

    以下示例将 testguest1 虚拟机上的 sdb 磁盘节流为每秒 1000 个读写 I/O 操作,每秒的读取和写入 I/O 操作数为 50 MB。

    # virsh blkiotune testguest1 --device-read-iops-sec /dev/nvme0n1p3,1000 --device-write-iops-sec /dev/nvme0n1p3,1000 --device-write-bytes-sec /dev/nvme0n1p3,52428800 --device-read-bytes-sec /dev/nvme0n1p3,52428800
    Copy to Clipboard Toggle word wrap

其他资源

  • 磁盘 I/O 节流可用于各种情况,例如,当属于不同客户的虚拟机在同一台主机上运行时,或者为不同的虚拟机提供服务质量保障时。磁盘 I/O 节流还可用来模拟较慢的磁盘。
  • I/O 节流可以独立应用于附加到虚拟机的每个块设备,并支持对吞吐量和 I/O 操作的限制。
  • 红帽不支持使用 virsh blkdeviotune命令来在 VM 中配置 I/O 节流。

    有关使用 RHEL 10 作为虚拟机主机时不支持的功能的更多信息,请参阅 RHEL 10 虚拟化中的不支持的功能

18.5.3. 在存储设备上启用多队列

当在虚拟机(VM)中使用 virtio-blkvirtio-scsi 存储设备时,多队列 功能提供改进的存储性能和可扩展性。它允许每个虚拟 CPU(vCPU)使用单独的队列和中断,而不影响其他 vCPU。

默认情况下,Q35 机器类型启用了 multi-queue 功能,但在 i440fx 机器类型中,您必须手动启用它。您可以调整您的工作负载的最佳队列数量,但每种类型的工作负载的最佳数量有所不同,您必须测试哪些队列数量最适合您的工作负载。

流程

  1. 要在存储设备上启用 多队列,请编辑虚拟机的 XML 配置。

    # virsh edit <example_vm>
    Copy to Clipboard Toggle word wrap
  2. 在 XML 配置中,找到预期的存储设备,并将 queues 参数改为使用多个 I/O 队列。将 N 替换为虚拟机中的 vCPU 数,最多为 16。

    • 一个 virtio-blk 示例:

      <disk type='block' device='disk'>
        <driver name='qemu' type='raw' queues='N'/>
        <source dev='/dev/sda'/>
        <target dev='vda' bus='virtio'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
      </disk>
      Copy to Clipboard Toggle word wrap
    • 一个 virtio-scsi 示例:

      <controller type='scsi' index='0' model='virtio-scsi'>
         <driver queues='N' />
      </controller>
      Copy to Clipboard Toggle word wrap
  3. 重启虚拟机以使更改生效。

18.5.4. 配置专用的 IOThreads

要提高虚拟机(VM)上磁盘的输入/输出(I/O)性能,您可以配置专用的 IOThread,用于管理虚拟机磁盘的 IO 操作。

通常,磁盘的 I/O 操作是主 QEMU 线程的一部分,这可以降低虚拟机在密集 I/O 工作负载期间的响应。通过将 I/O 操作分离到专用的 IOThread,您可以显著提高虚拟机的响应和性能。

流程

  1. 如果所选的虚拟机正在运行,请关闭它。
  2. 在主机上,在虚拟机 XML 配置中添加或编辑 <iothreads> 标签。例如,要为 testguest1 虚拟机创建单个 IOThread

    # virsh edit <testguest1>
    
    <domain type='kvm'>
      <name>testguest1</name>
      ...
      <vcpu placement='static'>8</vcpu>
      <iothreads>1</iothreads>
      ...
    </domain>
    Copy to Clipboard Toggle word wrap
    注意

    为获得最佳结果,请对主机上的每个 CPU 只使用 1-2 个 IOThreads

  3. 为虚拟机磁盘分配专用的 IOThread。例如,要将 ID 为 1IOThread 分配给 testguest1 虚拟机上的一个磁盘:

    # virsh edit <testguest1>
    
    <domain type='kvm'>
      <name>testguest1</name>
      ...
      <devices>
        <disk type='file' device='disk'>
          <driver name='qemu' type='raw' cache='none' io='native' iothread='1'/>
          <source file='/var/lib/libvirt/images/test-disk.raw'/>
          <target dev='vda' bus='virtio'/>
          <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
        </disk>
        ...
      </devices>
      ...
    </domain>
    Copy to Clipboard Toggle word wrap
    注意

    IOThread ID 从 1 开始,您必须将单个 IOThread 专用于一个磁盘。

    通常,要获得最佳性能,每个虚拟机有一个专用的 IOThread 就足够了。

  4. 使用 virtio-scsi 存储设备时,为 virtio-scsi 控制器分配一个专用的 IOThread。例如,要将 ID 为 1IOThread 分配给 testguest1 虚拟机上的一个控制器:

    # virsh edit <testguest1>
    
    <domain type='kvm'>
      <name>testguest1</name>
      ...
      <devices>
        <controller type='scsi' index='0' model='virtio-scsi'>
          <driver iothread='1'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/>
        </controller>
        ...
      </devices>
      ...
    </domain>
    Copy to Clipboard Toggle word wrap

验证

18.5.5. 配置虚拟磁盘缓存

KVM 提供多种虚拟磁盘缓存模式。对于密集型输入/输出(IO)工作负载,选择最佳缓存模式可以显著提高虚拟机(VM)性能。

虚拟磁盘缓存模式概述

writethrough
主机页缓存仅用于读。只有在数据已提交到存储设备时,写才会被报告为完成。持续的 IO 性能会下降,但此模式有很好的写保证。
writeback
主机页缓存用于读和写。当数据达到主机的内存缓存,而不是物理存储时,写被报告为完成。这个模式比 writethrough 有更快的 IO 性能,但可能会在主机有故障时丢失数据。
none
主机页缓存被完全绕过。这个模式直接依赖于物理磁盘的写队列,因此它有可预测的持续的 IO 性能,并在稳定的客户机上提供良好的写保证。其也是用于虚拟机实时迁移的一种安全的缓存模式。

流程

  1. 如果所选的虚拟机正在运行,请关闭它。
  2. 编辑所选虚拟机的 XML 配置。

    # virsh edit <vm_name>
    Copy to Clipboard Toggle word wrap
  3. 查找磁盘设备,并在 driver 标签中编辑 cache 选项。

    <domain type='kvm'>
      <name>testguest1</name>
      ...
      <devices>
        <disk type='file' device='disk'>
          <driver name='qemu' type='raw' cache='none' io='native' iothread='1'/>
          <source file='/var/lib/libvirt/images/test-disk.raw'/>
          <target dev='vda' bus='virtio'/>
          <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
        </disk>
        ...
      </devices>
      ...
    </domain>
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat