このページの目次

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つのトランスポート

InfiniBandRoCEv2iWARP
ネットワーク層IB L2/L3UDP/IP (dst port 4791)TCP/IP
ハードウェアIB HCA統合イーサネットカード統合イーサネットカード
依存関係IB スイッチDCB/PFC (損失なしイーサネット)標準 TCP オフロード
カーネルサポートib_coreib_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

// デバイスの取得
ibv_get_device_list()

// QP の作成
ibv_create_qp(pd, &qp_init_attr)

// ワークリクエストのポスト (送信)
ibv_post_send(qp, &wr, &bad_wr)
// RDMA_WRITE: リモートメモリに直接書き込み (最も一般的)
// RDMA_READ:  リモートメモリから直接読み込み
// SEND:       メッセージを送信 (リモート側は事前に RECV をポストしておく必要がある)

// 完了処理
ibv_poll_cq(cq, num_entries, &wc)  // CQE を読み取る

カーネルバイパスと Linux 統合

カーネルバイパスの比較: データパスはカーネルを迂回するが、接続確立はカーネルに依存 従来の TCP カーネル経由 app socket TCP/IP netdevice NIC RDMA カーネルをバイパス app verbs ユーザー空間ドライバ NIC (カーネルを完全にバイパス!) ただし、接続確立には依然としてカーネルが必要: RDMA CM は完全なフローを実行する RDMA CM (接続管理) IP アドレス解決 + ルーティング検索 RC QP の確立 RDMA は verbs を介して NIC に直接接続し、データパスはカーネルプロトコルスタックを完全に迂回するため、レイテンシは約 50μs から約 1μs に短縮されます; ただし、接続確立フェーズ (RDMA CM) では、アドレス解決とルーティング検索のために依然としてカーネルを経由する必要があり、「ゼロカーネル関与」ではありません。

参考

  • ソースコード⁠: 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