海思專家如何看待 RDMA 技術?

作者介紹:華爲海思軟件工程師 Savir(知乎用戶名)。

本想完全靠自己的語言完成這篇概述,然而開篇並沒有想象當中的好寫,看樣子從宏觀上概括一個技術比從微觀上探究細枝末節要困難不少。本文是以前人們對 RDMA 技術的介紹爲主,加入了一些自己的理解。

什麼是 DMA

DMA 全稱爲 Direct Memory Access,即直接內存訪問。意思是外設對內存的讀寫過程可以不用 CPU 參與而直接進行。我們先來看一下沒有 DMA 的時候:

無 DMA 控制器時 I/O 設備和內存間的數據路徑

假設 I/O 設備爲一個普通網卡,爲了從內存拿到需要發送的數據,然後組裝數據包發送到物理鏈路上,網卡需要通過總線告知 CPU 自己的數據請求。然後 CPU 將會把內存緩衝區中的數據複製到自己內部的寄存器中,再複製到 I/O 設備的存儲空間中。如果數據量比較大,那麼很長一段時間內 CPU 都會忙於搬移數據,而無法投入到其他工作中去。

CPU 的最主要工作是計算,而不是進行數據複製,這種工作屬於白白浪費了它的計算能力。爲了給 CPU“減負”,讓它投入到更有意義的工作中去,後來人們設計了 DMA 機制:

有 DMA 控制器時 I/O 設備和內存間的數據路徑

可以看到總線上又掛了一個 DMA 控制器,它是專門用來讀寫內存的設備。有了它以後,當我們的網卡想要從內存中拷貝數據時,除了一些必要的控制命令外,整個數據複製過程都是由 DMA 控制器完成的。過程跟 CPU 複製是一樣的,只不過這次是把內存中的數據通過總線複製到 DMA 控制器內部的寄存器中,再複製到 I/O 設備的存儲空間中。CPU 除了關注一下這個過程的開始和結束以外,其他時間可以去做其他事情。

DMA 控制器一般是和 I/O 設備在一起的,也就是說一塊網卡中既有負責數據收發的模塊,也有 DMA 模塊。

什麼是 RDMA

RDMA( Remote Direct Memory Access )意爲遠程直接地址訪問,通過 RDMA,本端節點可以 “直接” 訪問遠端節點的內存。所謂直接,指的是可以像訪問本地內存一樣,繞過傳統以太網複雜的 TCP/IP 網絡協議棧讀寫遠端內存,而這個過程對端是不感知的,而且這個讀寫過程的大部分工作是由硬件而不是軟件完成的。

爲了能夠直觀的理解這一過程,請看下面兩個圖(圖中箭頭僅做示意,不表示實際邏輯或物理關係):

傳統網絡中,“節點 A 給節點 B 發消息” 實際上做的是 “把節點 A 內存中的一段數據,通過網絡鏈路搬移到節點 B 的內存中”,而這一過程無論是發端還是收段,都需要 CPU 的指揮和控制,包括網卡的控制,中斷的處理,報文的封裝和解析等等。

上圖中左邊的節點在內存用戶空間中的數據,需要經過 CPU 拷貝到內核空間的緩衝區中,然後纔可以被網卡訪問,這期間數據會經過軟件實現的 TCP/IP 協議棧,加上各層頭部和校驗碼,比如 TCP 頭,IP 頭等。網卡通過 DMA 拷貝內核中的數據到網卡內部的緩衝區中,進行處理後通過物理鏈路發送給對端。

對端收到數據後,會進行相反的過程:從網卡內部存儲空間,將數據通過 DMA 拷貝到內存內核空間的緩衝區中,然後 CPU 會通過 TCP/IP 協議棧對其進行解析,將數據取出來拷貝到用戶空間中。

可以看到,即使有了 DMA 技術,上述過程還是對 CPU 有較強的依賴。

而使用了 RDMA 技術之後,這一過程可以簡單的表示成下面的示意圖:

同樣是把本端內存中的一段數據,複製到對端內存中,在使用了 RDMA 技術時,兩端的 CPU 幾乎不用參與數據傳輸過程(只參與控制面)。本端的網卡直接從內存的用戶空間 DMA 拷貝數據到內部存儲空間,然後硬件進行各層報文的組裝後,通過物理鏈路發送到對端網卡。對端的 RDMA 網卡收到數據後,剝離各層報文頭和校驗碼,通過 DMA 將數據直接拷貝到用戶空間內存中。

