VMware vSphere DirectPath I/O 設定ガイド:仮想マシンへのPCIeデバイスパススルー

VMware tutorial - IT technology blog
VMware tutorial - IT technology blog

高負荷ワークロードの処理は、仮想化基盤において常に頭を悩ませる課題です。AIの学習や大規模データベース、10GbE/40GbEファイアウォールなどを運用する際、ESXiハイパーバイザーがI/O処理に介入することによる遅延(レイテンシー)は、パフォーマンスを著しく低下させる要因となります。筆者が管理する8台のESXiホストクラスターでも、vSwitch経由で毎秒数十万パケットを処理する際にCPUボトルネックが発生した経験があります。このボトルネックを根本から解消する鍵となるのが、DirectPath I/Oです。

仮想マシンにハードウェアを割り当てる3つのアプローチ

リソース要件や予算に応じて、主に3つの選択肢があります。

  • 標準的な仮想化(エミュレーション/準仮想化): ESXiがVMXNET3やLSI Logic SASなどの仮想アダプターを提供します。すべてのI/OコマンドはホストのCPUを介して処理されます。柔軟性は最も高いものの、高負荷時にはホストのCPUリソースを大幅に消費します。
  • ハードウェアの共有(vGPU / SR-IOV): 物理ハードウェアを複数の仮想ファンクション(VF)に分割し、複数の仮想マシンで共有します。ただし、高額なライセンス費用(NVIDIA AI Enterpriseなど)や専用ドライバーの導入が必要です。
  • VMware DirectPath I/O(PCIeパススルー): IOMMU(Intel VT-dまたはAMD-Vi)を経由して、PCIeコントローラーの完全な制御権を特定の1台の仮想マシンに直接割り当てます。ハイパーバイザーはデータフローに一切介入しません。

DirectPath I/O使用時のトレードオフ

高いパフォーマンスには常にトレードオフが伴います。有効化する前に、運用上の制限事項を十分に検討しておく必要があります。

主なメリット

  • ベアメタル同等のパフォーマンス: ESXiカーネル層を完全にバイパスするため、I/O遅延が数十マイクロ秒からナノ秒レベルへと大幅に削減されます。
  • 帯域幅の最大化: 10GbE NICにおけるワイヤーレート(例: 9.4 Gbps)や、PCIe 4.0 NVMeドライブの数百万IOPSといった性能を余すところなく引き出せます。
  • 追加のライセンス費用が不要: 無償版のESXiからvSphere Standard / Enterprise Plusまで、標準機能として利用可能です。

事前に把握しておくべき制限事項

  • vMotionおよびDRSの利用不可: 仮想マシンは物理PCIeカードが搭載されているホストに固定されます。無停止メンテナンス時に別のホストへVMを移行することはできません。
  • スナップショットおよびFault Tolerance(FT)の非対応: ESXiはパススルーデバイスのメモリ状態のスナップショット取得やロックステップ同期を行うことができません。
  • 100%のメモリ予約(Memory Reservation)が必須: メモリのオーバーコミットは利用できなくなります。VMに割り当てたメモリ容量と同等の物理RAMをホスト側で完全に確保する必要があります。

推奨される実践的なユースケース

本番環境において、DirectPath I/Oが特に大きな効果を発揮する3つのユースケースを紹介します。

  1. 仮想ルーター/ファイアウォール(pfSense、OPNsense、VyOS): Intel X520/X710 10GbEカードをパススルーすることで、ネットワーク割り込み(interrupt)によるホストCPUの過負荷を防ぎつつ、ワイヤーレートでのルーティングを実現します。
  2. AI/データサイエンス向け仮想マシン: NVIDIA RTX 4090やA100などのGPUをまるごと1台のVMに割り当て、データサイエンスチーム向けのローカルLLMを稼働させることで、高額なvGPUライセンス費用を数万ドル規模で削減できます。
  3. ストレージサーバー(TrueNAS Core/SCALE): ITモードに設定したLSI SAS HBAカードをパススルーします。これにより、TrueNASが各物理ディスクのSMART情報を直接読み取り、ZFSプールをネイティブに管理できます。

ESXiにおけるDirectPath I/Oの実装手順

ステップ1:サーバーのBIOS/UEFIでIOMMUを有効化

サーバーを起動してBIOS/UEFI画面に入り、ハードウェア仮想化支援機能を有効にします。

  • Intel搭載システム: Intel Virtualization Technology (VT-x) および Intel VT for Directed I/O (VT-d) を有効にします。
  • AMD搭載システム: AMD-V および AMD IOMMU を有効にします。

ステップ2:SSH経由でPCIデバイスIDを確認

ESXiホストにSSHで接続し、ハードウェアのアドレス(バス番号)を取得します。

# ネットワーク機器、グラフィックカード、ストレージコントローラーを一覧表示
lspci | grep -iE "nvidia|ethernet|storage|lsi"

対象デバイスのバスアドレス(例: Intel X520-DA2 NICの場合は 0000:03:00.0)を控えておきます。

ステップ3:vSphere Clientでパススルーを有効化

  1. vSphere Client または ESXi Host Client にアクセスします。
  2. ホスト > 設定 > ハードウェア > PCIデバイス の順に移動します。
  3. パススルーの切り替え(Toggle Passthrough) をクリックします。
  4. ステップ2で確認したPCI IDを元に対象デバイスを検索し、チェックを入れて OK をクリックします。
  5. ネイティブドライバーを解放するためにシステムの再起動が求められた場合は、ESXiホストを再起動します。

ステップ4:仮想マシンにPCIeデバイスを割り当て

  1. 仮想マシンの電源をオフにします(Power Off)。
  2. 対象の仮想マシンを右クリックし、設定の編集(Edit Settings) を選択します。
  3. 新規デバイスの追加(Add New Device) > PCIデバイス(PCI Device) を選択します。
  4. 追加されたデバイスの項目で、ステップ3で有効化したハードウェアカードを選択します。
  5. メモリ(Memory) セクションを展開し、すべてのゲストメモリを予約(すべてロック)(Reserve all guest memory (All locked)) にチェックを入れます。これはDMA(Direct Memory Access)を安定動作させるための必須設定です。
  6. 設定を保存し、仮想マシンの電源をオンにします。

ステップ5:ゲストOS側での認識確認

Linux仮想マシンにログインし、ドライバーのロード状況を確認します。

# ゲストOSがPCIeデバイスを認識しているか確認
lspci -nnk | grep -iA 3 "ethernet\|vga\|3d\|storage"

# カーネルが直接ドライバー(ixgbe、nvidiaなど)をロードしていることを確認
dmesg | grep -iE "pci|iommu"

カードの名称とメーカー純正のドライバーが正しく表示されていれば、設定は完了です。これにより、仮想マシンはハードウェア本来の性能をフルに発揮して動作する準備が整いました。

Share: