为什么在我的实验中 virtio-scsi 比 virtio-blk 慢很多(在 ceph rbd 镜像上)?

问题描述 投票:0回答:2

您好,我最近通过 qemu 目标(用于其 DISCARD/TRIM 支持)对 virtio-scsi over rbd 进行了实验,并将吞吐量和 iops 与同一台机器上的 virtio-blk over rbd 设置进行了比较,使用 fio客人。结果,顺序读写的吞吐量小了 7 倍(42.3MB/s vs 309MB/s),随机读写的 iops 小了 10 倍(546 vs 5705)。

我所做的是使用 OpenStack Juno 设置虚拟机,它为我提供了 virtio-blk over rbd 设置。然后我修改了libvirt configure xml中的相关部分,从此:

<disk type='network' device='disk'>
  <driver name='qemu' type='raw' cache='writeback'/>
  <auth username='cinder'>
    <secret type='ceph' uuid='482b83f9-be95-448e-87cc-9fa602196590'/>
  </auth>
  <source protocol='rbd' name='vms/c504ea8b-18e6-491e-9470-41c60aa50b81_disk'>
    <host name='192.168.20.105' port='6789'/>
  </source>
  <target dev='vda' bus='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>

对此:

<disk type='network' device='disk'>
  <driver name='qemu' type='raw' cache='writeback' discard='unmap'/>
  <auth username='cinder'>
    <secret type='ceph' uuid='482b83f9-be95-448e-87cc-9fa602196590'/>
  </auth>
  <source protocol='rbd' name='vms/c504ea8b-18e6-491e-9470-41c60aa50b81_disk'>
    <host name='192.168.20.105' port='6789'/>
  </source>
  <target dev='vda' bus='scsi'/>
  <controller type='scsi' model='virtio-scsi' index='0'/>
</disk>

软件版本有:

qemu2.5.1

libvirt1.2.2

kernel 3.18.0-031800-generic #201412071935 SMP Mon Dec 8 00:36:34 UTC 2014 x86_64(Ubuntu 14.04 内核)

虚拟机管理程序是 KVM。

我认为 virtio-scsi 和 virtio-blk 之间的性能差异不会那么大。所以请指出我做错了什么,以及如何实现合理的性能。

一个限制是我想要一个适用于 OpenStack 的解决方案(如果适用于 Juno 则是理想的选择),而无需进行太多修补或编码。例如,我听说过 virtio-scsi + vhost-scsi + scsi-mq,但目前 OpenStack 中似乎不可用。

performance qemu libvirt scsi block-device
2个回答
6
投票

简单的答案是 VirtIO-SCSI 比 VirtIO-Block 稍微复杂一些。 借用这里的简单描述:

VirtIO 块具有以下层:

guest: app -> Block Layer -> virtio-blk
host: QEMU -> Block Layer -> Block Device Driver -> Hardware

VirtIO SCSI 看起来像这样:

guest: app -> Block Layer -> SCSI Layer -> scsi_mod
host: QEMU -> Block Layer -> SCSI Layer -> Block Device Driver -> Hardware

本质上,与 VirtIO Block 相比,VirtIO SCSI 必须经过另一个转换层。

对于大多数使用本地设备的情况,速度会变慢。 有一些奇怪的具体情况,但有时情况恰恰相反,即:

  • 主机 SCSI LUN 直接直通至 VirtIO SCSI 适配器。这稍微快一些,因为它绕过了主机端的块层。
  • QEMU 对 iSCSI 设备的本机访问。 有时这会更快,因为它完全避免了主机块和 SCSI 层,并且不必从 VirtIO 块命令转换为 SCSI 命令。

郑重声明,使用 VirtIO SCSI 而非 VirtIO Block 具有三个与性能无关的优势:

  1. 它支持更多的设备。 VirtIO Block 为每个块设备提供一个 PCI 设备,这将设备数量限制在 21-24 个左右,而 VirtIO SCSI 仅使用一个 PCI 设备,并且可以处理该设备上绝对数量巨大的 LUN。
  2. VirtIO SCSI 将设备公开为常规 SCSI 节点,而 VirtIO Block 使用特殊的设备专业。 这通常不是很重要,但在从物理系统转换时会很有帮助。

编辑: VirtIO Block 现在支持 BLKDISCARD 感谢此提交:37b06f8d46fe602e630e4


-2
投票

您在修改后的configure.xml中启用了discard unmap:

discard='取消映射' />

这会动态擦洗块。

© www.soinside.com 2019 - 2024. All rights reserved.