web-dev-qa-db-ja.com

KVMゲストioはホストioよりもはるかに遅い:それは正常ですか?

CentOS 6.3でQemu-KVMホストシステムをセットアップしています。ソフトウェアRAID10で動作する4台の1TB SATA HDD。ゲストCentOS 6.3は別のLVMにインストールされます。ゲストのパフォーマンスはホストのパフォーマンスとほぼ同じだと言われていますが、私にはわかりません。私のI/Oテストでは、ホストシステムよりもゲストでのパフォーマンスが30〜70%遅いことが示されています。スケジューラを変更してみました(set elevator=deadline onホストおよびelevator=noop on guest)、セットblkio.weight cgroupで1000に、ioをvirtioに変更...しかし、これらの変更のどれも私に重要な結果を与えませんでした。これはゲストの.xml構成部分です。

<disk type='file' device='disk'>
  <driver name='qemu' type='raw'/>
  <source file='/dev/vgkvmnode/lv2'/>
  <target dev='vda' bus='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>

私のテストがあります:

ホストシステム:

イオゾンテスト

# iozone -a -i0 -i1 -i2 -s8G -r64k
                                                            random  random 
              KB  reclen   write rewrite    read    reread    read   write 
         8388608      64  189930  197436   266786   267254   28644   66642 

dd読み取りテスト:1つのプロセス、次に4つの同時プロセス

# dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct
1073741824 bytes (1.1 GB) copied, 4.23044 s, 254 MB/s

# dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=1024 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=2048 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=3072 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=4096
1073741824 bytes (1.1 GB) copied, 14.4528 s, 74.3 MB/s
1073741824 bytes (1.1 GB) copied, 14.562 s, 73.7 MB/s
1073741824 bytes (1.1 GB) copied, 14.6341 s, 73.4 MB/s
1073741824 bytes (1.1 GB) copied, 14.7006 s, 73.0 MB/s

dd書き込みテスト:1つのプロセス、次に4つの同時プロセス

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 6.2039 s, 173 MB/s

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test2 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test3 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test4 bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 32.7173 s, 32.8 MB/s
1073741824 bytes (1.1 GB) copied, 32.8868 s, 32.6 MB/s
1073741824 bytes (1.1 GB) copied, 32.9097 s, 32.6 MB/s
1073741824 bytes (1.1 GB) copied, 32.9688 s, 32.6 MB/s

ゲストシステム:

イオゾンテスト

# iozone -a -i0 -i1 -i2 -s512M -r64k
                                                            random  random
              KB  reclen   write rewrite    read    reread    read   write
          524288      64   93374  154596   141193   149865   21394   46264 

dd読み取りテスト:1つのプロセス、次に4つの同時プロセス

# dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=1024
1073741824 bytes (1.1 GB) copied, 5.04356 s, 213 MB/s

# dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=1024 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=2048 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=3072 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=4096
1073741824 bytes (1.1 GB) copied, 24.7348 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.7378 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.7408 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.744 s, 43.4 MB/s

dd書き込みテスト:1つのプロセス、次に4つの同時プロセス

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 10.415 s, 103 MB/s

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test2 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test3 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test4 bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 49.8874 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.8608 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.8693 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.9427 s, 21.5 MB/s

私はその通常の状況か、何かを逃したのだろうか?

13
Evolver

パフォーマンスの調整はまだ終わっていません。

  <driver name='qemu' type='raw' cache='writethrough' io='native'/>

まず、使用するI/Oメカニズムです。

QEMUには2つの非同期I/Oメカニズムがあります。ワーカースレッドのプールを使用したPOSIX AIOエミュレーションとネイティブLinux AIOです。

XMLでio='native'またはio='threads'を設定して、これらのそれぞれをベンチマークします。

2つ目は、使用するキャッシュメカニズムです。 cache='writeback'cache='writethrough'を設定することも、cache='none'を使用して無効にすることもできます。

rawボリュームまたはパーティションを使用している場合は、キャッシュを完全に回避することをお勧めします。これにより、データのコピーとバスのトラフィックが減少します。

RAIDアレイがバッテリーでバックアップされている場合、またはデータを失う危険性がない限り、writebackを使用しないでください。 (もちろん、データが失われても問題がなければ、ご遠慮なく。)

第3に、バリアをオフにしたり、ゲストでデッドラインスケジューラを使用したりするのに役立つその他のいくつかのこと。

最後に、いくつかの調査を行います。 IBMは2010 Linux Plumbers Conferenceで非常に興味深い KVM I/Oパフォーマンス についてのプレゼンテーションを行いました。さらに、 KVMを使用する これは確かに重要です。

追伸長いシーケンシャルな読み取りと書き込みが実際のワークロードを表すことはほとんどありません。他のタイプのワークロード、理想的には本番環境で実行する予定の実際のアプリケーションでベンチマークを実行してみてください。

22
Michael Hampton