4. RDMA操作類型

本文歡迎非商業轉載,轉載請註明出處。

前面幾篇涉及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將數據放到指定內存區域,其他步驟不再贅述。另外再次強調一下,收發端的步驟未必是圖中這個順序,比如步驟⑧⑪⑫和步驟⑨⑩的先後順序就是不一定的。

1ee2345523e206c08d72817e6d1b9b24

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

WRITE

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

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

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

3add1d5b38689ef680969d3ef4d1232e

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

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

  1. 請求端APP以WQE(WR)的形式下發一次WRITE任務。
  2. 請求端硬件從SQ中取出WQE,解析信息。
  3. 請求端網卡根據WQE中的虛擬地址,轉換得到物理地址,然後從內存中拿到待發送數據,組裝數據包。
  4. 請求端網卡將數據包通過物理鏈路發送給響應端網卡。
  5. 響應端收到數據包,解析目的虛擬地址,轉換成本地物理地址,解析數據,將數據放置到指定內存區域。
  6. 響應端回復ACK報文給請求端。
  7. 請求端網卡收到ACK後,生成CQE,放置到CQ中。
  8. 請求端APP取得任務完成信息。

READ

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

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

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

3faf35aa9683e9d33334fc86ded44ffd

  1. 請求端APP以WQE的形式下發一次READ任務。
  2. 請求端網卡從SQ中取出WQE,解析信息。
  3. 請求端網卡將READ請求包通過物理鏈路發送給響應端網卡。
  4. 響應端收到數據包,解析目的虛擬地址,轉換成本地物理地址,解析數據,從指定內存區域取出數據。
  5. 響應端硬件將數據組裝成回復數據包發送到物理鏈路。
  6. 請求端硬件收到數據包,解析提取出數據後放到READ WQE指定的內存區域中。
  7. 請求端網卡生成CQE,放置到CQ中。
  8. 請求端APP取得任務完成信息。

總結

我們忽略各種細節進行抽象,RDMA WRITE和READ操作就是在利用網卡完成下面左圖的內存拷貝操作而已,隻不過復制的過程是由RDMA網卡通過網絡鏈路完成的;而本地內存拷貝則如下面右圖所示由CPU通過總線完成的:

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

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

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

參考資料

[1] part1-OFA_Training_Sept_2016.pdf

发表回复

相关推荐

摜蛋露出瞭“真面目”

它越來越像個階層遊戲瞭。“2023文藝復興”地如此徹底,沒人預想到,金融圈頂流竟落到瞭一款棋牌遊戲上。它的滲透如此之快,在...

· 28秒前

华硕主板如何开启XMP和DOCP?

目前华硕的ROG/ROG Strix/TUF Gaming等系列的主板,在BIOS简易模式下,都会有内存的自动超频设置,Intel平台显示为XMP,AMD ...

· 51秒前

反叛的魯魯修劇場版與TV版對比(2)皇道

字太多,放不下瞭,原鏈接皇道開頭這裡之前提過:ubi spiritus est cantus est----where there is spirit there is s

· 52秒前

中国名茶地图 | 福建名茶盘点

中国是茶树原产地。在这几千年的生产茶、饮用茶的历史过程中,成就了很多名扬四海的中国好茶之名。名茶,亦成为我国茶业史上 ...

· 2分钟前

氣體增壓閥常見故障匯總及解決方法

現在氣體增壓閥已經應用非常普遍瞭,而在使用氣體增壓閥的過程中,我們多少會遇到一些氣體增壓閥的故障問題,那麼如何解決遇...

· 2分钟前