RDMA 的優勢

RDMA 主要應用在高性能計算(HPC)領域和大型數據中心當中,並且設備相對普通以太網卡要昂貴不少(比如 Mellanox 公司的 Connext-X 5 100Gb PCIe 網卡市價在 4000 元以上)。由於使用場景和價格的原因,RDMA 與普通開發者和消費者的距離較遠,目前主要是一些大型互聯網企業在部署和使用。

RDMA 技術爲什麼可以應用在上述場景中呢?這就涉及到它的以下幾個特點:

0 拷貝:指的是不需要在用戶空間和內核空間中來回複製數據。

由於 Linux 等操作系統將內存劃分爲用戶空間和內核空間,在傳統的 Socket 通信流程中 CPU 需要多次把數據在內存中來回拷貝。而通過 RDMA 技術,我們可以直接訪問遠端已經註冊的內存區域。

關於 0 拷貝可以參考這篇文章:jianshu.com/p/e76e3580e

內核 Bypass:指的是 IO(數據)流程可以繞過內核,即在用戶層就可以把數據準備好並通知硬件準備發送和接收。避免了系統調用和上下文切換的開銷。

上圖(原圖中 Socket 有三次拷貝,我認爲應該是兩次)可以很好的解釋 “0 拷貝” 和“內核 Bypass”的含義。上下兩部分分別是基於 Socket 的和基於 RDMA 的一次收 - 發流程,左右分別爲兩個節點。可以明顯的看到 Socket 流程中在軟件中多了一次拷貝動作。而 RDMA 繞過了內核同時也減少了內存拷貝,數據可以直接在用戶層和硬件間傳遞。

CPU 卸載:指的是可以在遠端節點 CPU 不參與通信的情況下(當然要持有訪問遠端某段內存的 “鑰匙” 纔行)對內存進行讀寫,這實際上是把報文封裝和解析放到硬件中做了。而傳統的以太網通信,雙方 CPU 都必須參與各層報文的解析,如果數據量大且交互頻繁,對 CPU 來講將是一筆不小的開銷,而這些被佔用的 CPU 計算資源本可以做一些更有價值的工作。

通信領域兩大出場率最高的性能指標就是 “帶寬” 和“時延”。簡單的說,所謂帶寬指的是指單位時間內能夠傳輸的數據量,而時延指的是數據從本端發出到被對端接收所耗費的時間。因爲上述幾個特點,相比於傳統以太網,RDMA 技術同時做到了更高帶寬和更低時延,所以其在帶寬敏感的場景——比如海量數據的交互,時延敏感——比如多個計算節點間的數據同步的場景下得以發揮其作用。

協議

RDMA 本身指的是一種技術,具體協議層面,包含 Infiniband(IB),RDMA over Converged Ethernet(RoCE)和 internet Wide Area RDMA Protocol(iWARP)。三種協議都符合 RDMA 標準,使用相同的上層接口,在不同層次上有一些差別。

上圖對於幾種常見的 RDMA 技術的協議層次做了非常清晰的對比,

Infiniband

2000 年由 IBTA(InfiniBand Trade Association)提出的 IB 協議是當之無愧的核心,其規定了一整套完整的鏈路層到傳輸層(非傳統 OSI 七層模型的傳輸層,而是位於其之上)規範,但是其無法兼容現有以太網,除了需要支持 IB 的網卡之外,企業如果想部署的話還要重新購買配套的交換設備。

RoCE

RoCE 從英文全稱就可以看出它是基於以太網鏈路層的協議,v1 版本網絡層仍然使用了 IB 規範,而 v2 使用了 UDP+IP 作爲網絡層,使得數據包也可以被路由。RoCE 可以被認爲是 IB 的 “低成本解決方案”,將 IB 的報文封裝成以太網包進行收發。由於 RoCE v2 可以使用以太網的交換設備,所以現在在企業中應用也比較多,但是相同場景下相比 IB 性能要有一些損失。

iWARP

iWARP 協議是 IETF 基於 TCP 提出的,但是因爲 TCP 是面向連接的協議,而大量的 TCP 連接會耗費很多的內存資源,另外 TCP 複雜的流控等機制會導致性能問題,所以 iWARP 相比基於 UDP 的 RoCE v2 來說並沒有優勢(IB 的傳輸層也可以像 TCP 一樣保證可靠性),所以 iWARP 相比其他兩種協議的應用不是很多。

