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

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

17.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>
  2. 编辑指定设备的 I/O 加权:

    # virsh blkiotune VM-name --device-weights device, I/O-weight

    例如:以下将 liftrul 虚拟机中的 /dev/sda 设备的权重改为 500。

    # virsh blkiotune liftbrul --device-weights /dev/sda, 500

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

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

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

流程

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

    # virsh domblklist rollin-coal
    Target     Source
    ------------------------------------------------
    vda        /var/lib/libvirt/images/rollin-coal.qcow2
    sda        -
    sdb        /home/horridly-demanding-processes.iso
  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
  3. 使用 virsh blkiotune 命令为块设备设置 I/O 限制。

    # virsh blkiotune VM-name --parameter device,limit

    以下示例将 rollin-coal 上的 sdb 磁盘节流为每秒 1000 个读写 I/O 操作,每秒的读写 I/O 操作吞吐量 50 MB。

    # virsh blkiotune rollin-coal --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

附加信息

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

17.5.3. 启用多队列 virtio-scsi

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

流程

  • 要为特定虚拟机启用 multi-queue virtio-scsi 支持,请在虚拟机的 XML 配置中添加以下内容,其中 N 是 vCPU 队列的总数:

    <controller type='scsi' index='0' model='virtio-scsi'>
       <driver queues='N' />
    </controller>