rdma程式設計

2021-07-23 22:59:14 字數 1615 閱讀 5622

在分布式應用中,用乙太網組網往往成為效能的瓶頸,所以需要低時延大頻寬,使用rdma傳輸協議,能滿足低時延要求。目前有兩張硬體可以使用rdma傳輸,乙個是infiniband,乙個是rdma over ethernet,由於ib的成本較高,所以roce成為一種趨勢。

roce可以在乙太網上執行rdma協議,時延比普通乙太網可以提公升30%以上,也可以支援雙協議棧,同時用tcp和rdma,程式設計過程類似ib。

有兩張建鏈方式,一種是通過rdma_cm建鏈,一種是先通過tcp建鏈,通過tcp通道交換雙方的裝置資訊,qp資訊,簡歷rdma鏈路,然後關閉tcp鏈路,第二種更常用。

rdma程式設計流程

1)初始化rdma裝置

ibv_get_device_list()獲取使用可以使用rdma

傳輸的裝置個數,可以根據ibv_get_device_list結構中的dev_name找到需要使用的裝置;

struct ibv_device **ibv_get_device_list(int *num_devices);

ibv_open_device()開啟裝置,獲取裝置控制代碼;

ibv_query_device()查詢裝置,獲取裝置屬性

ibv_query_port()查詢裝置埠屬性

如果型別為ethernet

,bv_query_gid()獲取裝置gid

,用於交換雙方資訊使用

2)建立qp資訊

ibv_alloc_pd()用於建立qp

介面的引數

ibv_create_cq()建立cq

,乙個cq

可以完成的

cqe的個數,

cqe與佇列個數有關,佇列多,

cqe個數就設定多,否則設定少,乙個

cq可以對應乙個

qp,也可以兩個

cq對應乙個

qp。乙個

cq包含傳送和接收佇列。

ibv_create_qp()建立qp

。類似tcp

的socket

3)註冊mr資訊

ibv_reg_mr()註冊網絡卡記憶體資訊,把作業系統物理記憶體註冊到網絡卡

4)交換qp資訊

ibv_modify_qp()交換雙方qp

資訊,修改

qp資訊狀態級

client端:先建立

qp,修改狀態級

reset

到init

,修改init

到rtr

,然後傳送到

server

端,server

端建立qp

,修改狀態機有

init

到rtr

,然後傳送到客戶端,客戶端修改狀態機有

rtr到

rts,傳送到

server

端,server

端修改狀態機有

rtr到

rts,這樣

rmda

鏈路簡建立成功。

5)傳送和接收

ibv_post_recv()接收訊息介面

ibv_post_send()傳送訊息介面

ibv_poll_cq()用於查詢

cq佇列是否有事件產生,如果有呼叫

recv

介面接收。

RDMA程式設計的基本流程

通常情況下,乙個rdma通訊程式的編寫由以下幾個步驟組成 1 得到裝置清單,清單上的每乙個裝置都要有乙個名字和乙個全球唯一識別符號 globally unique identifier,簡稱guid 具體參見2.3.2中devices functions 2 根據名字或者guid開啟指定裝置,返回i...

RDMA學習筆記

三種實現為 infiniband,roce,iwrp infiniband是一種專為rdma設計的網路,從硬體級別保證可靠傳輸 而roce 和 iwarp都是基於乙太網的rdma技術 roce協議存在rocev1和rocev2兩個版本,主要區別rocev1是基於乙太網鏈路層實現的rdma協議 交換機...

RDMA原理剖析

dma 直接記憶體訪問 direct memory access dma模式可以同dma engine之間通過硬體將資料從buffer 1移動到buffer 2,允許計算機主機板上的裝置直接把資料傳送到記憶體中去,而不需要cpu參與操作,大大降低了cpu copy的開銷。傳統tcp ip技術在資料報...