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 を開ける
経路を 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-IOV | Single 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 Switch | NIC に内蔵された L2 スイッチ。宛先 MAC で各 VF のキューにハードで振り分ける。NDIS (Windows) の言い方 |
| eSwitch / VEB | NIC Switch の別名。eSwitch は Mellanox / NVIDIA 流、VEB (Virtual Ethernet Bridge) が中立な正式名 |
| VPort | NIC Switch の差し込み口。PF / 各 VF に 1 対 1 で繋がる。既定 VPort が PF、VM 起動ごとに非既定 VPort が VF に生える |
| PCIe パススルー | PCIe デバイス (VF) を丸ごと VM に直接見せる仕組み |
| vNIC | ソフトが描く仮想 NIC。VF (ハード) とは別物 |
| IOMMU | VF の 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 実装版が読める。