rdma的基本元素(3.RDMA基本元素)
2023-04-16 09:15:18 2
本文轉自知乎Savir的專欄
RDMA技術中經常使用縮略語,很容易讓剛接觸的人一頭霧水,本篇的目的是講解RDMA中最基本的元素及其含義。
我將常見的縮略語對照表寫在前面,閱讀的時候如果忘記了可以翻到前面查閱。
Work Queue簡稱WQ,是RDMA技術中最重要的概念之一。WQ是一個儲存工作請求的隊列,為了講清楚WQ是什麼,我們先介紹這個隊列中的元素WQE(Work Queue Element,工作隊列元素)。
WQEWQE可以認為是一種「任務說明」,這個工作請求是軟體下發給硬體的,這份說明中包含了軟體所希望硬體去做的任務以及有關這個任務的詳細信息。比如,某一份任務是這樣的:「我想把位於地址0x12345678的長度為10位元組的數據發送給對面的節點」,硬體接到任務之後,就會通過DMA去內存中取數據,組裝數據包,然後發送。
WQE的含義應該比較明確了,那麼我們最開始提到的WQ是什麼呢?它就是用來存放「任務書」的「文件夾」,WQ裡面可以容納很多WQE。有數據結構基礎的讀者應該都了解,隊列是一種先進先出的數據結構,在計算機系統中非常常見,我們可以用下圖表示上文中描述的WQ和WQE的關係:
WQ這個隊列總是由軟體向其中增加WQE(入隊),硬體從中取出WQE,這就是軟體給硬體「下發任務」的過程。為什麼用隊列而不是棧?因為進行「存」和「取「操作的分別是軟體和硬體,並且需要保證用戶的請求按照順序被處理在RDMA技術中,所有的通信請求都要按照上圖這種方式告知硬體,這種方式常被稱為「Post」。
QPQueue Pair簡稱QP,就是「一對」WQ的意思。
SQ和RQ任何通信過程都要有收發兩端,QP就是一個發送工作隊列和一個接受工作隊列的組合,這兩個隊列分別稱為SQ(Send Queue)和RQ(Receive Queue)。我們再把上面的圖豐富一下,左邊是發送端,右邊是接收端:
WQ怎麼不見了?SQ和RQ都是WQ,WQ只是表示一種可以存儲WQE的單元,SQ和RQ才是實例。
SQ專門用來存放發送任務,RQ專門用來存放接收任務。在一次SEND-RECV流程中,發送端需要把表示一次發送任務的WQE放到SQ裡面。同樣的,接收端軟體需要給硬體下發一個表示接收任務的WQE,這樣硬體才知道收到數據之後放到內存中的哪個位置。上文我們提到的Post操作,對於SQ來說稱為Post Send,對於RQ來說稱為Post Receive。
需要注意的是,在RDMA技術中通信的基本單元是QP,而不是節點。如下圖所示,對於每個節點來說,每個進程都可以使用若干個QP,而每個本地QP可以「關聯」一個遠端的QP。我們用「節點A給節點B發送數據」並不足以完整的描述一次RDMA通信,而應該是類似於「節點A上的QP3給節點C上的QP4發送數據」。
每個節點的每個QP都有一個唯一的編號,稱為QPN(Query Pair Number),通過QPN可以唯一確定一個節點上的QP。
SRQShared Receive Queue簡稱SRQ,意為共享接收隊列。概念很好理解,就是一種幾個QP共享同一個RQ時,我們稱其為SRQ。以後我們會了解到,使用RQ的情況要遠遠小於使用SQ,而每個隊列都是要消耗內存資源的。當我們需要使用大量的QP時,可以通過SRQ來節省內存。如下圖所示,QP2~QP4一起使用同一個RQ:
Completion Queue簡稱CQ,意為完成隊列。跟WQ一樣,我們先介紹CQ這個隊列當中的元素——CQE(Completion Queue Element)。可以認為CQE跟WQE是相反的概念,如果WQE是軟體下發給硬體的「任務書」的話,那麼CQE就是硬體完成任務之後返回給軟體的「任務報告」。CQE中描述了某個任務是被正確無誤的執行,還是遇到了錯誤,如果遇到了錯誤,那麼錯誤的原因是什麼。
而CQ就是承載CQE的容器——一個先進先出的隊列。我們把表示WQ和WQE關係的圖倒過來畫,就得到了CQ和CQE的關係:
每個CQE都包含某個WQE的完成信息,他們的關係如下圖所示:
下面我們把CQ和WQ(QP)放在一起,看一下一次SEND-RECV操作中,軟硬體的互動(圖中序號順序不表示實際時序):
接收端APP以WQE的形式下發一次接收任務。
接收端硬體從RQ中拿到任務書,準備接收數據。發送端APP以WQE的形式下發一次SEND任務。發送端硬體從SQ中拿到任務書,從內存中拿到待發送數據,組裝數據包。發送端網卡將數據包通過物理鏈路發送給接收端網卡。接收端收到數據,進行校驗後回復ACK報文給發送端。接收端硬體將數據放到WQE中指定的位置,然後生成「任務報告」CQE,放置到CQ中。接收端APP取得任務完成信息。發送端網卡收到ACK後,生成CQE,放置到CQ中。接收端APP取得任務完成信息。至此,通過WQ和CQ這兩種媒介,兩端軟硬體共同完成了一次收發過程。
WR和WC說完了幾個Queue之後,其實還有兩個文章開頭提到的概念沒有解釋,那就是WR和WC(不是Water Closet的縮寫)。
WR全稱為Work Request,意為工作請求;WC全稱Work Completion,意為工作完成。這兩者其實是WQE和CQE在用戶層的「映射」。因為APP是通過調用協議棧接口來完成RDMA通信的,WQE和CQE本身並不對用戶可見,是驅動中的概念。用戶真正通過API下發的是WR,收到的是WC。
WR/WC和WQE/CQE是相同的概念在不同層次的實體,他們都是「任務書」和「任務報告」。於是我們把前文的兩個圖又加了點內容:
好了,我們用IB協議[1]3.2.1中的Figure 11這張圖總結一下本篇文章的內容:
用戶態的WR,由驅動轉化成了WQE填寫到了WQ中,WQ可以是負責發送的SQ,也可以是負責接收的RQ。硬體會從各個WQ中取出WQE,並根據WQE中的要求完成發送或者接收任務。任務完成後,會給這個任務生成一個CQE填寫到CQ中。驅動會從CQ中取出CQE,並轉換成WC返回給用戶。
基礎概念就介紹到這裡,下一篇將介紹RDMA的幾種常見操作類型。
,