https://zhuanlan.zhihu.com/p/138874738
本想完全靠自己的語言完成這篇概述,然而開篇並沒有想象當中的好寫,看樣子從宏觀上概括一個技術比從微觀上探究細枝末節要困難不少。本文是以前人們對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拷貝可以參考這篇文章:https://www.jianshu.com/p/e76e3580e356
- 內核Bypass:指的是IO(數據)流程可以繞過內核,即在用戶層就可以把數據准備好並通知硬件准備發送和接收。避免了系統調用和上下文切換的開銷。
上圖(原圖[1])可以很好的解釋“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標准,使用相同的上層接口,在不同層次上有一些差別。
上圖[2]對於幾種常見的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[3]
成立於1999年,負責制定和維護Infiniband協議標准。IBTA獨立於各個廠商,通過贊助技術活動和推動資源共享來將整個行業整合在一起,並且通過線上交流、營銷和線下活動等方式積極推廣IB和RoCE。
IBTA會對商用的IB和RoCE設備進行協議標准符合性和互操作性測試及認證,由很多大型的IT廠商組成的委員會領導,其主要成員包括博通,HPE,IBM,英特爾,Mellanox和微軟等,華為也是IBTA的會員。
OFA[4]
成立於2004年的非盈利組織,負責開發、測試、認證、支持和分發獨立於廠商的開源跨平台infiniband協議棧,2010年開始支持RoCE。其對用於支撐RDMA/Kernel bypass應用的OFED(OpenFabrics Enterprise Distribution)軟件棧負責,保證其與主流軟硬件的兼容性和易用性。OFED軟件棧包括驅動、內核、中間件和API。
上述兩個組織是配合關系,IBTA主要負責開發、維護和增強Infiniband協議標准;OFA負責開發和維護Infiniband協議和上層應用API。
開發社區
Linux社區
Linux內核的RDMA子系統還算比較活躍,經常會討論一些協議細節,對框架的修改比較頻繁,另外包括華為和Mellanox在內的一些廠商也會經常對驅動代碼進行修改。
郵件訂閱:http://vger.kernel.org/vger-lists.html#linux-rdma
代碼位於內核drivers/infiniband/目錄下,包括框架核心代碼和各廠商的驅動代碼。
代碼倉:https://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git/
RDMA社區
對於上層用戶,IB提供了一套與Socket套接字類似的接口——libibverbs,前文所述三種協議都可以使用。參考着協議、API文檔和示例程序很容易就可以寫一個Demo出來。本專欄中的RDMA社區專指其用戶態社區,在github上其倉庫的名字為linux-rdma。
主要包含兩個子倉庫:
- rdma-core
用戶態核心代碼,API,文檔以及各個廠商的用戶態驅動。
- perftest
一個功能強大的用於測試RDMA性能的工具。
代碼倉:https://github.com/linux-rdma/
UCX[5]
UCX是一個建立在RDMA等技術之上的用於數據處理和高性能計算的通信框架,RDMA是其底層核心之一。我們可以將其理解為是位於應用和RDMA API之間的中間件,向上層用戶又封裝了一層更易開發的接口。
筆者對其並不了解太多,只知道業界有一些企業在基於UCX開發應用。
代碼倉:https://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代替傳統網絡是大勢所趨。筆者對於市場接觸不多,所以並不能提供更詳細的應用情況。
下一篇將用比較直觀的方式比較一次典型的基於Socket的傳統以太網和RDMA通信過程。