質問
VMDK, VHDX などの抽象化層によるオーバーヘッドについて解説してください |
解答
いい観点ですね。 VMDK(VMwareの仮想ディスク形式)、VHDX(Hyper-Vの仮想ディスク形式)などは「仮想ディスクイメージファイル」であり、物理ストレージとゲストOSとの間に抽象化層を1枚挟む形になります。 これによって柔軟性や可搬性が得られますが、その分いくつかのオーバーヘッドが発生します。 オーバーヘッドの主な要 1. I/Oパスの多重化 * 物理環境ではアプリケーション → OSカーネル → デバイスドライバ → ストレージという流れ。 * 仮想環境では、さらに以下が入ります: * ゲストOSの仮想デバイスドライバ * ハイパーバイザのストレージ抽象化レイヤ * 仮想ディスクファイルの管理(VMDK/VHDXのメタデータ操作) → I/O処理が複数の層を通るため、遅延が追加されます。 2. 仮想ディスク形式のメタデータ管理 * 固定サイズディスク ファイルサイズが最初から確保されており、オーバーヘッドは比較的小さい。 * 可変サイズディスク (シンプロビジョニング) 書き込み時にブロックを都度割り当て、必要ならファイル拡張も発生。 * 新規割り当て時の遅延 * 断片化によるランダムアクセス性能低下 * メタデータ管理(割り当てマップ更新)のオーバーヘッド 3. ホストファイルシステムとの二重管理 仮想ディスクファイルは通常 ホストOSのファイルシステム上に存在します。 * ゲストOS側もファイルシステムを持っているため、二重の管理が走る。 * 例えばゲストで「1ファイルを作成」 → その書き込みは「ホスト上のVMDK/VHDXファイルの更新」として記録される。 * これによりキャッシュやジャーナリングの二重化が発生し、余計なI/Oが増える。 4. スナップショットの影響 * スナップショットを取ると、元ディスクは「読み取り専用」となり、新しい変更は差分ファイルに書き込まれる。 * このとき読み取りは「差分ファイル→元ディスク」の多段アクセスになるため、ランダムI/Oが増加して性能が落ちる。 * 差分チェーンが長いと遅延がさらに大きくなる。 5. 仮想化固有の最適化不足 * TRIM/UNMAP(未使用ブロック解放)がゲストからホストまで正しく伝わらないと、無駄な領域が残り続けて効率が悪化。 * I/Oスケジューリングがホスト・ゲスト双方で二重にかかる場合があり、スループット低下につながる。 実際の性能差 * 最新のハイパーバイザ(VMware ESXi, Hyper-V, KVM など)では最適化が進み、 物理ディスク直結(Raw Device MappingやPassthrough)と比べて 5〜15% 程度の性能差に収まるケースが多いです。 * ただし 可変サイズディスク+スナップショット多用+断片化 といった環境では、数十%の性能低下が起こり得ます。 まとめ * VMDK/VHDXは利便性(スナップショット、可搬性、管理性)のための抽象化層。 * オーバーヘッドの原因は「多段I/O」「メタデータ管理」「二重ファイルシステム」「スナップショット」など。 * 適切に運用すれば物理直結との差は10%程度まで抑えられる。 * 高性能が必須のDBサーバでは、RAID 10の物理ディスク直結やパススルーディスクが選ばれることもある。 |
|
|
この記事へのコメント