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


13

CentOS 6.3でQemu-KVMホストシステムをセットアップしています。ソフトウェアRAID10で動作する4つの1TB SATA HDD。ゲストCentOS 6.3は別のLVMにインストールされます。ゲストのパフォーマンスはホストのパフォーマンスとほぼ等しいと人々は言いますが、私はそうは思いません。私のI / Oテストでは、ホストシステムよりもゲストでのパフォーマンスが30〜70%遅くなっています。スケジューラ(elevator=deadlineホストとelevator=noopゲストに設定)を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

その通常の状況なのか、何かを見逃したのかしら?


ゲストは、パフォーマンスが向上するvirtioのバスタイプを使用するように変更しましたが、これらのメリットを享受するにはvirtioドライバーをインストールする必要があります。あなたはそれらを使用しているかどうかは言わなかった。これらのドライバーがデフォルトでゲストに存在するかどうかについてコメントするほど十分にCentOSを知りません。
jwbensley

1
@javano CentOSには常にvirtioが含まれており、カーネルパッケージを再構築して明示的に削除する必要があります。
マイケルハンプトン

いつも知っておくと便利、歓声:)
jwbensley

回答:


21

パフォーマンスチューニングはまだ完了していません。

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

1つ目は、使用するI / Oメカニズムです。

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

これらのそれぞれのベンチマークを行うには、XMLのいずれio='native'io='threads'を設定します。

2番目は、使用するキャッシングメカニズムです。あなたは設定することができcache='writeback'cache='writethrough'またはあなたがそれをオフにすることができcache='none'ますが、実際には最高の作品を見つけることがあります。

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

writebackRAIDアレイがバッテリバックアップ式でない場合は使用しないでください。使用すると、データが失われる危険があります。(もちろん、データの損失が問題ない場合は、お気軽に。)

第三に、バリアをオフにすることや、ゲストでデッドラインスケジューラを使用することを含む他のいくつかのことです。

最後に、いくつかの調査を行います。IBM は2010 Linux Plumbers ConferenceでKVM I / Oパフォーマンスに関する非常に興味深いプレゼンテーションを行いました。さらに、KVMの使用に関する広範なベストプラクティスのセットがあり、これは確かに興味深いものです。

PS長時間のシーケンシャル読み取りおよび書き込みは、実際のワークロードを表すことはほとんどありません。他のタイプのワークロード、理想的には実稼働で実行する予定の実際のアプリケーションでベンチマークを実行してみてください。


「IOパターンでテストする」ための+1
ハビエル

ああ、IBM
Docsが

1
とても助かります、ありがとう!ホストのパフォーマンスにより、ゲストの結果が最大90%向上しました。私のせいは非常に愚かだった:virsh reset <domain>私のvirsh edit <domain>変更を適用しなかった、と私はゲストがvirtioを使用していたと信じていたが、実際にはそうしなかった。助けられただけがvirsh destroy <domain>続きvirsh start <domain>ます。Virtioのルール!;)
Evolver

1
cache = writebackは、実際のリスクを追加しません(重要なデータは危険ではなく、飛行中のデータのみであり、クラッシュ時に破棄されます)。cache = unsafeのみが行います。ライトバックは、追加のハードウェア要件を意味するものではありません(「バッテリーバックアップRAIDアレイ」は何の助けにもなりません)。HDD書き込みキャッシュと同じ整合性レベルがあり、オペレーティングシステムによって必要に応じて両方がフラッシュされます。
コルクマン

io='native'私の場合、ほぼ20〜30%の追加のWRITEパフォーマンスを与えました
rahul286
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.