12

こんにちは、最近、qemu ターゲットを介して virtio-scsi over rbd の実験を行い (その DISCARD/TRIM サポートのために)、スループットと iops を、ゲストで fio を使用して、同じマシン上で rbd セットアップを介した virtio-blk のスループットと iops と比較しました。 . シーケンシャル読み取り/書き込みのスループットは 7 分の 1 (42.3MB/s 対 309MB/秒) であり、ランダム読み取り/書き込みの iops は 10 分の 1 (546 対 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>

ソフトウェアのバージョンは次のとおりです。

qemu 2.5.1

libvirt 1.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 では利用できないようです。

4

2 に答える 2

3

簡単な答えは、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 SCSI は、VirtIO ブロックとは別の変換レイヤーを通過する必要があります。

ローカル デバイスを使用するほとんどの場合、結果として遅くなります。ただし、逆の場合もある奇妙な特定のケースがいくつかあります。つまり、次のとおりです。

  • ホスト SCSI LUN の VirtIO SCSI アダプターへの直接パススルー。これは、ホスト側のブロック レイヤーをバイパスするため、わずかに高速です。
  • iSCSI デバイスへの QEMU ネイティブ アクセス。これは、ホスト ブロックと SCSI レイヤーを完全に回避し、VirtIO ブロック コマンドから SCSI コマンドに変換する必要がないため、高速な場合があります。

記録として、VirtIO ブロック上で VirtIO SCSI を使用することには、パフォーマンスに関連しない 3 つの利点があります。

  1. はるかに多くのデバイスをサポートしています。VirtIO ブロックはブロック デバイスごとに 1 つの PCI デバイスを公開するため、約 21 ~ 24 個のデバイスに制限されますが、VirtIO SCSI は 1 つの PCI デバイスのみを使用し、そのデバイス上で絶対に天文学的な数の LUN を処理できます。
  2. VirtIO SCSI は、SCSI UNMAP コマンド (ATA 用語では TRIM、Linux カーネル用語では DISCARD) をサポートしています。これは、シン プロビジョニング ストレージを使用している場合に重要です。
  3. VirtIO SCSI はデバイスを通常の SCSI ノードとして公開しますが、VirtIO ブロックは特別なデバイス メジャーを使用します。通常、これはあまり重要ではありませんが、物理システムから変換する場合に役立ちます。
于 2017-08-03T14:50:09.767 に答える