← 一覧へ戻る

Claude が書いた記事

Azure Accelerated Networking を開ける ── 決めるソフト (VFP)、流すハード (SmartNIC)

「オンにすると速くなる」AccelNet の中で何が起きてるか。VF・DMA・eSwitch・FPGA を開けて、ホスト CPU をバイパスしつつ SDN を効かせる仕掛けを追った学習ログ。

俺の最初の疑問

Azure の Accelerated Networking (AccelNet) は「オンにすると速くなる」のは知ってる。でも中で何が起きてるか分からんまま使ってた。基礎から開けたい。

途中で次々引っかかった。記事はこの順で潰していく。

  1. 全 VM が AccelNet を使う場合と使わない場合、何がどう違うんや?
  2. VF って何や?なんで vNIC と言わへんのや?
  3. DMA って何や?非 DMA は何て呼ぶ?
  4. eSwitch ってメラノックスの用語か?
  5. 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 あり

左: 全 VM の通信がホスト CPU 上の VFP を通る (課税・ジッタ)。右: 各 VM が VF で SmartNIC に直結し、CPU は経路外。ポリシーはハードが line rate で適用。

何と比べるとわかるか ── 有人窓口 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・ケーブル・総帯域・振り分ける eSwitchPCIe コンフィグ空間 (BDF)・レジスタ (BAR)・送受信キュー・割り込み・MAC

物理ポートは 1 本のまま。中で eSwitch (NIC 内蔵の L2 スイッチ) が宛先 MAC / VLAN で各 VF のキューに振り分ける。これが「多重化」の正体。

物理ポートは 1 本 (共有)。eSwitch が宛先 MAC / VLAN を見て各 VF のキューに振り分ける。専有はキュー / レジスタ / MAC、共有は ASIC / ポート / 帯域。

補足: 「合成 (synthetic)」は Hyper-V の用語

その「合成 vNIC」の syntheticHyper-V (= Azure) の言い方で、Azure 固有語ではない。中立な概念は 準仮想化 (paravirtualized) NIC ── ゲストが実ハードを真似ず、専用の効率的ドライバで話す方式。各プラットフォームで名前が違うだけ。

プラットフォーム準仮想化 NIC の呼び名仕組み / ドライバ
中立な概念準仮想化 (paravirtualized) デバイス
Hyper-V (Microsoft / Azure)synthetic(合成)netvsc・VMBus・VSP / VSC
KVM (Linux)virtio (virtio-net)virtio リングバッファ
VMwareVMXNET3vmxnet
XenPV ドライバ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 は両端だけ
違いは「CPU がデータの 1 語ずつに触るか」。DMA は触らない → 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) と呼ぶ。

初回だけ VFP (ソフト) が決めて GFT に焼く (slow path)。以降は GFT (ハード) が exact-match で直行 (fast path)。決めるのはソフト、流すのはハード。

これは 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 を買収した親会社」としてだけ。

ConnectX (Mellanox の NIC チップ) と FPGA (Altera のチップ) は別の汎用品。Azure が両方を自前ボードに統合・配線。FPGA は NIC と NW の間 = bump in the wire。

なぜ 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 が DMA で VM メモリへ直行。ホスト CPU / kernel は経路外 (初回パケットだけ右の VFP へ= slow 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 は柔いが遅い、その中間。

出てきた言葉の変換表

出てきた言葉つまり何の話?
AccelNetAccelerated Networking。ホスト CPU 上のソフト SDN をバイパスして VM 通信を速くする Azure の機能
VFPVirtual Filtering Platform。ホスト CPU 上のソフト仮想スイッチ。SDN ポリシーを決める「ソフト = slow path」
SR-IOV1 枚の物理 NIC を PF + 複数 VF に分割し、VF を VM に直挿しする規格
PF / VFPF = NIC 本体 (ホスト所有)。VF = 論理スライス (専用キュー / レジスタ / MAC) を VM に渡す
vNICソフトが描く仮想 NIC。VF (ハード) とは別物。AccelNet VM では両方が同居
DMA / PIODMA = デバイスが直接 RAM に読み書き。PIO = CPU が 1 語ずつ運ぶ (非 DMA)
IOMMUVF が他の VM のメモリを踏まないよう番地を見張るハード (VT-d / AMD-Vi)
eSwitch / VEBNIC 内蔵の L2 スイッチ。eSwitch は Mellanox 流、VEB が中立な正式名
switchdevNIC 内蔵スイッチを tc / OVS で programmable にする Linux モデル
GFTGeneric Flow Table。SmartNIC のハードが持つフロー表。流す「ハード = fast path」
unified flowVFP が複数段のポリシーを 1 接続ぶんの一撃ルールに畳んだもの
SmartNICオフロード / プログラム可能な NIC の総称。精密には DPU (NVIDIA) / IPU (Intel)
bump in the wireFPGA を NIC とネットワークの「間」のデータ経路に挿す配置
RDMADMA をネットワーク越しに延ばし、相手マシンのメモリへ直書き。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 チップに統合する新世代へ。