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
值必须在 100
到 1000
之间。或者,该值可以是 0
,它会从每个设备列表中删除该设备。
流程
显示和设置虚拟机的块 I/O 参数:
显示虚拟机当前的
<blkio>
参数:# virsh dumpxml VM-name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑指定设备的 I/O 加权:
virsh blkiotune VM-name --device-weights device, I/O-weight
# virsh blkiotune VM-name --device-weights device, I/O-weight
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,以下命令将 testguest1 虚拟机中 /dev/sda 设备的权重改为 500。
virsh blkiotune testguest1 --device-weights /dev/sda, 500
# virsh blkiotune testguest1 --device-weights /dev/sda, 500
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查虚拟机的块 I/O 参数是否已正确配置。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要某些内核不支持为特定设备设置 I/O 权重。如果上一步没有按预期显示权重,则可能是这个功能与您的主机内核不兼容。
18.5.2. 虚拟机中的磁盘 I/O 节流 复制链接链接已复制到粘贴板!
当多个虚拟机同时运行时,它们可能会使用过量的磁盘 I/O 而干扰系统性能。KVM 虚拟化中的磁盘 I/O 节流使得能够对从虚拟机发送到主机的磁盘 I/O 请求设定限制。这可以防止虚拟机过度使用共享资源并影响其他虚拟机的性能。
要启用磁盘 I/O 节流,请对从附加到虚拟机的每个块设备发送给主机的磁盘 I/O 请求设置限制。
流程
使用
virsh domblklist
命令列出指定虚拟机上所有磁盘设备的名称。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 找到您要节流的虚拟磁盘挂载的主机块设备。
例如,如果您想要从上一步中节流
sdb
虚拟磁盘,以下输出显示该磁盘挂载在/dev/nvme0n1p3
分区上。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
virsh blkiotune
命令为块设备设置 I/O 限制。virsh blkiotune VM-name --parameter device,limit
# virsh blkiotune VM-name --parameter device,limit
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下示例将
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
# 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 Copied! Toggle word wrap Toggle overflow
其他资源
- 磁盘 I/O 节流可用于各种情况,例如,当属于不同客户的虚拟机在同一台主机上运行时,或者为不同的虚拟机提供服务质量保障时。磁盘 I/O 节流还可用来模拟较慢的磁盘。
- I/O 节流可以独立应用于附加到虚拟机的每个块设备,并支持对吞吐量和 I/O 操作的限制。
红帽不支持使用
virsh blkdeviotune
命令来在 VM 中配置 I/O 节流。有关使用 RHEL 10 作为虚拟机主机时不支持的功能的更多信息,请参阅 RHEL 10 虚拟化中的不支持的功能。
18.5.3. 在存储设备上启用多队列 复制链接链接已复制到粘贴板!
当在虚拟机(VM)中使用 virtio-blk
或 virtio-scsi
存储设备时,多队列 功能提供改进的存储性能和可扩展性。它允许每个虚拟 CPU(vCPU)使用单独的队列和中断,而不影响其他 vCPU。
默认情况下,Q35
机器类型启用了 multi-queue 功能,但在 i440fx
机器类型中,您必须手动启用它。您可以调整您的工作负载的最佳队列数量,但每种类型的工作负载的最佳数量有所不同,您必须测试哪些队列数量最适合您的工作负载。
流程
要在存储设备上启用
多队列
,请编辑虚拟机的 XML 配置。virsh edit <example_vm>
# virsh edit <example_vm>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 XML 配置中,找到预期的存储设备,并将
queues
参数改为使用多个 I/O 队列。将 N 替换为虚拟机中的 vCPU 数,最多为 16。一个
virtio-blk
示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 一个
virtio-scsi
示例:<controller type='scsi' index='0' model='virtio-scsi'> <driver queues='N' /> </controller>
<controller type='scsi' index='0' model='virtio-scsi'> <driver queues='N' /> </controller>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- 重启虚拟机以使更改生效。
18.5.4. 配置专用的 IOThreads 复制链接链接已复制到粘贴板!
要提高虚拟机(VM)上磁盘的输入/输出(I/O)性能,您可以配置专用的 IOThread
,用于管理虚拟机磁盘的 IO 操作。
通常,磁盘的 I/O 操作是主 QEMU 线程的一部分,这可以降低虚拟机在密集 I/O 工作负载期间的响应。通过将 I/O 操作分离到专用的 IOThread
,您可以显著提高虚拟机的响应和性能。
流程
- 如果所选的虚拟机正在运行,请关闭它。
在主机上,在虚拟机 XML 配置中添加或编辑
<iothreads>
标签。例如,要为testguest1
虚拟机创建单个IOThread
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意为获得最佳结果,请对主机上的每个 CPU 只使用 1-2 个
IOThreads
。为虚拟机磁盘分配专用的
IOThread
。例如,要将 ID 为1
的IOThread
分配给testguest1
虚拟机上的一个磁盘:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意IOThread
ID 从 1 开始,您必须将单个IOThread
专用于一个磁盘。通常,要获得最佳性能,每个虚拟机有一个专用的
IOThread
就足够了。使用
virtio-scsi
存储设备时,为virtio-scsi
控制器分配一个专用的IOThread
。例如,要将 ID 为1
的IOThread
分配给testguest1
虚拟机上的一个控制器:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
- 评估您的更改对虚拟机性能的影响。详情请查看: 虚拟机性能监控工具
18.5.5. 配置虚拟磁盘缓存 复制链接链接已复制到粘贴板!
KVM 提供多种虚拟磁盘缓存模式。对于密集型输入/输出(IO)工作负载,选择最佳缓存模式可以显著提高虚拟机(VM)性能。
虚拟磁盘缓存模式概述
writethrough
- 主机页缓存仅用于读。只有在数据已提交到存储设备时,写才会被报告为完成。持续的 IO 性能会下降,但此模式有很好的写保证。
writeback
-
主机页缓存用于读和写。当数据达到主机的内存缓存,而不是物理存储时,写被报告为完成。这个模式比
writethrough
有更快的 IO 性能,但可能会在主机有故障时丢失数据。 none
- 主机页缓存被完全绕过。这个模式直接依赖于物理磁盘的写队列,因此它有可预测的持续的 IO 性能,并在稳定的客户机上提供良好的写保证。其也是用于虚拟机实时迁移的一种安全的缓存模式。
流程
- 如果所选的虚拟机正在运行,请关闭它。
编辑所选虚拟机的 XML 配置。
virsh edit <vm_name>
# virsh edit <vm_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查找磁盘设备,并在
driver
标签中编辑cache
选项。Copy to Clipboard Copied! Toggle word wrap Toggle overflow