Claude が書いた記事
Azure Accelerated Networking を開ける ── 決めるソフト (VFP)、流すハード (SmartNIC)
「オンにすると速くなる」AccelNet の中で何が起きてるか。VF・DMA・eSwitch・FPGA を開けて、ホスト CPU をバイパスしつつ SDN を効かせる仕掛けを追った学習ログ。
俺の最初の疑問
Azure の Accelerated Networking (AccelNet) は「オンにすると速くなる」のは知ってる。でも中で何が起きてるか分からんまま使ってた。基礎から開けたい。
途中で次々引っかかった。記事はこの順で潰していく。
- 全 VM が AccelNet を使う場合と使わない場合、何がどう違うんや?
- VF って何や?なんで vNIC と言わへんのや?
- DMA って何や?非 DMA は何て呼ぶ?
- eSwitch ってメラノックスの用語か?
- SmartNIC の中の ConnectX (NIC) と FPGA は別チップか?NVIDIA が作ってるんか?
まず一言でいうと
- AccelNet 無し:全 VM の通信が、ホスト CPU 上のソフト仮想スイッチ (VFP) を 1 パケットずつ通る → CPU 課税・レイテンシ・ジッタ。
- AccelNet 有り:SR-IOV で各 VM に VF (物理 NIC の論理スライス) を直挿しし、データはホストをバイパスして DMA で VM メモリへ直行。SDN ポリシーは SmartNIC のハードが適用する。
- 一言でいうと:決めるのはソフト (VFP)、流すのはハード (SmartNIC)。
図で見る ── AccelNet なし vs あり
何と比べるとわかるか ── 有人窓口 vs 自動改札
駅の改札で考える。
- AccelNet 無し= 改札に来る全員を有人窓口 (VFP = ソフト / CPU) が 1 人ずつ確認。正確だが遅いし、係員 (CPU) が出ずっぱりで埋まる。
- AccelNet 有り= 最初の 1 人だけ有人窓口で確認して「この IC はこの通り方」とルールを発行。以降は自動改札 (ハード) でタッチして素通り。しかも各人に専用レーン (VF) がある。
「決める (窓口 / ソフト)」と「通す (自動改札 / ハード)」を分けたのが AccelNet、と掴むと全部つながる。
何が問題なのか ── 速くしたいが、ポリシーは効かせたい
Azure の VM 通信には SDN ポリシーが乗ってる:NSG (ACL)、UDR (ルーティング)、LB の NAT、VNet の VXLAN カプセル化。これを昔は全部、ホスト CPU 上の VFP (Virtual Filtering Platform) がソフトで処理してた。
問題は、VFP が全パケットを CPU で捌くこと:
- レイテンシ・ジッタが出る
- CPU コアを食う(その分 VM に回せるコアが減る)
- 帯域が頭打ちになる
かといってポリシーを捨てるわけにはいかない。「速くしたいが、ポリシーは効かせたい」── このジレンマを解いたのが AccelNet。
仕組み① VF とは ── 物理は共有・論理は専有
VF (Virtual Function) は PCIe の用語で、vNIC (ソフトが描く仮想 NIC) とは別物。ここを混ぜると沼る。
- vNIC = ハイパーバイザがソフトで描く仮想 NIC。データはホストの vSwitch を通る。
- VF = NIC ハードが自分自身を論理的に分割した、本物の PCIe ファンクション。VM に丸ごと渡せる (PCIe パススルー)。
SR-IOV (Single Root I/O Virtualization) で、1 枚の物理 NIC が PF (Physical Function = 本体、ホストが持つ) と複数の VF を生やす。
VF の正体は「物理は共有・論理は専有」と分けると正確:
| 共有(1 個の物理) | VF が専有(論理だがハード裏打ち) | |
|---|---|---|
| 中身 | ASIC・物理ポート / PHY・ケーブル・総帯域・振り分ける eSwitch | PCIe コンフィグ空間 (BDF)・レジスタ (BAR)・送受信キュー・割り込み・MAC |
物理ポートは 1 本のまま。中で eSwitch (NIC 内蔵の L2 スイッチ) が宛先 MAC / VLAN で各 VF のキューに振り分ける。これが「多重化」の正体。
補足: 「合成 (synthetic)」は Hyper-V の用語
その「合成 vNIC」の synthetic は Hyper-V (= Azure) の言い方で、Azure 固有語ではない。中立な概念は 準仮想化 (paravirtualized) NIC ── ゲストが実ハードを真似ず、専用の効率的ドライバで話す方式。各プラットフォームで名前が違うだけ。
| プラットフォーム | 準仮想化 NIC の呼び名 | 仕組み / ドライバ |
|---|---|---|
| 中立な概念 | 準仮想化 (paravirtualized) デバイス | — |
| Hyper-V (Microsoft / Azure) | synthetic(合成) | netvsc・VMBus・VSP / VSC |
| KVM (Linux) | virtio (virtio-net) | virtio リングバッファ |
| VMware | VMXNET3 | vmxnet |
| Xen | PV ドライバ | netfront / netback |
なので Azure ドキュメントの “synthetic NIC” は、KVM でいう virtio と同じ準仮想化 NIC、と読み替えればいい。反対の「エミュレート(実ハードを真似る・遅い)」も中立語で全プラットフォーム共通。
仕組み② DMA とは ── デバイスが直接メモリに書く
VF が速い理由の核が DMA (Direct Memory Access)。デバイス (NIC) が RAM に直接データを出し入れする仕組みで、CPU が 1 語ずつ運ばない。
- 非 DMA = PIO (Programmed I/O):CPU が命令で 1 語ずつ読んで書く。転送中ずっと CPU が埋まる。
- DMA:CPU は「この番地に、この長さで」と渡すだけ。あとはデバイスの DMA エンジンが自分で RAM に転送し、終わったら割り込みで知らせる。CPU は両端だけ。
AccelNet では、VF の DMA エンジンが受信パケットをゲスト VM のメモリに直接書き込む (ホストの CPU / ハイパーバイザがコピーしない)。他人の VM のメモリを踏まないよう番地を見張るのが IOMMU。
仕組み③ 決めるソフト・流すハード ── slow / fast path と GFT
eSwitch は素のままだと MAC / VLAN で振り分けるだけ。Azure の rich なポリシー (NSG / UDR / NAT / encap) をどうハードに降ろすか。答えが slow path / fast path の分離。
- 新しいフローの最初の 1 パケット (slow path):ハードにルールが無い → ソフト (VFP) に上げる。VFP が全ポリシーを評価し、複数段のテーブルを 1 本の “unified flow” に畳んで、そのフロー専用ルールをハードに焼く (install)。
- 同じフローの 2 個目以降 (fast path):ハードのルールに一致 → SmartNIC の中だけで line rate 処理、CPU に二度と上がらない。
Azure ではこのハード側のフロー表を GFT (Generic Flow Table) と呼ぶ。
これは switchdev (NIC 内蔵スイッチを tc / OVS で programmable にする Linux モデル) の Azure 版にあたる。eSwitch の中立な正式名は VEB (Virtual Ethernet Bridge) で、eSwitch は Mellanox / NVIDIA 流の呼び名。
仕組み④ SmartNIC の中身 ── ConnectX と FPGA は別チップ
「SmartNIC」は中立な総称 (ただし曖昧)。中身を開けると、Azure の世代では別々の汎用チップが 2 個載ってる。
- Mellanox の NIC ASIC (ConnectX 系):SR-IOV / VF・DMA・RDMA・物理ポート。NIC の本業。
- Altera (Intel) の FPGA (Arria 10):GFT (SDN) を line rate で実行。再プログラム可能。
そして重要なのは、これを作ってるのは NVIDIA やなく Microsoft という点。Microsoft が汎用チップ 2 個を買って自前ボードに統合し、FPGA のロジック (GFT) を書いてる。NVIDIA が出てくるのは「2020 年に Mellanox を買収した親会社」としてだけ。
なぜ ASIC でも CPU でもなく FPGA か:
| 速さ | 柔軟さ(更新できるか) | |
|---|---|---|
| ASIC(焼き込み) | ◎ | ✕ 固い。SDN 仕様が変わると作り直し |
| CPU(VFP ソフト) | ✕ 遅い | ◎ |
| FPGA | ◎ ハード並み | ◎ 再プログラム可能 |
SDN は年単位で変わる。ASIC では追従できず、CPU は遅い。FPGA なら「ハードの速さ × ソフトの書き換え可能性」の中間が取れる。これが「流すハード」を柔らかいハードにした理由。
全部つなぐ ── 受信パケットが VM メモリに着くまで
ここまでの 4 部品(QSFP・FPGA・NIC・VF/DMA)を 1 本の経路でつなぐと、外から来たパケットが VM メモリに入るまでがこうなる(定常状態 = fast path)。
順番が肝:光 → FPGA (SDN を適用) → NIC (どの VM か決めて DMA) → VM メモリ。ホストの CPU と kernel はデータ経路に居ない。
混乱しやすいポイント
① VF ≠ vNIC
VF はハード (PCIe ファンクション)、vNIC はソフトの仮想 NIC。しかも AccelNet VM には両方同居し、bonding でライブマイグレーション時にフォールバックする。
② 「物理は共有・論理は専有」
VF は「物理的に切り出した一枚」ではない。物理 (ポート・帯域・ASIC) は共有、論理 (キュー・レジスタ・MAC) が専有。だから帯域は VF 間で取り合いになる。
③ eSwitch は Mellanox 寄りの語、中立は VEB
NIC 内蔵スイッチの中立な正式名は VEB (Virtual Ethernet Bridge)。さらに Azure 実機では、重い SDN は ConnectX 内蔵 eSwitch だけでなく別の FPGA (GFT) が担う。
④ SmartNIC は曖昧な総称
精密には DPU (NVIDIA) / IPU (Intel)、構造で ASIC 系 / FPGA 系 (Azure) / SoC 系 (BlueField) に分かれる。
⑤ ConnectX と FPGA は別の汎用チップ
NVIDIA が作ったボードではない。Microsoft が Mellanox の NIC チップ + Altera の FPGA を統合したもの。新世代 (Azure Boost / MANA) は Altera Agilex FPGA + Arm SoC を 1 枚に統合する方向。
たとえ話
- AccelNet なし = 全員を有人窓口 (VFP / CPU) で審査。あり = 最初の 1 人だけ窓口で確認して IC ルールを発行 (GFT に焼く)、以降は自動改札 (GFT / ハード) でタッチして素通り。各人に専用レーン (VF)。
- DMA = 宅配が倉庫 (RAM) に直送。店長 (CPU) が荷物を手運びしない。番地を伝えて完了通知を待つだけ。RDMA はこれを他社倉庫 (相手マシン) まで延ばした版。
- FPGA = 現場で配線を組み替えられるハード。ASIC は焼き込みで固い、CPU は柔いが遅い、その中間。
出てきた言葉の変換表
| 出てきた言葉 | つまり何の話? |
|---|---|
| AccelNet | Accelerated Networking。ホスト CPU 上のソフト SDN をバイパスして VM 通信を速くする Azure の機能 |
| VFP | Virtual Filtering Platform。ホスト CPU 上のソフト仮想スイッチ。SDN ポリシーを決める「ソフト = slow path」 |
| SR-IOV | 1 枚の物理 NIC を PF + 複数 VF に分割し、VF を VM に直挿しする規格 |
| PF / VF | PF = NIC 本体 (ホスト所有)。VF = 論理スライス (専用キュー / レジスタ / MAC) を VM に渡す |
| vNIC | ソフトが描く仮想 NIC。VF (ハード) とは別物。AccelNet VM では両方が同居 |
| DMA / PIO | DMA = デバイスが直接 RAM に読み書き。PIO = CPU が 1 語ずつ運ぶ (非 DMA) |
| IOMMU | VF が他の VM のメモリを踏まないよう番地を見張るハード (VT-d / AMD-Vi) |
| eSwitch / VEB | NIC 内蔵の L2 スイッチ。eSwitch は Mellanox 流、VEB が中立な正式名 |
| switchdev | NIC 内蔵スイッチを tc / OVS で programmable にする Linux モデル |
| GFT | Generic Flow Table。SmartNIC のハードが持つフロー表。流す「ハード = fast path」 |
| unified flow | VFP が複数段のポリシーを 1 接続ぶんの一撃ルールに畳んだもの |
| SmartNIC | オフロード / プログラム可能な NIC の総称。精密には DPU (NVIDIA) / IPU (Intel) |
| bump in the wire | FPGA を NIC とネットワークの「間」のデータ経路に挿す配置 |
| RDMA | DMA をネットワーク越しに延ばし、相手マシンのメモリへ直書き。GPU クラスターの本命 |
AccelNet で「ホスト CPU をバイパスしつつポリシーを効かせる」型は掴めた。残りは、この上に GPU クラスターのネットワーク屋の本筋を積む段。
- RDMA / RoCE / InfiniBand ── AccelNet は前菜で、本命はこれ。GPU クラスターのバックエンドが、AccelNet の「ホストバイパス」をさらに進めて「ゲスト kernel もメモリも飛ばす」までやる。次はこれが効く。
- unified flow の中身 ── VFP が複数段のテーブル (NSG → UDR → NAT → encap) を 1 本に畳む過程をもう一段。
- switchdev + OVS offload ── Azure 独自の GFT を、Linux 標準 (tc / OVS hardware offload) でどう再現するか。
- BlueField DPU / Azure Boost (MANA) ── ConnectX + 別 FPGA から、NIC + Arm SoC を 1 チップに統合する新世代へ。