1、技術背景:
傳(chuan)(chuan)統(tong)的TCP/IP通信方式在兩臺PC之間的傳(chuan)(chuan)輸過程大概是(shi)這樣的:
- 發送端需要將數據從用戶空間復制到內核空間的Socket Buffer
- 發送端在內核空間中添加數據包頭,進行數據封裝
- 數據從內核空間的Socket Buffer復制到NIC Buffer進行網絡傳輸
- 接收端接收到從遠端發送的數據包后,要將數據包從NIC Buffer中復制到內核空間的Socket Buffer
- 經過一系列網絡協議進行數據包的解析工作,將解析后的數據從內核空間的Socket Buffer復制到用戶空間
- 進行系統上下文切換,用戶應用程序才被調用
多次上(shang)下(xia)文切(qie)換,內存(cun)拷(kao)貝需(xu)要CPU介入,導(dao)致處理延時(shi)大,消耗CPU。同時(shi)傳統(tong)內存(cun)訪(fang)問需(xu)要通(tong)(tong)過(guo)CPU進行(xing)數(shu)據(ju)(ju)copy來移(yi)動(dong)數(shu)據(ju)(ju),通(tong)(tong)過(guo)CPU將內存(cun)中的(de)(de)是數(shu)據(ju)(ju)進行(xing)搬(ban)運。在(zai)DMA模式下(xia)中,計(ji)算機主板(ban)上(shang)的(de)(de)設備通(tong)(tong)過(guo)DMA直接把(ba)數(shu)據(ju)(ju)發送到目標(biao)內存(cun)中去,數(shu)據(ju)(ju)搬(ban)運不需(xu)要CPU的(de)(de)參與。如下(xia)圖(tu)所(suo)示,圖(tu)中紅色部(bu)分(fen)(fen)是CPU參與數(shu)據(ju)(ju)搬(ban)運,綠色部(bu)分(fen)(fen)是DMA搬(ban)運數(shu)據(ju)(ju)。

2、RDMA概念
RDMA( Remote Direct Memory Access )意為(wei)遠(yuan)程直(zhi)接地址訪問(wen),通過RDMA,本(ben)端節(jie)點(dian)可(ke)以(yi)“直(zhi)接”訪問(wen)遠(yuan)端節(jie)點(dian)的(de)內存(cun)。所謂直(zhi)接,指的(de)是(shi)可(ke)以(yi)像(xiang)訪問(wen)本(ben)地內存(cun)一樣,繞過傳統以(yi)太網(wang)復雜的(de)TCP/IP網(wang)絡協(xie)議棧讀寫遠(yuan)端內存(cun),而(er)這(zhe)個(ge)過程對端是(shi)不感知的(de),而(er)且這(zhe)個(ge)讀寫過程的(de)大部分工(gong)作是(shi)由(you)硬(ying)件而(er)不是(shi)軟件完成(cheng)的(de)。如下圖(tu)所示:

3、與傳統通信對比的優勢:

如上圖(tu)所示:可(ke)以(yi)看(kan)到傳統的(de)方(fang)法需要經(jing)過(guo)用戶(hu)態->內(nei)核->硬(ying)件。而RDMA直(zhi)接是(shi)只(zhi)經(jing)過(guo)用戶(hu)態,數據(ju)的(de)存取是(shi)通過(guo)RDMA硬(ying)件直(zhi)接操(cao)作內(nei)存的(de)。
使用RDMA的優勢如(ru)下:
- 零拷貝:用戶的數據能夠被直接發送到緩沖區或者能夠直接從緩沖區里接收,而不需要被多次拷貝。
- 內核bypass:用戶可以直接在用戶態執行數據傳輸,不需要在內核態與用戶態之間做上下文切換;
- CPU卸載:用戶可以訪問遠程主機內存而不消耗遠程主機中的任何CPU。可以在遠程主機不知情的情況下對其進行讀寫操作。
4、支持RDMA的網絡協議
目前支持RDMA的網絡協議(yi)主要有三種:
- InfiniBand(IB)
- iWARP(RDMA over TCP/IP)
- RoCE(RDMA over Converged Ethernet)

