我正在 KVM (QEMU) 中设置 Linux 系统,以测试在位于一组非常慢的磁盘 (RAID1 LV) 上的逻辑卷前面的快速磁盘上添加写回 LVM 缓存的效果。这是以实际物理配置为模型的,我不想触碰它,直到我知道添加缓存后它可能如何处理。
问题是,在 KVM 中,所有磁盘都以相同的速度运行,因此缓存很少被使用,而且我没有看到任何性能优势。理想情况下,我希望 RAID1 镜像能够应对 I/O,这样我就可以观察到缓存卷在写入过程中填满并逐渐写回镜像集。
有没有办法人为地限制 KVM/QEMU 中的磁盘速度?
我目前使用 Debian 12 作为此实验的主机,KVM 机器运行 Alpine Linux(也使用 Debian 12 进行测试)。KVM 设置包括一个主 qcow2 映像(快速磁盘)和附加 qcow2 映像(慢速 RAID 镜像)。
Qemu 对网络块设备(NBD)有原生支持,
--drive file=nbd://<host>[:<port>]/[<export>]
(您也可以nbd.ko
在客户机本身中使用)。这很有用,因为
nbdkit
有一个 NBD 服务器实现,支持插件来模拟服务失真作为过滤器。 类似的东西会使用过滤器nbdkit --filter=delay file /path/to/backing/storage rdelay=300ms wdelay=300ms
模拟具有严重访问延迟的硬盘。delay
您可能希望过滤
spinning
器的行为接近旋转盘片的行为,并与rate
过滤器相结合。假设您不打算重复使用数据并且在具有足够 RAM 的机器上执行此操作,那么使用插件
memory
(而不是file
上面示例中的插件)来消除实际的存储缺陷对我来说是有意义的。设备映射器子系统包括
CONFIG_DM_DELAY
一个设备映射器目标,可用于为磁盘操作添加延迟。Debian 12 标准内核将其作为模块包含在内。
例如:创建
/dev/mapper/delayed
,其功能与相同/dev/sdX
,但添加了 500 毫秒的延迟:更多信息:https://docs.kernel.org/next/admin-guide/device-mapper/delay.html
QEMU 提供内部支持,以限制每秒字节数为单位的带宽和基于每秒 IO 操作数的 IO 速率(两种情况下都支持对读取或写入操作执行不同的操作)。
如果直接调用 QEMU,标志上的相关附加选项
-drive
是:bps=x
,,bps_rd=x
:分别bps_wr=x
将全局、读取和写入带宽限制为x
每秒字节数。bps_max=x
,,bps_rd_max=x
:bps_wr_max=x
类似,但允许暂时超出常规限制。iops=x
,,iops_rd=x
:分别iops_wr=x
限制每秒全局、读取和写入 IO 操作数为x
每秒总操作数。iops_max=x
,,iops_rd_max=x
:iops_wr_max=x
类似,但暂时超出常规限制。iops_size=y
:针对上述限制,将y
IO 请求的每个字节视为单独的 IO 操作(旨在帮助更好地限制 IO 性能)。group=g
:将设备与名为 的配额组关联g
。同一命名组中的所有设备将使用相同的带宽和 IOPS 设置,并共享其限制。libvirt 还在其域 XML 格式中支持该接口,使用元素
<iotune>
(详细信息可在libvirt 域 XML 文档的此部分中找到),提供所有相同的功能,但带有一些额外的旋钮以便更好地进行微调。如果您只需要快速测试,这可能是最简单的方法,因为它完全独立。如果测试是一次性设置,您还可以将磁盘映像放在主机端的 tmpfs 实例上,以限制主机 IO 子系统的影响。