为什么virtio-scsi比我实验中的virtio-blk慢得多(over和ceph rbd image)?

时间:2016-08-19 05:05:24

标签: performance qemu libvirt scsi block-device

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

我所做的是使用OpenStack Juno设置虚拟机,这给了我rbd设置的virtio-blk。然后我修改了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>

软件版本为:

qemu 2.5.1

libvirt 1.2.2

内核 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似乎没有。

2 个答案:

答案 0 :(得分:1)

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

VirtIO Block具有以下层:

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 Block命令转换为SCSI命令。

但是,对于记录,使用VirtIO SCSI而不是VirtIO Block有三个与性能无关的好处:

  1. 它支持更多设备。 VirtIO Block每个块设备暴露一个PCI设备,这限制了大约21-24个设备,而VirtIO SCSI只使用一个PCI设备,并且可以处理该设备上绝对天文数量的LUN。
  2. VirtIO SCSI支持SCSI UNMAP命令(ATA术语为TRIM,Linux内核术语为DISCARD)。如果您使用精简配置存储,这一点非常重要。
  3. VirtIO SCSI将设备公开为常规SCSI节点,而VirtIO Block则使用特殊设备。这通常非常重要,但在从物理系统转换时可能会有所帮助。

答案 1 :(得分:-2)

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

<driver name='qemu' type='raw' cache='writeback' discard='unmap' />

这会动态擦洗块。