web-dev-qa-db-ja.com

kvm低IOパフォーマンス

私のセットアップのパフォーマンスはかなり良いです(geekbench、それがどのように「感じる」...)ディスクのスループット(raw lvm-partitionのlibvirt)もサーバーのrawパフォーマンスに非常に近いですbut IOP/sは、LinuxとWindowsゲストの両方で、ゲストサイドが100〜200(ホストサイドが1000に比べて)と低くなっています。
これは一緒に暮らすためのものですか(kvmはそれをうまく実行できません)、それとも完全に間違っていることをしていますか?

興味深いのは、セットアップ(qcow2とrawイメージとrawパーティション)または構成(キャッシュまたはioスケジューリング)とバリエーションを変更することでスループットに影響を与えることができたが、IOPはそれらすべてで同じ低点に留まったことです組み合わせ。

ハードウェア#

•24GB RAMを備えたsupermicroデュアルxeon E5520
•2xシーゲイトコンステレーション1TB(Adaptec 3405のRAID1)
•2xシーゲイトチーター(Adaptec 6405のRAID1)。

ソフトウェア

•ubuntu 11.10 3.0.0-13-server
•kvm/QEMUエミュレータバージョン0.14.1(qemu-kvm-0.14.1)
•ホストとゲストからのディスク(bonnie ++、hdparm)のベンチマーク(Windowsでは、bonnie ++、hdparm、hdtune)

設定

私はいくつかのディスク構成をテストしましたが、現在の設定は次のとおりです。

linuxホスト

(高IOパフォーマンスを「必要としない」だけなので、より快適なディスクファイルを保持します)
•星座上のlvm上のqcow2ディスクファイル
•qemu/ide

<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source file='/media/vm/images/mex/mex_root.qcow2'/>
  <target dev='hda' bus='ide'/>
  <address type='drive' controller='0' bus='0' unit='0'/>
</disk>

windowsホスト###

(SQL-ServerとRemote-Desktop-Servicesを実行しているので、ここでは間違いなく優れたIOパフォーマンスが必要です)
•チーターのraw lvmパーティション
•virtio

<emulator>/usr/bin/kvm</emulator>
<disk type='block' device='disk'>
  <driver name='qemu' type='raw' cache='none'/>
  <source dev='/dev/Cheetah/mts'/>
  <target dev='vda' bus='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
6
phhe

最適な構成は(通常)以下のとおりです。

  1. ホストで、elevator=deadline
  2. Virtioとvirtioのみを使用する
  3. 可能な限り生のLVを使用してください。 Qcow2はオーバーヘッドを与えます。 FS上のファイルにもオーバーヘッドがあります
  4. VMでelevator=noop
  5. ホストとVMの両方で、noatime,nodiratime可能な限りfstab内
  6. Virtioドライバー、特にWindowsドライバーが最新であることを確認してください。
  7. Debianベースのディストリビューションは、(おそらく)QEMU/KVMのFedoraやRHELほど優れていません。フレームウォーを開始するわけではありませんが、ほとんどの開発とテストはFedoraとRHELで行われ、私自身の経験では、UbuntuとDebianでFedoraとRHELで再現できない多くの問題がありました。必要に応じてこの特定の箇条書きを無視できますが、解決策を探している場合は、通常、別のディストリビューションでの簡単なベンチマークを試す価値があります
8
dyasny

KVMを起動する前に、Host'sディスクのI/Oスケジューラとして「deadline」を設定してみてください。

 for f in /sys/block/sd*/queue/scheduler; do echo "deadline" > $f; done

I/Oバウンドロードがある場合、 このIBMペーパー が示唆するように、これが最良の選択かもしれません。

1
the-wabbit