嗨,我最近做了一次通过qemu目标通过rbd在virtio-scsi上进行实验(以支持其DISCARD/TRIM),并在同一台计算机上使用了 guest 中的fio,将吞吐量和iops与在同一台机器上的virtio-blk over rbd设置进行了比较。 。依次读写的吞吐量比原来小7倍(42.3MB/s和309MB/s),随机读写的iops则小10倍(546与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中似乎不可用。

最佳答案

简单的答案是,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块相比,VirtIO SCSI必须经过另一个转换层。

对于大多数使用本地设备的情况,结果将变慢。在一些奇怪的特殊情况下,有时有时会出现相反的情况,即:
  • 直接将主机SCSI LUN传递到VirtIO SCSI适配器。由于它绕过了主机端的块层,因此速度稍快一些。
  • QEMU对iSCSI设备的 native 访问。有时这样做会更快,因为它完全避免了主机块和SCSI层,并且不必从VirtIO Block命令转换为SCSI命令。

  • 记录下来,在VirtIO Block上使用VirtIO SCSI具有三个与性能无关的好处:
  • 它支持更多设备。 VirtIO Block在每个块设备上公开一个PCI设备,这限制了大约21-24个设备,而VirtIO SCSI仅使用一个PCI设备,并且可以处理该设备上绝对数量的LUN。
  • VirtIO SCSI支持SCSI UNMAP命令(ATA术语为TRIM,Linux内核术语为DISCARD)。如果您使用的是精简配置存储,那么这一点很重要。
  • VirtIO SCSI将设备公开为常规SCSI节点,而VirtIO Block使用特殊的主设备。通常这不是很重要,但是从物理系统转换时可能会有所帮助。
  • 关于performance - 为什么在我的实验中virtio-scsi比virtio-blk慢得多(over和ceph rbd图像)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39031456/

    10-10 12:28