はじめに
仮想化環境において、ストレージ 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 にもデメリットがあります。
| 項目 | qcow2 | raw |
|---|---|---|
| 性能(レイテンシ) | メタデータ参照と 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)はネットワーク最適化に進みます。

