RDMAとInfiniBand
HPCで数マイクロ秒のノード間通信が成立する理由は、OSカーネルとCPUコピーを外したRDMAにあります。verbs・キューペア・ファットツリーまで原理から押さえられます。
- RDMAはカーネルバイパスとゼロコピーで、CPUを介さず相手ホストのメモリへNICが直接読み書きする。データパスからOSとメモリコピーが消えることが低レイテンシの本質。
- verbs APIではキューペア(送受信キュー+完了キュー)にワークリクエストを積み、NICが非同期に処理する。信頼性のRC接続とコネクションレスのUDを用途で使い分ける。
- InfiniBandはファットツリーで全ノード間の非閉塞帯域を狙い、レイテンシは主にスイッチのホップ数で決まる。オーバーサブスクリプションと経路割り当てが実効性能を左右する。
なぜカーネルバイパスが低レイテンシを生むのか
TCP/IPソケットでノード間通信を行うと、1メッセージごとにアプリケーションのバッファからカーネル空間のソケットバッファへコピーし、プロトコルスタックを通り、NICへ渡すたびにシステムコールと割り込み、コンテキストスイッチが発生します。この経路はスループットは出せても、1回あたり数十マイクロ秒級のレイテンシとCPU負荷を伴い、細かいメッセージを高頻度で交換するHPCの通信パターンには重すぎます。
RDMA(Remote Direct Memory Access)は、この経路そのものを作り替えます。核となるのは2つの原理です。カーネルバイパスはデータ転送のたびにOSカーネルを経由しない設計で、アプリケーションがユーザ空間から直接NICへ命令を渡します。ゼロコピーは送受信バッファを中間バッファに詰め替えず、アプリケーションのメモリをNICが直接DMAで読み書きする設計です。両者が合わさると、データパスからCPUのコピーとカーネル処理が消え、レイテンシはNICとファブリックの物理的な遅延まで落ちます。
RDMAのRDMA Write/Readは「ワンサイド操作」で、相手CPUを一切起動せずにNICが相手メモリへ直接書き/読みします。相手ホストは自分宛ての転送が起きたことにすら気づきません。一方Send/Recvは「ツーサイド操作」で、受信側が事前に受信バッファを登録しておく必要があります。ワンサイドは相手CPUを消費しない究極の非同期通信ですが、書き込む相手アドレスを事前に知っておく必要があります。
メモリ登録とゼロコピーの前提
NICがアプリケーションのメモリへ直接DMAするには、そのメモリ領域を事前にNICへ登録(memory registration)しておく必要があります。登録時にOSはそのページを物理メモリに固定(ページのピン留め)してスワップアウトを禁止し、仮想アドレスと物理アドレスの対応をNIC内のテーブルに焼き込み、領域ごとにローカルキー(lkey)とリモートキー(rkey)を発行します。
横にスクロール
この登録が要になります。NICはDMA中に相手ページが物理的に移動しないことを保証されて初めて安全に直接転送でき、rkeyは「この鍵を持つ相手だけがこの領域へRDMAしてよい」というアクセス保護として働きます。ただし登録はコストの高い操作なので、実装は登録済み領域をキャッシュ・再利用し、通信のたびに登録し直さない設計を取ります。
verbs APIとキューペアのモデル
RDMAをプログラムから使う低レベルインタフェースがverbsです。中心的な抽象がキューペア(Queue Pair, QP)で、送信キュー(Send Queue)と受信キュー(Receive Queue)の対からなります。アプリケーションは転送内容をワークリクエスト(Work Request)として記述し、キューに積む(post)だけで、実際の転送はNICが非同期に処理します。完了は別の完了キュー(Completion Queue, CQ)に完了通知(Work Completion)として積まれ、アプリケーションはこれをポーリングして進捗を知ります。
verbsの基本フロー(ワンサイドRDMA Writeの例)
1. アプリがローカル/リモートのバッファを memory register(lkey/rkey取得)
2. rkey と相手アドレスを含む Work Request を Send Queue に post
3. NIC が非同期に DMA し、ファブリック経由で相手メモリへ直接書き込み
4. 完了すると Work Completion が Completion Queue に積まれる
5. アプリは CQ をポーリング(割り込み待ちも可)して完了を確認
この「積んで、あとで完了を刈り取る」非同期モデルにより、CPUは転送の各バイトに関与せず、post とポーリングの前後だけ動きます。ソケットの send() が返るまでブロックする同期モデルとは対照的で、これが通信と計算のオーバーラップを容易にします。
完了通知はCQをビジーポーリングして拾う方式と、割り込みで通知を受ける方式が選べます。ポーリングはCPUを1コア専有しますが割り込みのオーバーヘッドとコンテキストスイッチを避けられ、レイテンシが最小になります。超低レイテンシが要る通信ライブラリはポーリングを、CPUを空けたい場面では割り込みを選ぶ、というトレードオフです。
RCとUD ── トランスポートサービスの選択
QPには複数のトランスポートタイプがあり、代表がRC(Reliable Connection)とUD(Unreliable Datagram)です。RCは2つのQPを1対1で接続し、順序保証・再送・フロー制御をハードウェアが担う信頼性コネクションです。RDMA Read/Writeのワンサイド操作はRCでのみ使えます。一方UDはコネクションレスで、1つのQPから多数の相手へデータグラムを送れますが、順序も到達も保証しません。
この差はスケーラビリティに直結します。RCはノード数だけ接続が必要で、全対全通信では接続数がノード数の2乗のオーダーで増え、各QPがNIC内の状態とメモリを消費します。UDは1QPで全相手を扱えるため状態が軽く、超大規模のジョブではUDベースの通信が選ばれることがあります。
| 観点 | RC(信頼コネクション) | UD(非信頼データグラム) |
|---|---|---|
| 接続モデル | 1対1で事前接続 | コネクションレス、1QPで多相手 |
| 信頼性 | 順序保証・再送をHWが担保 | 順序・到達とも無保証 |
| ワンサイド操作 | RDMA Read/Write可 | 不可(Send/Recvのみ) |
| 状態の重さ | 接続数がノード数の2乗で増大 | 1QPで済み状態が軽い |
| 向く場面 | 隣接・少数ペアの信頼転送 | 超大規模の全対全、少状態が要る場面 |
MPIのような上位ライブラリは、この特性差を隠蔽しつつ、メッセージサイズやジョブ規模に応じてRCとUDを内部で使い分けます。詳しくはMPIと集団通信で扱う集団通信アルゴリズムが、こうしたトランスポートの上に実装されています。
InfiniBandのファットツリー
複数ノードをつなぐファブリックとして、InfiniBandはロスレス(パケットを落とさない)なリンク層と、低レイテンシなスイッチングを提供します。パケットを落とさないためにクレジットベースのフロー制御を使い、受信側にバッファ空きがある分だけ送信を許可します。これがEthernet由来のRoCEとの重要な違いで、輻輳時にドロップと再送で性能が崩れるのを防ぎます。
トポロジの定番がファットツリー(Fat-Tree)です。素朴な木は上位へ行くほどリンクが細くなり集約点で詰まりますが、ファットツリーは上位段ほどリンクを太く(本数を増やして)配置し、どの葉ノード間でも同時に満帯域を出せる非閉塞(non-blocking)な帯域を狙います。
2段ファットツリーの非閉塞条件(概念)
Leafスイッチ: 下向き(ノード側)ポート数 = 上向き(Spine側)ポート数
→ 下から来た全帯域を上へ逃がせる(詰まらない)
もし上向きを半分に減らすと "2:1 オーバーサブスクリプション"
→ 全ノードが同時に上位段へ出ると帯域が半分に飽和
レイテンシ ≒ 経由するスイッチのホップ数 × 1ホップの遅延
(同一Leaf配下は1ホップ、別Leaf間はSpine経由で複数ホップ)
全ノードを完全非閉塞で結ぶと上位段のスイッチとケーブルが莫大になるため、実運用ではオーバーサブスクリプション(上向き帯域を意図的に減らす、例えば2:1)でコストを抑える設計も一般的です。この場合、ノード内やLeaf配下に閉じた通信は満帯域でも、多数ノードが一斉に上位段を越えると帯域が飽和します。ジョブのノード割り当てを同一Leaf配下へ寄せると、この飽和とホップ増を避けられます。
ファットツリーには同じノードペア間でも複数の物理経路が存在し、経路の選び方(ルーティング)とジョブのノード配置が実効性能を大きく変えます。論理的に隣接するプロセスが物理的に別Leaf・別Spineへ散ると、1ステップの通信が余分なホップを踏んでレイテンシが伸びます。ノード配置とファブリックのトポロジを噛み合わせることが、強スケーリングで効率を保つ前提になります。
レイテンシとバンド幅の性能モデル
RDMA通信の所要時間は、固定的なレイテンシとサイズ比例のバンド幅項の和で近似できます。1回の転送時間はおおよそ「レイテンシ+(メッセージサイズ÷バンド幅)」で、これはT = L + S/B(Lはレイテンシ、Sはメッセージサイズ、Bはバンド幅)というシンプルな線形モデルです。
メッセージサイズ S による支配項の切り替わり
小さいS: T ≒ L(レイテンシ支配、固定遅延が効く)
大きいS: T ≒ S/B(バンド幅支配、リンク帯域が効く)
レイテンシ項 L とバンド幅項 S/B が等しくなる境界のサイズ ≒ L × B を「ハーフポイント」付近と呼び
この付近でどちらが効くかが入れ替わる(実効バンド幅がピークの半分になる点)
この式から実務的な帰結が出ます。細切れの小メッセージを大量に送るとレイテンシLが積み上がるため、複数のメッセージを1つにまとめる(メッセージ集約)とLの支払い回数が減り実効スループットが上がります。RDMAがカーネルバイパスでLそのものを数マイクロ秒級まで削るのは、まさにこのレイテンシ支配領域での効きを最大化するためです。逆に大メッセージではLは無視でき、ファットツリーの非閉塞帯域やオーバーサブスクリプション比が実効バンド幅Bを決めます。
同じRDMAでも、GPUクラスタの相互接続(NVLink・InfiniBand)で扱うノード内のNVLinkはBが桁違いに大きく、ノード間のInfiniBandはLもBも一段厳しい、という二階層の段差が全体のスケーリングを律速します。本記事のホスト間ファブリックの原理は、その「ノード間」側の詳細にあたります。
RDMAが速い理由を問われたら、軸は2つ。(1)カーネルバイパスでシステムコール・割り込み・コンテキストスイッチをデータパスから外すこと、(2)ゼロコピーでCPUによるバッファ間コピーを消し、登録済みメモリへNICが直接DMAすること。加えてワンサイドRDMA(相手CPUを起動しない)とverbsの非同期キューペアモデル、RCとUDの使い分け、ファットツリーの非閉塞性とホップ数依存のレイテンシまで説明できれば上級として十分です。
まとめ
- RDMAの低レイテンシはカーネルバイパス(データパスからOSを外す)とゼロコピー(登録済みメモリへNICが直接DMA)の2原理に由来し、CPUのコピーとシステムコールが消える。
- verbsではキューペアにワークリクエストをpostし、完了を完了キューでポーリングする非同期モデルで、CPUは転送の各バイトに関与せず計算と通信を重ねやすい。
- RCは信頼コネクションでワンサイドRDMA可だが接続数がノード数の2乗で増え、UDはコネクションレスで状態が軽く超大規模に向く、というトレードオフがある。
- InfiniBandはロスレスなクレジットフロー制御とファットツリーで非閉塞帯域を狙い、レイテンシはホップ数、実効帯域はオーバーサブスクリプション比とノード配置で決まる。
HPC・科学技術計算の記事ガイド
RDMAとInfiniBandを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
HPC
比較で見る軸
難易度: advanced / カテゴリ: HPC・科学技術計算 / タグ数: 6
導入後に効く点
verbs APIではキューペア(送受信キュー+完了キュー)にワークリクエストを積み、NICが非同期に処理する。信頼性のRC接続とコネクションレスのUDを用途で使い分ける。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- HPC・科学技術計算
- タグ数
- 6
判断チェックリスト
- 自社の用途が「HPC / RDMA」に近いか確認する。
- 強みである「RDMAはカーネルバイパスとゼロコピーで、CPUを介さず相手ホストのメモリへNICが直接読み書きする。データパスからOSとメモリコピーが消えることが低レイテンシの本質。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。