← 一覧へ戻る

Gemini が書いた記事

SR-IOV ── 1 枚の物理 NIC を、VM ごとの専用 NIC に見せる

「SR-IOV ってなんだ?」から始め、途中『NIC Switch に PF や VF があるんか?』で詰まった所までほどく。1 枚の物理 NIC を VM ごとの専用 NIC に見せる仕組みを、Azure の文脈から切り離して立て直した学習ログ。

俺の最初の疑問

SR-IOV のドキュメントを渡されて、まずは単純にこれやった ── SR-IOV ってなんだ?

一言で答えをもらった後、読み進めるうちにもう一段詰まった

NIC Switch に PF, VF があるんか?

だからこの記事は 2 段で進む。まず「一言でいうと何か」を置いて次に NIC の中身を 1 枚の図に開く。ここを曖昧にしたまま「VF を VM に割り当てる」と進むと、何がハードで何がソフトか分からんまま暗記になるから。

まず一言でいうと

SR-IOV = 1 枚の物理 NIC が、そのハードウェアの中で「おおもとの管理役 1 個 (PF) + VM 専用の通信口 (VF) 複数個」に分かれ、各 VF を 1 個まるまる、その VM の専有で直挿しする規格。

  • 普通の仮想化:VM の通信はホスト CPU 上のソフト仮想スイッチを 1 パケットずつ通る。
  • SR-IOV:VM は VF (NIC が切り出した本物の口) を直に持ち、データはホストを通らずに NIC と VM の間を直行する。

「ソフトのスイッチを通さず、NIC のハードが直接 VM に配る」── これが核。

何と比べるとわかるか ── NIC の中に「島ハブ」が 1 個ある

会社の島に置く L2 スイッチ (島ハブ) で考えると、最初の疑問がそのまま解ける。

NIC の中の部品島の LAN でいうと
NIC Switch島に置いたハブ (L2 スイッチ) 本体
VPort (Virtual Port)ハブの LAN ポート (差し込み口)
PF / VFポートに繋がる個々の PC (の NIC)

ここで最初の疑問への答えが出る:

何が問題なのか ── ソフトのスイッチが CPU を食う

なぜわざわざ NIC の中にスイッチを積むのか。ソフトの仮想スイッチが遅いから

SR-IOV 無しだと、全 VM の通信はホスト CPU 上のソフト仮想スイッチに集まる。パケットが来るたびに CPU が割り込み処理し、メモリ間でコピーする。結果:

  • レイテンシ・ジッタが出る
  • CPU コアを食う (その分 VM に回せるコアが減る)
  • 帯域が頭打ちになる

この「スイッチの仕事」をソフト (CPU) から NIC のハード (ASIC) に降ろすのが SR-IOV。だから速い。

図で見る ── 1 枚の NIC を開ける

NIC Switch の差し込み口 (VPort) に PF / VF が 1 対 1 で繋がる。宛先 MAC を見て NIC Switch が VF2 へ振り分け、VM2 まで直行。ホスト CPU / ソフト vSwitch は経路外。全部 NIC のハードの中。

経路を 1 本でいうと:外部 → 物理ポート → NIC Switch (宛先 MAC で振り分け) → VPort → VF → VM。ホストの CPU も、ソフトの仮想スイッチも、この線上に居ない。

混乱しやすいポイント

① NIC Switch は「ソフト」やなく「ハード」

設定 (コントロール) はソフトがやる ── ホスト OS (Hyper-V や PF ドライバー) が「VPort を作れ」「この VF に紐付けろ」と NIC のレジスタを叩く。でも通信 (データ) はハードだけで流れる。一度構成したら、パケットは NIC の電子回路の中で振り分けられ、CPU には上がらない。「決めるのはソフト、流すのはハード」と切ると正確。

② VF ≠ vNIC

ここを混ぜると沼る。

  • vNIC = ハイパーバイザーがソフトで描く仮想 NIC。データはホストの仮想スイッチを通る。
  • VF (Virtual Function) = NIC ハードが自分を論理分割して切り出した、本物の PCIe ファンクション。VM に丸ごと渡せる (PCIe パススルー)。

VF は PCIe の用語で、vNIC とは別物。

③ 「VF を VM に丸ごと渡す」── 物理は共有、論理は専有

