web-dev-qa-db-ja.com

QEMU + KVM + LVM-ブロックデバイスドライブとファイルイメージのパフォーマンス

仮想マシンの新しいセットアップを作成し、どのストレージ方式が最も高速かをテストしています。私のテスト環境は、LUKS上のLVMを備えたHDDドライブで構成されています。仮想マシンドライブ用に単一のLVを作成し、それを両方のテストに再利用して、HDDドライブ上の同じ場所を維持し、一貫したパフォーマンスを維持しました(HDD読み取り/書き込み速度は物理的な位置に依存します)。

  • ホスト:Arch Linux、カーネル4.12.8
  • ゲスト:Ubuntuデスクトップ17.04

コマンドでテストされたパフォーマンス:

    dd if=/dev/zero of=test bs=16M count=100 conv=sync

最初のテスト:仮想マシンのドライブとしてLVを直接使用

コマンド:

qemu-system-x86_64 \
  -drive format=raw,file=/dev/mapper/vg_vm-lv_vm_test,if=virtio,aio=native,cache.direct=on \
  -net nic,model=virtio \
  -Net User \
  -vga virtio \
  -display gtk,gl=on \
  -smp 3 \
  -cpu Host \
  -machine type=pc,accel=kvm \
  -m 3G

結果(各値は1回の実行を表します):

  • 新しいファイルの作成:98.4 MB/s; 112 MB /秒
  • 既存のファイルへの書き込み:62.5 MB /秒。 68.7 MB /秒、 64.8 MB /秒

2番目のテスト:LVでext4を作成し、その上にrawイメージファイルを配置する

コマンド:

qemu-system-x86_64 \
  -drive format=raw,file=./ubuntu_17,if=virtio,aio=native,cache.direct=on \
  -net nic,model=virtio \
  -Net User \
  -vga virtio \
  -display gtk,gl=on \
  -smp 3 \
  -cpu Host \
  -machine type=pc,accel=kvm \
  -m 3G

結果(各値は1回の実行を表します):

  • 新しいファイルの作成:254 MB/s; 242 MB /秒
  • 既存のファイルへの書き込み:187 MB/s; 189 MB /秒; 190 MB /秒

3番目のテスト:仮想マシンのドライブとしてLVを直接使用し、さまざまな設定

コマンド:

qemu-system-x86_64 \
  -drive format=raw,file=/dev/mapper/vg_vm-lv_vm_test,if=virtio,cache=none \
  -net nic,model=virtio \
  -Net User \
  -vga virtio \
  -display gtk,gl=on \
  -smp 3 \
  -cpu Host \
  -machine type=pc,accel=kvm \
  -m 3G

結果(各値は1回の実行を表します):

  • 新しいファイルの作成:129 MB/s; 125 MB /秒
  • 既存のファイルへの書き込み:103 MB/s; 97 MB /秒; 81.9 MB /秒

質問

明らかにこれら2つのソリューションには違いがありますが、ホストのファイルシステムのオーバーヘッドがないはずなので、RAWブロックデバイスは少なくともイメージファイルと同じ速さであると期待していました。ファイルイメージの間にキャッシュが発生するか、ローブロックデバイスのオプションが最適ではないと思います。この場合、生のLVが遅いのはなぜですか?パフォーマンスを向上させるにはどうすればよいですか?または、それだけで遅くなるのであれば、なぜですか?

編集: http://www.linux-kvm.org/page/Tuning_KVM の設定を使用して3番目のテストケースを追加しました。ファイルイメージよりも少し高速ですが、まだ低速であることがわかります。また、既存のファイルを実行するたびに速度が低下することも確認しました。ただし、ファイルの上書きによってフラグメンテーションが発生することはないため、なぜそれが発生するのかはわかりません。

6

ブロックサイズの不一致が問題である可能性があります。

ファイルシステムをメディアの基本的なブロックサイズと一致させることが理想的です。あなたがブロックサイズのために選んだものを共有しなかった間、私はあなたがExt4試行のために4キロバイトとLVのために512バイトを持っていると思います。基盤となるメディアの自然なブロックサイズが4キロバイトの場合、これは速度の問題と速度の低下の両方を説明していると思います。 4kブロックに512を書き込むだけなので、ブロックの75%が無駄になり、その後の書き込みではより多くのブロックが使用され、オーバーヘッドと無駄が増えます。

基になるメディアブロックサイズと一致するファイルシステムブロックサイズを使用して、テストを再試行します。この場合、4kブロックサイズでLVを試してください。

LVMはExt4よりも少し多くのオーバーヘッドを追加します。 Stack Overflow Answer だから、これが少し遅い理由を説明していると思います。 :)

6
David Aubin