首頁>技術>

本文轉自知乎Savir的專欄

前面幾篇涉及RDMA的通訊流程時一直在講SEND-RECV,然而它其實稱不上是“RDMA”,只是一種加入了0複製和協議棧解除安裝的傳統收發模型的“升級版”,這種操作型別沒有完全發揮RDMA技術全部實力,常用於兩端交換控制資訊等場景。當涉及大量資料的收發時,更多使用的是兩種RDMA獨有的操作:WRITE和READ。

我們先來複習下雙端操作——SEND和RECV,然後再對比介紹單端操作——WRITE和READ。

SEND & RECV

SEND和RECV是兩種不同的操作型別,但是因為如果一端進行SEND操作,對端必須進行RECV操作,所以通常都把他們放到一起描述。

為什麼稱之為“雙端操作”?因為完成一次通訊過程需要兩端CPU的參與,並且收端需要提前顯式的下發WQE。下圖是一次SEND-RECV操作的過程示意圖。原圖來自於[1],我做了一些修改。

上一篇我們講過,上層應用透過WQE(WR)來給硬體下任務。在SEND-RECV操作中,不止傳送端需要下發WQE,接收端也需要下發WQE來告訴硬體收到的資料需要放到哪個地址。傳送端並不知道傳送的資料會放到哪裡,每次傳送資料,接收端都要提前準備好接收Buffer,而接收端CPU自然會感知這一過程。

為了下文對比SEND/RECV與WRITE/READ的異同,我們將上一篇的SEND-RECV流程中補充記憶體讀寫這一環節,即下圖中的步驟⑤——傳送端硬體根據WQE從記憶體中取出資料封裝成可在鏈路上傳輸資料包和步驟⑦——接收端硬體將資料包解析後根據WQE將資料放到指定記憶體區域,其他步驟不再贅述。另外再次強調一下,收發端的步驟未必是圖中這個順序,比如步驟⑧⑪⑫和步驟⑨⑩的先後順序就是不一定的。

下面將介紹WRITE操作,對比之後相信大家可以理解的更好。

WRITE

WRITE全稱是RDMA WRITE操作,是本端主動寫入遠端記憶體的行為,除了準備階段,遠端CPU不需要參與,也不感知何時有資料寫入、資料在何時接收完畢。所以這是一種單端操作。

透過下圖我們對比一下WRITE和SEND-RECV操作的差異,本端在準備階段透過資料互動,獲取了對端某一片可用的記憶體的地址和“鑰匙”,相當於獲得了這片遠端記憶體的讀寫許可權。拿到許可權之後,本端就可以像訪問自己的記憶體一樣直接對這一遠端記憶體區域進行讀寫,這也是RDMA——遠端直接地址訪問的內涵所在。

WRITE/READ操作中的目的地址和鑰匙是如何獲取的呢?通常可以透過我們剛剛講過的SEND-RECV操作來完成,因為拿到鑰匙這個過程總歸是要由遠端記憶體的控制者——CPU允許的。雖然準備工作還比較複雜, 但是一旦完成準備工作,RDMA就可以發揮其優勢,對大量資料進行讀寫。一旦遠端的CPU把記憶體授權給本端使用,它便不再會參與資料收發的過程,這就解放了遠端CPU,也降低了通訊的時延。

需要注意的是,本端是透過虛擬地址來讀寫遠端記憶體的,上層應用可以非常方便的對其進行操作。實際的虛擬地址—物理地址的轉換是由RDMA網絡卡完成的。具體是如何轉換的,將在後面的文章介紹。

忽略準備階段key和addr的獲取過程,下面我們描述一次WRITE操作的流程,此後我們不再將本端稱為“傳送”和“接收”端,而是改為“請求”和“響應”端,這樣對於描述WRITE和READ操作都更恰當一些,也不容易產生歧義。

請求端APP以WQE(WR)的形式下發一次WRITE任務。請求端硬體從SQ中取出WQE,解析資訊。請求端網絡卡根據WQE中的虛擬地址,轉換得到物理地址,然後從記憶體中拿到待發送資料,組裝資料包。請求端網絡卡將資料包透過物理鏈路傳送給響應端網絡卡。響應端收到資料包,解析目的虛擬地址,轉換成本地物理地址,解析資料,將資料放置到指定記憶體區域。響應端回覆ACK報文給請求端。請求端網絡卡收到ACK後,生成CQE,放置到CQ中。請求端APP取得任務完成資訊。READ

顧名思義,READ跟WRITE是相反的過程,是本端主動讀取遠端記憶體的行為。同WRITE一樣,遠端CPU不需要參與,也不感知資料在記憶體中被讀取的過程。

獲取key和虛擬地址的流程也跟WRITE沒有區別,需要注意的是“讀”這個動作所請求的資料,是在對端回覆的報文中攜帶的

下面描述一次READ操作的流程,注意跟WRITE只是方向和步驟順序的差別。

請求端APP以WQE的形式下發一次READ任務。請求端網絡卡從SQ中取出WQE,解析資訊。請求端網絡卡將READ請求包透過物理鏈路傳送給響應端網絡卡。響應端收到資料包,解析目的虛擬地址,轉換成本地物理地址,解析資料,從指定記憶體區域取出資料。響應端硬體將資料組裝成回覆資料包傳送到物理鏈路。請求端硬體收到資料包,解析提取出資料後放到READ WQE指定的記憶體區域中。請求端網絡卡生成CQE,放置到CQ中。請求端APP取得任務完成資訊。總結

我們忽略各種細節進行抽象,RDMA WRITE和READ操作就是在利用網絡卡完成下面左圖的記憶體複製操作而已,只不過複製的過程是由RDMA網絡卡透過網路鏈路完成的;而本地記憶體複製則如下面右圖所示由CPU透過匯流排完成的:

RDMA標準定義上述幾種操作的時候使用的單詞是非常貼切的,“收”和“發”是需要有對端主動參與的語義 ,而‘讀“和”寫“更像是本端對一個沒有主動性的對端進行操作的語義。

透過對比SEND/RECV和WRITE/READ操作,我們可以發現傳輸資料時不需要響應端CPU參與的WRITE/READ有更大的優勢,缺點就是請求端需要在準備階段獲得響應端的一段記憶體的讀寫許可權。但是實際資料傳輸時,這個準備階段的功率和時間損耗都是可以忽略不計的,所以RDMA WRITE/READ才是大量傳輸資料時所應用的操作型別,SEND/RECV通常只是用來傳輸一些控制資訊。

除了本文介紹的幾種操作之外,還有ATOMIC等更復雜一些的操作型別,將在後面的協議解讀部分詳細分析。本篇就到這裡,下一篇將介紹RDMA 基本服務型別。

7
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • .NET對接Mis閃付介面