このページの目次
RDMA (Remote Direct Memory Access)
概要: RDMA アーキテクチャ → InfiniBand/RoCE/iWARP → verbs API → Queue Pair → Memory Region → カーネルバイパス → Linux ネットワークスタックとの統合 カーネルバージョン: 3.x ~ 6.x
概要
RDMA を使用すると、1台のマシンが別のマシンのメモリに直接読み書きでき、リモート側のCPUとカーネルをバイパスできます。レイテンシは従来の TCP/IP の約 50μs から約 1μs に短縮され、データ転送には CPU がゼロ関与します。Linux は ib_core とベンダードライバ (mlx5, qedr, hns) を通じて、統一された RDMA インターフェースを提供します。
3つのトランスポート
| InfiniBand | RoCEv2 | iWARP | |
|---|---|---|---|
| ネットワーク層 | IB L2/L3 | UDP/IP (dst port 4791) | TCP/IP |
| ハードウェア | IB HCA | 統合イーサネットカード | 統合イーサネットカード |
| 依存関係 | IB スイッチ | DCB/PFC (損失なしイーサネット) | 標準 TCP オフロード |
| カーネルサポート | ib_core | ib_core + rdma_rxe(SW) | iw_cm |
コア抽象: Queue Pair (QP)
各 QP = Send Queue (SQ) + Receive Queue (RQ) + Completion Queue (CQ)
SQ: ローカル側から開始される RDMA 操作 (SEND, RDMA_WRITE, RDMA_READ)
RQ: リモート側の SEND を待つためのバッファ (事前にバッファをポストし、SEND 受信後にデータが充填される)
CQ: 完了通知 (操作完了時にハードウェアが CQE を書き込む)
QP の状態遷移:
RESET → INIT → RTR (Ready To Receive) → RTS (Ready To Send)
Memory Region (MR)
// RDMA ハードウェアはリモートメモリに直接書き込むため、メモリを「登録」(ピン留め) する必要がある
// 登録: ibv_reg_mr() → ハードウェアが物理ページをロックし、アクセスキー (rkey/lkey) を生成する
//
// なぜ登録が必要なのか?
// RDMA HCA はカーネルをバイパスするため、CPU のページテーブルによるアドレス変換に依存できない
// → 物理アドレスへの直接マッピング + ロックされたページ (スワップやページフォルト不可) が必要
// 必要に応じたページング (ODP) / 暗黙的 MR (IMR):
// 登録オーバーヘッドを削減し、必要に応じて pin/unpin を行う
Verbs API
// ユーザー空間: libibverbs
// デバイスの取得
// QP の作成
// ワークリクエストのポスト (送信)
// CQE を読み取る
カーネルバイパスと Linux 統合
参考
- ソースコード:
drivers/infiniband/core/,drivers/infiniband/hw/mlx5/,include/rdma/ - ドキュメント:
Documentation/infiniband/ - LWN: "RDMA and the Linux kernel"
キーワード: RDMA, InfiniBand, RoCE, QP, Memory Region, verbs, kernel bypass, ib_core