上圖對于幾種(zhong)常見(jian)的(de)RDMA技術(shu)的(de)協(xie)議層次做了非常清(qing)晰的(de)對比,
4.1、Infiniband
由IBTA(InfiniBand Trade Association)提出(chu)的IB協議,RDMA在(zai)設計的時候(hou)重新定(ding)義了(le)物理(li)鏈路層、網(wang)絡(luo)層、傳輸(shu)層,所以要使用專用的IB交(jiao)換機和網(wang)卡做(zuo)物理(li)隔離的專網(wang),成本較大,但(dan)性能表現(xian)最(zui)優。
4.2、RoCE
RoCEv2是運行在以太網(wang)之上的RDMA,RoCEV1基(ji)于以太網(wang)數據鏈(lian)路層協議(yi),僅可在局域網(wang)的單個廣播域內(nei)傳輸。RoCEv2基(ji)于UDP協議(yi),支持路由協議(yi),傳輸距(ju)離更(geng)遠。RoCEv2需要支持“無損以太網(wang)”以達到類似于InfiniBand的性(xing)能特(te)征,一般通過無損以太網(wang)的優先流量控制(PFC)配置保證(zheng)擁塞時(shi)不丟包,同時(shi)使用(yong)ECN進一步減緩擁塞。
4.3、iWARP
iWARP將(jiang)InfiniBand移植到TCP/IP協議(yi)(yi)棧(zhan),使主流的(de)(de)以(yi)太網支(zhi)持RDMA,支(zhi)持在(zai)標準的(de)(de)以(yi)太網交換(huan)機(ji)上運行RDMA,但缺點(dian)在(zai)于TCP協議(yi)(yi)開銷較(jiao)大(da),且算法復(fu)雜,失(shi)去了大(da)部分的(de)(de)RDMA性能優勢。
綜上:雖然有軟件實現(xian)的RoCE和iWARP協議(yi),但是真(zhen)正商用時上述幾種(zhong)協議(yi)都需要專門的硬件(網卡)支持。
5、RDMA 基本元素:
5.1、隊列(Queue)
- RDMA一共支持三種隊列:
(1)發送(song)隊列Send Queue(SQ)和(he)接收隊列Recv Queue(RQ),SQ和(he)RQ通常成(cheng)對創建(jian),被(bei)稱為Queue Pairs(QP)。
(2)完成(cheng)隊列Completion Queue(CQ)。
- 隊列中的元素:
(1)SQ和(he)RQ中元素(su)的(de)叫WQE(Work Queue Element,工(gong)作隊列元素(su)),因(yin)此SQ和(he)RQ也被統稱為WQ。
(2)CQ中的元(yuan)素叫(jiao)CQE(Completion Queue Elemen)。
5.2、WR和WC:
WR全稱(cheng)(cheng)Work Request,意為工作請求;WC全稱(cheng)(cheng)Work Completion,意為工作完成(cheng)。這兩(liang)者其實是WQE和CQE在用戶層(ceng)的“映射”。因為用戶是通(tong)過調(diao)用協(xie)議棧接口來完成(cheng)RDMA通(tong)信(xin)的,WQE和CQE本身(shen)并不對用戶可見,是驅動中(zhong)的概(gai)念。用戶真正通(tong)過Verbs API下發的是WR,收到的是WC。
5.3、Memory Registration(MR) | 內存注冊
MR全(quan)稱(cheng)為Memory Region,指的是由(you)RDMA軟件層在內存(cun)(cun)中規劃出的一片區域,用(yong)于(yu)存(cun)(cun)放收發的數據。IB協議中,用(yong)戶在申請完用(yong)于(yu)存(cun)(cun)放數據的內存(cun)(cun)區域之后(hou),都需(xu)要通過(guo)調用(yong)IB框架提供的API注冊MR,才能讓RDMA網卡(ka)訪問(wen)這片內存(cun)(cun)區域。
注冊MR主要解決三(san)個問(wen)題:(1)實現虛擬(ni)地址與物(wu)理地址轉換(huan),(2)避免(mian)進程(cheng)換(huan)頁導致數據發生變(bian)化;(3)控制本端(duan)和對端(duan)訪(fang)問(wen)內存的權(quan)限。
6、RDMA基本操作
6.1、概述:
以生(sheng)產者-消費者角度(du)簡(jian)單概述如下:
(1)HOST提交工(gong)作請求WR,將WR放到(post)工(gong)作隊列WQ(SQ和(he)RQ)。此時SQ和(he)RQ中就有WQE(WR),等待RDMA硬件消費;
(2)RDMA硬件從SQ和(he)RQ中(zhong)消費WQE(WR);
(3)RDMA硬件消(xiao)費(fei)完成后(hou),產生CQE(WC),將CQE放入CQ隊列中,等待HOST消(xiao)費(fei)。
(4)HOST從(cong)CQ中消費(fei)WC(CQE)。

