手当たり次第に書くんだ

飽きっぽいのは本能

VM パフォーマンス Day4: ストレージ最適化

はじめに

仮想化環境において、ストレージ I/O は最も遅く、最も複雑で、最もボトルネックが発生しやすいレイヤです。ディスクアクセスは CPU やメモリよりも桁違いにレイテンシが大きく、仮想化レイヤを経由することでその遅延がさらに増幅されます。

本記事では、以下の 4 つを中心にストレージ I/O の最適化手法を整理します。

  • virtio-blk / virtio-scsi
  • raw イメージと qcow2 の違い
  • io_uring の活用
  • NVMe パススルーによる最短経路化

ストレージはネットワーク以上に “経路の短さ” が性能に直結します。

virtio-blk / virtio-scsi の基本構造

一般的な VM のストレージ I/O は、次のような経路を通ります。

VM → virtio-blk / virtio-scsi → QEMU → ホスト I/O スタック → NVMe / SSD

この経路には以下のようなオーバーヘッドが存在するため、物理環境に比べてレイテンシが大きくなり、IOPS も低下します。

  • virtio キューの管理
  • QEMU によるエミュレーション
  • ホスト OS の I/O スケジューラ
  • 多段キャッシュの整合性

virtio-blk と virtio-scsi の違いは以下の通りです。

virtio-blk:

  • 単純でオーバーヘッドが少ない
  • 1 つのキューのみ
  • 小規模 VM や一般用途に適している

virtio-scsi:

  • マルチキュー対応
  • 大量 I/O、複数ディスクを扱う環境に適する
  • スケールさせたい場合に有効

どちらも virtio 系ドライバなので、基本的には十分高速です。しかし、より高い性能が要求されるケースでは限界が見えてきます。

性能面における raw イメージの推奨

qcow2 はスナップショット・圧縮・シンプロビジョニングなどの機能を持つ便利な形式ですが、性能面では raw イメージに劣ります。

qcow2 のボトルネック

  • メタデータ(L1/L2 テーブル)の参照が必要
  • COW(Copy-On-Write)による追加書き込み
  • クラスタ単位での I/O が発生
  • ランダム I/O が遅くなりやすい

特に高頻度のランダムライトでは顕著に遅延が発生します。

raw イメージは最短ルート

raw イメージはメタデータ層がなく、物理ディスクに直接対応するため、次のようなメリットがあります。

  • オーバーヘッドが最小
  • 一貫したレイテンシ
  • シーケンシャル/ランダム I/O ともに安定
  • ストレージキャッシュとの相性が良い

性能重視の VM では、基本的に raw を選択すべきです。

qcow2 と raw イメージの比較

以下の表の通り、raw にもデメリットがあります。

項目qcow2raw
性能(レイテンシ)メタデータ参照と COW で遅め最短ルートで速い
ランダム I/O遅くなりやすい安定して高速
スナップショットあり(強み)なし
圧縮・暗号化ありなし
thin provisioningありなし(事前にフル確保)
運用の柔軟性高い低め
ディスク使用効率初期は小さく後で拡張最初からフルサイズ
典型的な用途一般的な VM 用途性能要求の高い OSD バックエンドなど

raw の一番のデメリットは thin provisioning(必要容量に応じた段階的な割り当て)ができない点です。具体的には、ホストのファイルシステム上で指定サイズぶんのストレージ領域を即時に確保します。

このため、raw は高い IOPS が求められる Ceph OSD バッキングストアのような用途に限定して用い、通常の VM ディスクは qcow2 を選択すると、性能と柔軟性のバランスを取ったシステム設計になります。

io_uring による I/O 多重化の高速化

Linux カーネル 5.x 以降で利用可能になった io_uring は、従来の AIO よりも効率的に非同期 I/O を処理できる仕組みです。

KVM/QEMU は io_uring をサポートしており、ストレージ I/O を高速化できます。

io_uring の利点

  • システムコール回数が減る
  • カーネルとユーザー空間のコピーが減る
  • キュー処理が高速
  • レイテンシが安定しやすい

virtio-blk / virtio-scsi との組み合わせでは、特に IOPS の伸びと遅延削減が期待できます。

適用シーン

  • 高頻度のランダム I/O
  • DB / メッセージングシステム
  • ストレージ VM(Ceph OSD など)
  • ストレージがボトルネックになりやすいアプリケーション

NVMe パススルー

NVMe デバイスを VM に直接パススルーする方法は、ストレージ最適化の中で最も効果が大きい手法です。

virtio や QEMU を完全に迂回するため、ほぼ物理ディスクと同じ性能を得られます。

NVMe パススルーのメリット

  • レイテンシが最小
  • IOPS が最大
  • カーネル/QEMU のオーバーヘッドを排除
  • キャッシュ・キュー構造が物理と同一

SR-IOV を利用可能な NVMe(最新 SSD)では、VM へ VF を直接渡すことも可能ですが、現時点では一般的に使用されていません。

注意点

  • ライブマイグレーション不可
  • ホスト側で柔軟な管理ができない
  • NUMA ノードの整合性(Day2/Day3 の再確認が必須)

NVMe パススルーは、“性能最優先” の用途で採用するのが基本です。

IOMMU の最適化

パススルーを行う場合でも、IOMMU(Intel VT-d / AMD-Vi)がボトルネックになることがあります。

最適化としては、iommu=pt(Pass-Through モード)がよく使われます。

これにより、IOMMU のアドレス変換コストが削減され、ストレージ I/O が安定します。

まとめ

ストレージ性能は、CPU やメモリと比べてレイテンシが大きく、大きな性能差が出やすい領域です。そのため、次の方針が非常に重要です。

  • 余計なレイヤを排除する(raw / io_uring)
  • virtio → QEMU → ホスト OS という多段構造を最小化する
  • 可能であれば NVMe を直接パススルーする

Day2・Day3 と同様、NUMA と CPU 設計が正しいことも前提になります。

次回(Day5)はネットワーク最適化に進みます。

VM パフォーマンス Day4: ストレージ最適化

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る