gpt4 book ai didi

performance - 为什么在我的实验中 virtio-scsi 比 virtio-blk 慢得多(超过和 ceph rbd 图像)?

转载 作者:行者123 更新时间:2023-12-04 02:31:58 74 4
gpt4 key购买 nike

嗨,我最近通过 qemu 目标(因为它的 DISCARD/TRIM 支持)在 rbd 上进行了 virtio-scsi 实验,并将吞吐量和 iops 与在同一台机器上通过 rbd 设置的 virtio-blk 的吞吐量和 iops 进行了比较,在 guest 中使用 fio .结果是顺序读写的吞吐量小 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 SCSI 与 VirtIO Block 相比,还要经过另一个转换层。

对于使用本地设备的大多数情况,结果会更慢。有一些奇怪的特定情况,但有时反过来是正确的,即:
  • 主机 SCSI LUN 到 VirtIO SCSI 适配器的直接传递。这稍微快一点,因为它绕过了主机端的块层。
  • QEMU 对 iSCSI 设备的 native 访问。这有时会更快,因为它完全避免了主机块和 SCSI 层,并且不必从 VirtIO 块命令转换为 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 慢得多(超过和 ceph rbd 图像)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39031456/

    74 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com