6.2、RDMA SEND/RECV操作:
SEND/RECV是(shi)雙邊(bian)操作,即(ji)需(xu)要(yao)通信雙方的參與(yu),并且(qie)RECV要(yao)先于(yu)SEND執行(xing),這(zhe)樣對方才能發送數據(ju),當然如果(guo)對方不需(xu)要(yao)發送數據(ju),可以不執行(xing)RECEIVE操作。如下圖所示(圖中的順(shun)序不一定(ding)是(shi)正(zheng)確(que)的,處理邏輯由硬件(jian)決定(ding)的):

(1)service host以(yi)WR(WQE)的形式下發一次RECV任務(wu)到(dao)RQ。
(2)client host以WR(WQE)的(de)形(xing)式下發一(yi)次SEND任務到SQ。
(3)client host的RDMA硬件(具有RDMA功能的硬件)從SQ中消費WQE。
(4)client host的RDMA硬件從內存中拿到(dao)待發送數據(ju),組裝(zhuang)數據(ju)包。
(5)client host的網卡(ka)將數據包通過物理鏈路發送給service網卡(ka)。
(6)service host收到數據,進行(xing)校驗(yan)后回復(fu)ACK報文給client。
(7)service host的RDMA硬件從RQ中消費WQE。
(8)service host的(de)RDMA硬件將(jiang)數(shu)據放到WQE中指(zhi)定的(de)位(wei)置。
(9)service host的RDMA硬(ying)件(jian)生成CQE,放置(zhi)到CQ中。
(10)service host消費CQE。
(11)client host的RDMA硬件收到ACK后(hou),生成CQE,放置(zhi)到CQ中(zhong)。
(12)client host消費CQE。
6.3、RDMA WRITE操作:
RDMA WRITE是(shi)(shi)單邊操作,是(shi)(shi)本端(duan)主動寫入(ru)(ru)遠端(duan)內(nei)存(cun)的行為,除了準備階(jie)段(duan)(建鏈、交換內(nei)存(cun)信(xin)息),遠端(duan)CPU不需要參與,也不感知何(he)時有數據(ju)寫入(ru)(ru)、數據(ju)在何(he)時接收完畢(bi)。如(ru)下圖所示:

(1)client host以WR(WQE)的形式下(xia)發一次WRITE任務。
(2)client host的RDMA硬件(jian)從(cong)SQ中取出WQE,解析信息。
(3)client host的RDMA硬件根據(ju)WQE中的虛擬地(di)址(zhi),轉換(huan)得到物理(li)地(di)址(zhi),然后(hou)從內存中拿(na)到待發送數據(ju),組裝(zhuang)數據(ju)包。
(4)client host網卡(ka)將(jiang)數據(ju)包通過物理(li)鏈(lian)路發送給service網卡(ka)。
(5)service host的RDMA硬件收到(dao)數(shu)據(ju)包,解(jie)析(xi)目的虛(xu)擬(ni)地址,轉換成本地物(wu)理地址,解(jie)析(xi)數(shu)據(ju),將數(shu)據(ju)放置到(dao)指定內存區域。
(6)service host回復(fu)ACK報文給client。
(7)client host的RDMA硬件收到ACK后,生成CQE,放置到CQ中。
(8)client host消費CQE。
6.4、RDMA READ操作:
RDMA READ也是單(dan)邊操作,與WRITE是相(xiang)反的(de)(de)過程(cheng),是本(ben)端主動讀取遠端內(nei)存的(de)(de)行為。同WRITE一樣,遠端CPU不需要參與,也不感(gan)知數據(ju)在內(nei)存中被讀取的(de)(de)過程(cheng)。如下(xia)圖(tu)所示:

(1)client host以(yi)WR(WQE)的形式下(xia)發一(yi)次READ任務(wu)。
(2)client host的(de)RDMA硬件從(cong)SQ中取出WQE,解析信息。
(3)client host的網卡將READ請(qing)求(qiu)包通(tong)過物(wu)理鏈路發送給service。
(4)service host收(shou)到(dao)數據包,解析(xi)目的(de)虛擬地址,轉換成本(ben)地物理地址,解析(xi)數據,從指定內存(cun)區域取出數據。
(5)service host的RDMA硬(ying)件(jian)將數據(ju)組裝成(cheng)回復數據(ju)包發(fa)送(song)到(dao)物理鏈路。
(6)client host的(de)RDMA硬件收到(dao)數據包,解析提取出(chu)數據后放到(dao)READ WQE指定的(de)內存區(qu)域中。
(7)client host的RDMA硬件生(sheng)成CQE,放置到(dao)CQ中。
(8)client host消費CQE。
7、RDMA編程接口之IB Verbs API:
7.1一些基本信息了解:
- RDMA Core 指開源RDMA用戶態軟件協議棧,包含用戶態框架、各廠商用戶態驅動、API幫助手冊以及開發自測試工具等。rdma-core在github上維護,我們的用戶態Verbs API實際上就是它實現的。
路徑://github.com/linux-rdma/rdma-core
- kernel RDMA subsystem指開源的Linux內核中的RDMA子系統,包含RDMA內核框架及各廠商的驅動。RDMA子系統跟隨Linux維護,是內核的的一部分。一方面提供內核態的Verbs API,一方面負責對接用戶態的接口。
驅動路徑:kernel/drivers/infiniband; 頭文件(jian)kernel/include/rdma;和 kernel/include/uapi/rdma。
- OFED:全稱為OpenFabrics Enterprise Distribution,是一個開源軟件包集合,其中包含內核框架和驅動、用戶框架和驅動、以及各種中間件、測試工具和API文檔。
開源OFED由OFA組(zu)織負責開發、發布和(he)維護,它會定期從rdma-core和(he)內核的 RDMA子系統(tong)取軟(ruan)件版(ban)本(ben),并對各商(shang)用OS發行(xing)版(ban)進行(xing)適配。除了協議(yi)棧和(he)驅動(dong)外, 還(huan)包含了perftest等測試(shi)工具(ju)。
7.2 什么是Verbs API
Verbs API是一(yi)組用(yong)于使用(yong)RDMA服務的(de)(de)最(zui)基本(ben)的(de)(de)軟件接口,也就(jiu)是說業界的(de)(de)RDMA應用(yong),向(xiang)用(yong)戶提供了有關RDMA的(de)(de)一(yi)切功(gong)能,典(dian)型的(de)(de)包括:注冊MR、創建QP、Post Send、Post send、Poll CQ等等。
對于Linux系統來說,Verbs的功(gong)能由rdma-core和內核中(zhong)的RDMA子系統提供,分為用戶態(tai)Verbs接(jie)口和內核態(tai)Verbs接(jie)口,分別用于用戶態(tai)和內核態(tai)的RDMA應用。
組件架構如下:
