SR-IOVとは?仮想マシンへの直接I/O割り当て技術をわかりやすく解説

SR-IOVとは?仮想マシンへの直接I/O割り当て技術をわかりやすく解説

7分で読めるテック
最終更新:

SR-IOV(Single Root I/O Virtualization)は、仮想化環境でのI/O性能を大幅に改善する技術です。仮想マシンがネットワークカードなどのPCIデバイスを直接使えるようにすることで、ハイパーバイザを経由するオーバーヘッドをなくします。

用語だけ見ると難しそうですが、「汎用サーバー」「アプライアンス」「仮想マシン」という3つの概念を順番に整理すると、自然と理解できます。

汎用サーバーとは?

サーバーとは、何らかのサービスを提供するコンピューターのことです。Webページの配信、メールの送受信、DNSの名前解決など、インターネットの裏側ではさまざまなサーバーが動いています。

そのなかで 汎用サーバー は、特定の用途に縛られずあらゆるサービスに対応できるサーバーのことを指します。ハードウェアもOSもアプリケーションも、汎用的に設計されているのが特徴です。

アプライアンスとは?

汎用の対義語が アプライアンス です。特定の目的や機能に特化した専用機器を指します。

たとえばファイアウォールアプライアンスであれば、ハードウェアの設計からOSまで、パケットフィルタリングに最適化されています。専用機器なので汎用サーバーより処理が速く、設定もシンプルになります。

SR-IOVとは?

ここまで理解できれば、SR-IOVの本質が見えてきます。

SR-IOV は、汎用サーバー上のPCIデバイス(ネットワークカードなど)を、複数の仮想マシンが直接共有して使えるようにする技術です。

通常の仮想化環境では、仮想マシンからのI/O要求はすべてハイパーバイザやホストOSを経由します。ハイパーバイザが仲介役として複数の仮想マシンからの要求をまとめ、物理デバイスとのやり取りを担います。

SR-IOVはこの仲介を省きます。SR-IOV対応のPCIデバイスは、自分自身を複数の仮想的なデバイス(VF: Virtual Function)に分割できます。各仮想マシンはこのVFを直接使うので、ハイパーバイザを経由しません。

【通常の仮想化】
  VM-A ─┐
  VM-B ─┼──▶ ハイパーバイザ ──▶ 物理NIC
  VM-C ─┘
  (ハイパーバイザが都度仲介・処理負荷あり)

【SR-IOV】
  VM-A ──▶ VF-1 ─┐
  VM-B ──▶ VF-2 ─┼──▶ 物理NIC(SR-IOV対応)
  VM-C ──▶ VF-3 ─┘
  (ハイパーバイザを経由せず直接I/O)

PCIパススルーとの違いは?

SR-IOVとよく比較される技術に PCIパススルー(PCI Passthrough)があります。どちらも仮想マシンが物理デバイスを直接使えるようにする点は同じですが、使い方が異なります。

PCIパススルーSR-IOV
デバイスの分割できない(1対1)できる(1台を複数VMで共有)
同時使用できるVM数1台のみ複数台
対応デバイスの要件比較的広いSR-IOV対応デバイスが必要

PCIパススルーは物理デバイスをそのまま1つの仮想マシンに割り当てるため、デバイスを専有します。SR-IOVはデバイス側が自分を複数の仮想デバイスに分割する仕組みを持っているため、複数の仮想マシンで同時に使えます。

SR-IOVで何が嬉しいのか?

ハイパーバイザを経由しないことで、いくつかのメリットがあります。

  • レイテンシの削減: 仲介処理がない分、I/Oの遅延が小さくなります
  • ハイパーバイザのCPU負荷軽減: 多数の仮想マシンが高頻度でI/Oするような環境では、ハイパーバイザの処理コストが馬鹿になりません。SR-IOVはこれを減らせます
  • スループットの向上: 物理NICの帯域を複数VMが効率よく使えます

とくにネットワーク集約型のワークロード(パケット処理・ストレージトラフィックなど)で効果が出やすい技術です。SR-IOV対応のPCIデバイスが持つ自己分割機能を使い、複数の仮想マシンがハイパーバイザを介さずに直接I/Oできる点が本質で、汎用サーバー上でアプライアンス的な専用処理を実現しながら複数VMで共有できるのがPCIパススルーにはない特徴です。

PF(Physical Function)とVF(Virtual Function)の関係

SR-IOVを理解するうえでPFとVFという2つの概念が重要です。

PF(Physical Function) は物理デバイスそのものが持つ機能インターフェイスです。SR-IOV対応デバイスはPFを通じて自分自身を複数のVFに分割する設定を受け付けます。VFの有効化や数の設定はPFを通じて行われます。

VF(Virtual Function) はPFが生成する仮想的なデバイスです。各VFは独立したPCI設定空間を持ち、それぞれが仮想マシンに割り当てられます。VFはデータ転送機能を持ちますが、デバイス全体の設定変更はPFからしか行えません。

Linuxでは sysfs を通じてVFの数を設定できます。

# NICのVFを4つ有効化する(デバイス名は環境による)
echo 4 > /sys/class/net/eth0/device/sriov_numvfs

このコマンドでPCIデバイスが4つのVFを生成し、各VMにアタッチできる状態になります。

SR-IOVの制限事項

SR-IOVには対応デバイスが必要という条件のほかにも、いくつか制約があります。

  • ライブマイグレーションへの影響: 仮想マシンが物理デバイスに直接紐付くため、通常のライブマイグレーション(別ホストへの移動)が難しくなります。ハイパーバイザを介していないため、デバイスを抽象化するレイヤーがありません。
  • IOMMU の有効化が必要: SR-IOV を安全に動かすには CPU・マザーボード・OS の3層でIOMMU(Intel VT-d / AMD-Vi)を有効にする必要があります。IOMMUがないとVFが他のVMのメモリにアクセスできてしまいます。
  • VFの数に上限がある: デバイスによって生成できるVFの最大数が決まっています。デバイスのスペックシートで確認できます。

クラウド基盤やNFV(Network Functions Virtualization)環境で広く使われている技術ですが、設定には物理レイヤーの知識が必要です。

質問・リクエストを送る

記事についての質問や、取り上げてほしいテーマがあればお気軽にどうぞ。いただいた質問はブログ記事として回答し、Q&Aページで公開することがあります。

このサイトについて

井上 周(Amane Inoue)の個人ブログです。技術・読書・ドラマ・旅・大学生活のことを書いています。