libvirt:为啥直接将 LUN 连接到 KVM 来宾时 IOPS 很少
Posted
技术标签:
【中文标题】libvirt:为啥直接将 LUN 连接到 KVM 来宾时 IOPS 很少【英文标题】:libvirt: why so many few IOPS when direct attaching LUN to a KVM guestlibvirt:为什么直接将 LUN 连接到 KVM 来宾时 IOPS 很少 【发布时间】:2019-02-19 15:39:14 【问题描述】:我在多路径存储池中有一个 KVM 和一些 LUN(Compellent SAN)。 所有文件系统都是 xfs。
> # virsh vol-list --pool multipath
dm-3 /dev/mapper/maildata-store-2-repl
dm-4 /dev/mapper/maildata-store-1-back
dm-5 /dev/mapper/metadata-store-2-repl
dm-6 /dev/mapper/metadata-store-1-back
dm-7 /dev/mapper/images
一个 LUN 专用于存储 VM (/var/lib/libvirt/images),其他 LUN 将直接挂载在 VM 中,用于将来存储邮件和相关元数据。
# df /dev/mapper/images1
Sys. de fichiers blocs de 1K Utilisé Disponible Uti% Monté sur
/dev/mapper/images1 209611780 18752452 190859328 9% /var/lib/libvirt/images
fio 用于比较随机写入时的 IOP:
fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=/tmp/10g.file --bs=4k --iodepth=64 --size=4G --readwrite=randwrite
所以我在写入虚拟机的 tmp 文件夹(/dev/mapper/images)时得到了 fio 测试的结果,非常好!
写入:IOPS=66.1k,BW=258MiB/s
现在,我用这个 xml 文件将一个 LUN 附加到这个虚拟机:
<disk type='block' device='lun'>
<driver name='qemu' type='raw'/>
<source dev='/dev/mapper/maildata-store-1-back'/>
<target dev='sda' bus='scsi'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
还有这个命令:
virsh attach-device VM_TEST --file lun.xml --persistent
然后,在 VM_TEST 上:
#fdisk /dev/sda
#mkfs.xfs /dev/sda1
#mount /dev/sda1 /test
并在新创建的分区上重新运行 fio 测试:
fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=/test/10g.file --bs=4k --iodepth=64 --size=4G --readwrite=randwrite
结果相当糟糕:
写入:IOPS=17.6k,BW=68.7MiB/s
我在 xml 文件中使用了不同的选项,例如 cache=none、bus=virtio、..,但我没有设法真正增加措施。
现在我被困住了。 我真的不知道去哪里找。
谢谢。
【问题讨论】:
注意:在一种情况下,您对文件系统中的文件进行了 I/O,而在另一种情况下,您对可能是另一个块设备上的块设备进行了 I/O... 您好,第一个文件系统也在块设备上,即 LUN 上的 Vms 假脱机。第二种情况也是块设备上的文件系统。主要区别在于所有 libvirt 之间的东西。我认为this answer 可能有用。谢谢 当然,但是您知道您的文件系统在获得直接 I/O 时会做什么吗?这本身就是一个可能有复杂答案的问题(serverfault.com/a/864574/203726 上有一些警告),您可以通过直接检查您传递给 KVM 来宾的主机块设备来回避问题... 【参考方案1】:因此,我设法通过此调整在主机和来宾上获得相同的 IOP:
<driver name='qemu' type='raw' cache='directsync' io='native'/>
我也尝试将块设备挂载为磁盘或 lun:
<disk type='block' device='lun'>
<target dev='sda' bus='scsi'/>
和
<disk type='block' device='disk'>
<target dev='sda' bus='virtio'/>
结果完全一样。
【讨论】:
以上是关于libvirt:为啥直接将 LUN 连接到 KVM 来宾时 IOPS 很少的主要内容,如果未能解决你的问题,请参考以下文章