需要注意的是,上述幾種協議都需要專門的硬件(網卡)支持。這三種協議的關係大致如下圖所示:

由於筆者在工作中只接觸過 IB 和 RoCE,所以本專欄着重介紹 IB 和 RoCE,不涉及 iWARP 的內容。

玩家

標準 / 生態組織

提到 IB 協議,就不得不提到兩大組織——IBTA 和 OFA。

IBTA

成立於 1999 年,負責制定和維護 Infiniband 協議標準。IBTA 獨立於各個廠商,通過贊助技術活動和推動資源共享來將整個行業整合在一起,並且通過線上交流、營銷和線下活動等方式積極推廣 IB 和 RoCE。

IBTA 會對商用的 IB 和 RoCE 設備進行協議標準符合性和互操作性測試及認證,由很多大型的 IT 廠商組成的委員會領導,其主要成員包括博通,HPE,IBM,英特爾,Mellanox 和微軟等,華爲也是 IBTA 的會員。

OFA

成立於 2004 年的非盈利組織,負責開發、測試、認證、支持和分發獨立於廠商的開源跨平臺 infiniband 協議棧,2010 年開始支持 RoCE。其對用於支撐 RDMA/Kernel bypass 應用的 OFED(OpenFabrics Enterprise Distribution)軟件棧負責,保證其與主流軟硬件的兼容性和易用性。OFED 軟件棧包括驅動、內核、中間件和 API。

上述兩個組織是配合關係,IBTA 主要負責開發、維護和增強 Infiniband 協議標準;OFA 負責開發和維護 Infiniband 協議和上層應用 API。

開發社區

Linux 社區

Linux 內核的 RDMA 子系統還算比較活躍,經常會討論一些協議細節,對框架的修改比較頻繁,另外包括華爲和 Mellanox 在內的一些廠商也會經常對驅動代碼進行修改。

郵件訂閱:vger.kernel.org/vger-li

代碼位於內核 drivers/infiniband / 目錄下,包括框架核心代碼和各廠商的驅動代碼。

代碼倉:git.kernel.org/pub/scm/

RDMA 社區

對於上層用戶,IB 提供了一套與 Socket 套接字類似的接口——libibverbs,前文所述三種協議都可以使用。參考着協議、API 文檔和示例程序很容易就可以寫一個 Demo 出來。本專欄中的 RDMA 社區專指其用戶態社區,在 github 上其倉庫的名字爲 linux-rdma。主要包含兩個子倉庫:

用戶態核心代碼,API,文檔以及各個廠商的用戶態驅動。

一個功能強大的用於測試 RDMA 性能的工具代碼倉:github.com/linux-rdma/

UCX

UCX 是一個建立在 RDMA 等技術之上的用於數據處理和高性能計算的通信框架,RDMA 是其底層核心之一。我們可以將其理解爲是位於應用和 RDMA API 之間的中間件,向上層用戶又封裝了一層更易開發的接口。

筆者對其並不瞭解太多,只知道業界有一些企業在基於 UCX 開發應用。代碼倉:github.com/openucx/ucx

硬件廠商

設計和生產 IB 相關硬件的廠商有不少,包括 Mellanox、華爲、收購了 Qlogic 的 IB 技術的 Intel,博通、Marvell,富士通等等,這裏就不逐個展開了,僅簡單提一下 Mellanox 和華爲。

Mellanox:IB 領域的領頭羊,協議標準制定、軟硬件開發和生態建設都能看到 Mellanox 的身影,其在社區和標準制定上上擁有最大的話語權。目前最新一代的網卡是支持 200Gb/s 的 ConnextX-6 系列。

華爲:去年初推出的鯤鵬 920 芯片已經支持 100Gb/s 的 RoCE 協議,技術上在國內處於領先地位。但是軟硬件和影響力方面距離 Mellanox 還有比較長的路要走,相信華爲能夠早日趕上老大哥的步伐。

用戶

微軟、IBM 和國內的阿里、京東都正在使用 RDMA,另外還有很多大型 IT 公司在做初步的開發和測試。在數據中心和高性能計算場景下,RDMA 代替傳統網絡是大勢所趨。筆者對於市場接觸不多,所以並不能提供更詳細的應用情況。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/UqSydz8hJCFcX5CF30gXSw