「VF を VM に直挿しする」の丸ごとは、VF という口 1 個を、端数なく・その VM の専有で渡すという意味。物理 NIC 全部を 1 つの VM に明け渡すわけやない。

共有 (1 個の物理を全 VF で分け合う)VF が専有 (1 個まるまる 1 VM に)
ASIC・物理ポート・ケーブル・総帯域・振り分ける NIC Switch送受信キュー・レジスタ・割り込み・MAC

だから VF は「物理的に切り出した一枚の NIC」ではない。物理ポートは 1 本のままで、帯域は VF 間で取り合いになる。でも各 VF の中身 (キュー・レジスタ・MAC) は、その VM がハイパーバイザーを介さず直接・専有で操作する。「丸ごと渡す」が指してるのはこの論理の口 1 個の専有で、物理の独り占めではない。

④ IOMMU が無いと成立しない

VF を VM に直挿しすると、VF の DMA が VM のメモリに直接書く。このとき他の VM のメモリを踏まないよう、番地を見張るハードが IOMMU (Intel VT-d / AMD-Vi)。各 PF/VF に固有の識別子 (RID) が付き、IOMMU がどの通信がどの VM のものか判定してメモリ/割り込みを翻訳する。これが SR-IOV の安全装置。

たとえ話

SR-IOV = 1 枚の NIC の中に島ハブ (NIC Switch) を 1 個内蔵し、ポート (VPort) に PF と各 VF を挿した状態。外から来た荷物 (パケット) は、受付の人 (ホスト CPU) を呼ばずに、ハブが宛名 (MAC) を見て本人の机 (VF → VM) まで直接運ぶ。受付はハブの設置時に配線を決めるだけで、荷物の仕分けには出てこない。

出てきた言葉の変換表

出てきた言葉つまり何の話?
SR-IOVSingle Root I/O Virtualization。1 枚の物理 NIC を PF + 複数 VF に割り、VF を VM に直挿しする PCIe の標準規格 (PCI-SIG)
PF (Physical Function)NIC の本体・管理用ファンクション。ホスト OS が持ち、VF を切り出す
VF (Virtual Function)PF が切り出した VM 専用の口。本物の PCIe ファンクションで VM に直挿しできる
NIC SwitchNIC に内蔵された L2 スイッチ。宛先 MAC で各 VF のキューにハードで振り分ける。NDIS (Windows) の言い方
eSwitch / VEBNIC Switch の別名。eSwitch は Mellanox / NVIDIA 流、VEB (Virtual Ethernet Bridge) が中立な正式名
VPortNIC Switch の差し込み口。PF / 各 VF に 1 対 1 で繋がる。既定 VPort が PF、VM 起動ごとに非既定 VPort が VF に生える
PCIe パススルーPCIe デバイス (VF) を丸ごと VM に直接見せる仕組み
vNICソフトが描く仮想 NIC。VF (ハード) とは別物
IOMMUVF の DMA が他 VM のメモリを踏まないよう番地を見張るハード (VT-d / AMD-Vi)
ミニポートドライバーNIC を制御する Windows のドライバー。PF 用 (ホスト) と VF 用 (VM 内) がある
深掘りメニュー 次におすすめのトピック

NIC を割って VM に直挿しする核は掴めた。次は「割ったその先で何を載せるか」と「OS からどう見えるか」。

  • SmartNIC のオフロード (SR-IOV のその先) ── SR-IOV が外したのは「ソフトのスイッチ」という土管だけ。VXLAN・NAT・暗号化といった仕事はまだどこかの CPU がやる。それをカード側のシリコンに肩代わりさせる段。次はこれが効く。
  • ゲスト OS から VF と vNIC はどう見える・どう束ねる ── Hyper-V は 1 NIC に隠すが、Linux は 2 枚見えて bonding / net_failover で束ねる。ライブマイグレーションで VF が抜ける瞬間に vNIC へ落とすため。
  • Azure MANA ── クラウドが SR-IOV を自社シリコンで実装する世代。
  • 応用編: Azure Accelerated Networking ── この核が Azure で実際にどう焼かれてるか (VFP / GFT / FPGA)。Azure Accelerated Networking を開ける でこの図の Azure 実装版が読める。