跟網路通訊有關的資訊太雜亂了,整理了一下與 RDMA 相關的內容。有錯誤再麻煩告知,會盡速修正。
這篇是在整理各種「Direct 類」技術,特別是 RDMA,也包含其他像 DirectStorage 的技術,這些背後有一個共通核心:
盡量跳過中間層 → 減少 CPU 參與 → 減少資料複製次數 → 降低延遲、提高頻寬
RDMA by chatgpt
下面先從 RDMA 的概念開始,依序介紹到底層網路、硬體,以及其他相關技術,中間會穿插一些具體的例子與數字。
Remote Direct Memory Access (RDMA) 是什麼?
- 定義:讓一台機器可以直接讀寫另一台機器的記憶體,不需要經過對方 CPU 的干預。
- 重點:低延遲、高頻寬、節省 CPU 資源。
- 支援的底層網路:InfiniBand、RoCE、iWARP 等不同技術都可以承載 RDMA。
可以把 RDMA 想像成:網路卡幫你把「遠端記憶體」變成像本機一樣可操作,只是權限與程式模型比較嚴格、也比較複雜。
一個具體的對比:
- 傳統 TCP Socket:一次 request 往往要走 Kernel、Socket Buffer、複製多次記憶體,延遲可能是數十到數百 μs。
- RDMA Read/Write:資料從對方記憶體直接進到本機記憶體 buffer,中間幾乎不打擾對方 CPU,延遲可以壓到個位數 μs 等級。
因此在高頻交易 (HFT)、分散式快取(例如 Memcached / Redis RDMA 版)、分散式資料庫(例如 FaRM 類型系統)等情境,常會採用 RDMA。
RDMA protocol stack; source
RDMA 工作原理:Memory Registration + Queue Pair(簡化版)
前面說 RDMA 可以「直接存取遠端記憶體」,實際上在程式層面主要靠兩個核心概念:
- Memory Registration(記憶體註冊)
- Queue Pair(QP)+ Completion Queue(CQ)
Memory Registration(MR)
- RDMA NIC 不會直接拿虛擬位址來用,應用程式必須先把一塊 buffer「註冊」給 NIC:
- OS 幫你把這塊記憶體 pin 住(不會被換出到 swap)。
- NIC 建一份「虛擬位址 → 實體位址」的對照表,並產生一組 key(L_Key / R_Key)。
- 之後 RDMA Read/Write 就是拿著「遠端位址 + key」去讀寫那塊記憶體,如果 key 不對或範圍超出,就會被 NIC 擋掉。
這也是為什麼 RDMA 應用常被說「比較難寫」:你要自己管理好哪些 buffer 有被註冊、不能亂 free。
Queue Pair(QP)和 Completion Queue(CQ)
RDMA 不像 TCP 是「一條 byte stream」,而是用佇列來溝通:
- 每個連線有一組 Queue Pair(QP):
- Send Queue(SQ):放「我要送什麼」的工作(Work Request)。
- Receive Queue(RQ):放「我準備好接多少 buffer」的工作。
- NIC 處理完後,會在 Completion Queue(CQ)裡丟一個完成事件,程式再去 poll CQ 知道哪一個工作做完了。
程式的典型流程長得像:
- 呼叫 verbs API 建立 QP、CQ,註冊好要用的記憶體(MR)。
- 把「我要傳的 buffer」貼成 send work request 丟到 SQ。
- 對方預先在 RQ 裝好 receive work request(含目標 buffer)。
- NIC 之間透過 RDMA 把資料搬好,最後在雙方的 CQ 中留下完成事件。
RDMA Queue Pair / Completion Queue 示意圖; source
RDMA 底層網路選項
不同底層網路選項 by gemini
InfiniBand
- 定義:一種專門設計給高效能運算 (HPC) 環境的高速網路技術。
- 重點:
- 速度非常快(高吞吐量 high throughput、低延遲 low latency),現在常見 200Gbps、400Gbps。
- 內建支援 RDMA,是 RDMA 最「原生」的環境之一。
- 簡單說:InfiniBand 是一種同時涵蓋「物理層 + 傳輸層」的專用網路技術,天生就為 RDMA 而生。
具體數字上的差異:
- 一般資料中心 10GbE / 25GbE 的 TCP 延遲,可能是 30-100 μs 起跳。
- 同樣規模下,InfiniBand 叢集可以把一趟通訊壓到 1-2 μs,差一個數量級以上。
因此很多 HPC 叢集與 Top500 超級電腦的互聯網路,常使用 InfiniBand 或類似規格。
RDMA over Converged Ethernet (RoCE)
- 定義:讓 RDMA 可以在以太網路 (Ethernet) 上跑。
- RoCE v1 (RoCE):
- 工作在 Layer 2(資料鏈結層)。
- 限制在同一個以太網域內 (L2 broadcast domain),不能跨 Router。
- RoCE v2 (RoCEv2):
- 工作在 Layer 3(網路層,IP 層)。
- 可以跨 Router,支援更大型的資料中心部署。
RoCE 的好處是可以沿用既有的 Ethernet 生態,但為了保證延遲與可靠性,網路調教會比一般 TCP/IP 困難很多。
一個實際的部署方式:
- 大型雲端資料中心,把 Spine/Leaf 交換器都換成支援 PFC/ECN 的交換器。
- 機櫃內的伺服器 NIC 支援 RoCEv2,跑 100GbE 或 200GbE。
- 上層服務(例如分散式儲存、AI 訓練框架)直接用 RDMA verbs / libibverbs 訪問遠端記憶體或 NVMe-oF 目標。
iWARP
- 定義:讓 RDMA 跑在 傳統 TCP/IP 網路 上的協定。
- 特點:
- 完全走 TCP/IP,所以用一般 Ethernet 也能跑,不需要像 RoCE 一樣要求 Lossless Ethernet。
- 延遲稍高,但部署相對簡單(因為可以沿用既有的 L3 TCP/IP 網路架構)。
- 場景:在已經有大規模 L3 TCP/IP 網路的資料中心中,若想導入 RDMA 功能,可以在新採購或汰換伺服器時選用支援 iWARP 的 NIC,無需針對整體網路做類似 RoCE 那樣的大幅度調整。
RDMA 相關硬體
RDMA-capable NIC (rNIC)
- 定義:支援硬體 RDMA 的特製網路卡,例如 Mellanox ConnectX 系列。
- 特點:
- 內建 RDMA Engine,可以在 NIC 上處理 RDMA 協定。
- 依型號支援 RoCE、InfiniBand,有些也支援 iWARP。
這種 NIC 是 RDMA 世界的常見配備,沒有它時,許多 RDMA 功能就只能以軟體模擬方式提供。
在雲端平台上,機型名稱有時會直接顯示是否具備 RDMA 能力,例如:
- AWS:
c7gn、p4d等,背後就是帶有高階 rNIC / InfiniBand 的機型。 - Azure:
HBv3、ND A100 v4等 HPC / GPU 機型,也會標出 InfiniBand 200Gbps / 400Gbps。
選擇這類機型時,通常就代表底層已配備支援 RDMA 的 NIC。
Networking Port; RJ45 vs SFP - Josh Covington March 28, 2023; source
有些 Infiniband 使用類似 QSFP 外型 (QSFP+/QSFP28/QSFP56/QSFP112),但不是 Ethernet 用的 QSFP+,是 InfiniBand 認證模組。
DPU (Data Processing Unit) 上的 RDMA 加速
- 定義:像 NVIDIA BlueField 這種 DPU 裝置,本身內建 RDMA 處理能力,可以 offload 更多網路與安全相關負載。
- 特點:
- NIC + 多核 CPU + 加速引擎的混合體。
- 可以在 NIC 端就做 Security / QoS / Overlay 解封裝 等工作。
- 場景:雲端數據中心、超大規模部署(例如 AWS、Azure 內部大量使用這類裝置)。
DOCA vs. the CUDA runtime and developer kit stack - Sep 13, 2021 By Justin Betz; source
其他跟 RDMA 有關的技術
Soft-RDMA(Software RDMA)
- 定義:用 CPU + Kernel 模擬 RDMA 行為的軟體實作。
- 特點:
- 硬體沒有 RDMA 支援時也能用。
- 延遲與效能明顯不如真正的硬體 RDMA,但部署與開發比較省事。
- 用途:
- RDMA 應用程式開發與測試。
- VM / 容器內部的模擬環境。
例如:本機只有普通 1GbE NIC,但如果想寫一個 RDMA Key-Value Store,可以用 Soft-RDMA 在多個 VM 之間模擬 RDMA API,等確定程式邏輯正常,再丟到 InfiniBand / RoCE 環境做壓測。
NVMe over Fabrics (NVMe-oF) with RDMA
- 定義:讓 NVMe SSD 可以「跨網路」直接被存取,RDMA 是其中一個常見的底層通訊方式。
- 協定選項:
- NVMe/RDMA:用 RDMA 傳 NVMe 命令,效能最佳。
- NVMe/TCP、NVMe/FC:其他常見實作,但通常延遲較高。
- 場景:超高速分散式存儲系統,例如大型資料湖或分散式資料庫的底層存儲。
更具體的部署方式:
- 多台儲存節點上各自掛 NVMe SSD,透過 NVMe-oF + RDMA 暴露成「遠端 NVMe 目標」。
- 應用伺服器看到的是一片邏輯上的 NVMe 空間,實際上由多台機器的 NVMe 透過網路組成,延遲可能只比本機 NVMe 慢幾 μs 到十幾 μs,但容量可以水平擴充到數十 TB、數百 TB。
NVMe over Fabrics | Follow the Wire Series | Marvell Technology; source
RDMA over PCIe
- 定義:把 RDMA 的傳輸機制搬到 PCIe 總線上,用於「主機內部裝置之間」的超高速通訊,而不是跨機器的網路。
- 技術方向:Compute Express Link (CXL) 標準與這類概念十分接近。
- 場景:GPU、FPGA、DPU 等異質加速器之間,做超低延遲資料交換。
RDMA 的「失敗風險」與網路調教
RDMA 通常假設網路環境「接近 Lossless」(不能隨便掉封包,否則重傳成本會放大),所以在 RoCE 場景下,資料中心常常要額外搭配這些技術:
- PFC (Priority Flow Control)
- ECN (Explicit Congestion Notification)
- DCQCN (Data Center Quantized Congestion Notification)
這些都是為了在 Ethernet 上盡量模擬一個「對 RDMA 友善」的網路環境。沒調好時,RDMA 不但不快,還可能因為擁塞或 Head-of-Line Blocking 讓整個網路變得更難排錯。
實務上常見的問題包含:
- 某一條鏈路出現輕微擁塞,但因為 PFC 設定不佳,整個交換器被反壅塞拖慢,RDMA 流量延遲升高。
- 傳統 TCP 流量和 RDMA 流量混在同一個 Priority,互相干擾,導致 RDMA 效能低於預期,甚至不如普通 TCP。
其他 Direct 類技術
Direct IO
- 定義:在存取硬碟 (Storage) 時,直接繞過 OS 的 Page Cache,從程式直接讀寫磁碟。
- 常見場景:
- 資料庫 (Database) 在做大量 IO 時,想避免多一次 Memory Copy 和 Cache 汙染。
- 高效能儲存系統,自行管理快取策略。
例如:
- MySQL / PostgreSQL 這類資料庫,通常會自己管理 Buffer Pool,如果再經過 OS Page Cache,會多一層快取,記憶體使用更難預測。
- 透過 Direct IO,資料會從磁碟直接進到 DB 自己的 Buffer Pool,不會在 OS cache 裡再留一份。
GPU Direct(NVIDIA)
- 定義:NVIDIA 提出的技術總稱,讓 GPU 之間,或 GPU 與其他裝置(例如 NIC、Storage)可以更直接地搬運資料,而不必繞過 CPU 和主記憶體。
- 重點:最大化 GPU 資源使用效率,特別重要於機器學習、深度學習與 HPC 場景。
- 分成好幾種不同用途的子技術,每一種處理的是不同路徑的資料搬運問題。
| 名稱 | 用途 | 跨機器? |
|---|---|---|
| GPU Direct P2P | 同機器內多張 GPU 之間直接通訊 | 否 |
| GPU Direct RDMA | GPU ↔ NIC ↔ 另一台機器記憶體 / GPU | 是 |
| GPU Direct Storage | GPU ↔ Storage (如 SSD) 直接搬資料 | 否 |
GPU Direct Peer-to-Peer (P2P)
- 用途:讓同一台伺服器內,不同 GPU 之間可以直接存取彼此的記憶體。
- 特點:
- GPU 之間透過 PCIe(或 NVLink 等)互相傳資料。
- 不需要繞到 CPU memory 再轉一圈。
- 場景:多 GPU 深度學習訓練,例如模型並行、資料並行訓練。
舉例:一台機器上有 8 張 GPU,在做資料並行訓練時,每一個 mini-batch 結束都要做 AllReduce,把梯度加總。沒有 P2P / NVLink 時,所有梯度都得先繞到 CPU memory 再分送出去;有 P2P / NVLink 時,GPU 之間可以直接互傳,梯度同步時間會明顯縮短。
GPU Direct RDMA
- 用途:讓 GPU 記憶體可以直接透過網路卡 (NIC) 傳到其他伺服器的 GPU 或 CPU。
- 特點:
- 典型搭配 InfiniBand 或 RoCE 網路。
- 直接把「GPU ↔ GPU」或「GPU ↔ 遠端記憶體」的資料搬運壓到 NIC + RDMA 來做。
- 場景:
- 分散式深度學習訓練(例如多機多卡訓練大型 Transformer)。
- HPC 叢集的數值運算(例如 CFD、分子動力學)。
- GPU 直接寫入 Storage Server(例如分散式檔案系統的節點)。
用文字示意一下資料路徑:
[機器 A GPU 記憶體]
│
GPU Direct RDMA
│
- 多台儲存節點上各自掛 NVMe SSD,透過 NVMe-oF + RDMA 暴露成「遠端 NVMe 目標」。
[NIC (Ethernet / RoCE / InfiniBand)] ── RDMA ──> [NIC (機器 B)]
│
[機器 B 記憶體 或 GPU]
- MySQL / PostgreSQL 這類資料庫,通常會自己管理 Buffer Pool,如果再經過 OS Page Cache,會多一層快取,記憶體使用更難預測。
- 在這些場景中,常見的 GPU 通訊庫是 NVIDIA NCCL(例如 PyTorch 的 DistributedDataParallel 或 DeepSpeed 背後多半都在呼叫 NCCL)。NCCL 會負責選擇適合的通訊拓樸(ring、tree 等),並在可用時利用 GPUDirect RDMA + InfiniBand / RoCE 來實作 AllReduce、AllGather 等操作。從「有沒有 NCCL」的角度,大致可以這樣理解:
- 沒有 NCCL 時: 工程師要自己處理 GPU 間通訊、拓樸設計、RDMA 傳輸細節。
- 使用 NCCL 時: 直接呼叫 NCCL API,由 NCCL 決定是否用 RDMA / GPUDirect,以及用什麼拓樸來做 AllReduce 等操作。
GPU Direct Storage (GDS)
- 用途:讓 GPU 可以直接從 NVMe SSD 等存儲裝置讀取或寫入資料。
- 特點:
- 資料不需先讀到 CPU memory 再複製到 GPU memory。
- 對於資料集超大的訓練(例如 Llama 3 那種 TB 等級資料)特別有感。
- 場景:各種需要高速資料載入的 GPU 工作負載。
資料路徑上的差異:
- 沒有 GDS 時,資料路徑是「NVMe → CPU Memory → GPU Memory」,每一批次都要多一次複製。
- 有了 GDS,路徑變成「NVMe → GPU Memory」,在多機多卡訓練大模型時,資料讀取端的瓶頸可以被大幅推後。
具體案例:DGX H100
DGX H100 是 NVIDIA 的旗艦 AI 訓練伺服器,可以用來說明前面介紹的各種技術如何實際整合在一起:
| 項目 | 規格 |
|---|---|
| GPU | 8× NVIDIA H100 80GB(SXM5) |
| 機內 GPU 互連 | NVLink 4.0(900 GB/s 雙向)+ NVSwitch |
| InfiniBand NIC | 8× ConnectX-7 400Gbps(總計 3.2 Tbps) |
| Ethernet NIC | 2× ConnectX-7 100GbE(管理用) |
各技術在 DGX H100 中的角色:
- GPU Direct P2P + NVLink:同一台 DGX 內的 8 張 GPU 透過 NVLink 互連,單機內的 AllReduce 走 NVLink(900 GB/s),不需要經過 CPU memory。
- GPU Direct RDMA + InfiniBand:每張 GPU 各配一張 400Gbps ConnectX-7,跨機器的梯度同步走 InfiniBand + GPUDirect RDMA,資料直接從 GPU 記憶體送出,不經過 CPU。
- NCCL:PyTorch DDP / DeepSpeed 背後呼叫 NCCL,由 NCCL 自動決定機內走 NVLink、跨機走 InfiniBand。
- GPU Direct Storage:訓練資料可以從 NVMe SSD 直接載入 GPU memory,減少 CPU 瓶頸。
- NVMe-oF:在大型叢集中,訓練資料可能存放在遠端儲存節點,透過 NVMe-oF + RDMA 讓多台 DGX 共用同一個高速儲存池。
- Ethernet 只做管理:SSH、監控、OS 管理流量走 100GbE Ethernet,訓練相關流量全部走 InfiniBand。
不同世代 DGX 的網路配置對照:
| 機型 | GPU | 機內互連 | 跨機互連 | InfiniBand NIC |
|---|---|---|---|---|
| DGX A100 | 8× A100 | NVLink 3.0 + NVSwitch | InfiniBand HDR 200Gbps | 8× ConnectX-6 |
| DGX H100 | 8× H100 | NVLink 4.0 + NVSwitch | InfiniBand NDR 400Gbps | 8× ConnectX-7 |
| DGX B200 | 8× B200 | NVLink 5.0 + NVSwitch | InfiniBand NDR 400Gbps | 8× ConnectX-7 |
DirectStorage(Microsoft)
Windows 11 上推出的 DirectStorage,可以理解成「遊戲版」的 Direct 技術:
- 遊戲素材(貼圖、幾何模型等)從 SSD 直接送到 GPU,而不是先經過 CPU 解壓再搬一次。
- CPU 不用負責大量 IO + 解壓縮,可以把時間留給 AI、物理解算、遊戲邏輯等其他工作。
在支援 DirectStorage 的組合(PCIe 4.0/5.0 NVMe + 新一代顯示卡)下,遊戲進入地圖或載入大型場景時的讀取時間有機會縮短,並更容易實作邊玩邊載入場景的設計,減少長時間 loading 畫面。
總整理:幾種 RDMA / Direct 類硬體比較
| 類別 | 傳輸協定 | 網路需求 | 主要特性 | 延遲 (us) | 頻寬 (Gbps) | 常見硬體 |
|---|---|---|---|---|---|---|
| InfiniBand NIC | InfiniBand 原生 | 專有 IB 網路 | 超低延遲、專用傳輸、硬體 RDMA | ~1-2 μs | 200-400 Gbps | Mellanox ConnectX-6/7 |
| RoCE NIC | RoCEv1/v2 (UDP/IP) | 乙太網(需 PFC) | 低延遲、高普及率、對網路品質較敏感 | ~2-5 μs | 100-400 Gbps | Mellanox, Broadcom, Intel NIC |
| iWARP NIC | TCP/IP | 普通乙太網 | 部署簡單、不需要 PFC,但延遲較高 | ~10-20 μs | 40-100 Gbps | Chelsio T5/T6, Intel E810 |
| GPUDirect RDMA | InfiniBand / RoCE | 專用網卡直連 GPU | GPU 記憶體直接 RDMA 傳輸 | ~1-2 μs(GPU 間) | 200-400 Gbps | NVIDIA A100/H100 + ConnectX |
| SmartNIC / DPU | 自定義(RDMA + Offload) | 乙太網或 IB | NIC 內建 Arm 核,offload 運算與封包處理 | ~2-5 μs | 100-400 Gbps | NVIDIA BlueField-2/3, Intel IPU |
| Storage RDMA (NVMe-oF) | RoCE / IB | 專用網段 | Storage over RDMA,極速存取 | ~5-10 μs | 100-200 Gbps | NVMe-oF target cards |
| FPGA RDMA 加速卡 | 自訂 RDMA 協定 | 專有網路 | 超低延遲客製化(常見於 HFT / 超算) | ~0.5-1 μs | 25-100 Gbps | Xilinx Alveo, Intel PAC |
References
- RDMA NIC: Features and How to Choose?
- NVIDIA GPUDirect
- GPUDirect Storage (GDS)的基本概念
- NVIDIA/gds-nvidia-fs: NVIDIA GPUDirect Storage Driver
- DirectX新I/O功能DirectStorage正式登陸PC,可大幅強化遊戲載入速度
- RDMA - Key Technology for Arithmetic Networks
- What is a DPU A Data Processing Unit Quick Primer
- 【高效率GPU I/O躍居次世代AI資料中心重要角色】輝達GPU直連應用架構的進化
- Quick Concepts Part 1 - Introduction to RDMA
本文部分內容由ChatGPT-4o, GPT-5.1協助生成,作者具備相關專業能力,對 AI 產出內容進行審核與把關,並對文章的正確性負最終責任。若文中有錯誤之處,敬請不吝指正,作者將虛心接受指教並儘速修正。