在分布式應用中,用乙太網組網往往成為效能的瓶頸,所以需要低時延大頻寬,使用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技術在資料報...