2016-08-19 7 views
3

こんにちは私は最近、qemuターゲット(そのDISCARD/TRIMサポート用)を通してrbdを介してvirtio-scsiの実験を行い、同じマシン上のrioセットアップ上のvirtio-blkのスループットとiopsを比較しました。お客様。シーケンシャルリードライトのスループットは7倍(42.3MB/s対309MB/s)、ランダムリードライトのiopsは10倍(546対5705)です。virtio-scsiは私の実験ではvirtio-blkよりもはるかに遅いのはなぜですか(over and ceph rbd image)?

私が行ったことは、OpenStack Junoを使って仮想マシンをセットアップして、virtio-blk over rbdセットアップを実行していたことです。これに

<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の設定] XMLに関連する部分を修正しましたlibvirt 1.2.2

カーネル 3.18.0-031800ジェネリック#201412071935 SMP月12月8日午後12時36分34秒UTC 2014 x86_64版(​​Ubuntuの14.04カーネル)

そして、ハイパーバイザは、KVMです。

virtio-scsiとvirtio-blkのパフォーマンスの差はそれほど大きくないとは思えません。だから私が間違っていたこと、そして合理的なパフォーマンスを達成する方法を指摘してください。

制約があるのは、多くのパッチやコーディングをしなくてもOpenStack(Junoの場合は理想的です)に適したソリューションが欲しいということです。たとえば、virtio-scsi + vhost-scsi + scsi-mqについて聞いたことがありますが、現在はOpenStackでは利用できません。

答えて

-1

あなたの修正configure.xmlにアンマップ捨てる有効:

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

これはその場でブロックをスクラブ。

+0

これは質問に答えるためです...? – rustyx

+1

いいえ、そうではありません。あなたがゲストで 'fstrim'を呼び出すまで、または' discard'オプション、 'rm'でマウントすると、unmapを実行することはありません。 –

1

単純な答えは、VirtIO-SCSIはVirtIO-Blockよりも少し複雑です。 hereから簡単な説明を借りれ:

のvirtio SCSIが持っているのに対し
guest: app -> Block Layer -> virtio-blk 
host: QEMU -> Block Layer -> Block Device Driver -> Hardware 

は次のようになります:

本質的には
guest: app -> Block Layer -> SCSI Layer -> scsi_mod 
host: QEMU -> Block Layer -> SCSI Layer -> Block Device Driver -> Hardware 

、のvirtio SCSIは別を通過しなければならない

のvirtioブロックは、以下の層を持っていますVirtIO Blockと比較して、

ローカルデバイスを使用するほとんどの場合、結果として処理が遅くなります。

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

しかし、3つの非パフォーマンス関連の利点があるvirtioブロック上のvirtio SCSIを使用してあります。

  1. それははるかに多くのデバイスをサポートしています。 VirtIO Blockはブロックデバイスあたり1つのPCIデバイスを公開します。これにより、約21〜24デバイスに制限されますが、VirtIO SCSIはPCIデバイスを1つしか使用せず、天文学的な数のLUNを処理できます。
  2. VirtIO SCSIは、SCSI UNMAPコマンド(Linuxカーネル用語ではATA用語ではDISIM、TRIM)をサポートしています。薄くプロビジョニングされたストレージの場合は、これが重要です。
  3. VirtIO SCSIはデバイスを通常のSCSIノードとして公開しますが、VirtIO Blockは特別なデバイスメジャーを使用します。これは通常はあまり重要ではありませんが、物理システムから変換する場合に役立ちます。
関連する問題