基於SoftRoCE 瞭解RDMA

RDMA是基於IB技術的內存直接傳送,無需內核參與,硬件網卡搞定。IB須要HPC領域的專用硬件,ROCE則是RDMA協議在普通以太網卡的實現,RoCEv1是在MAC上的二層封裝,局域網內能夠,要經過路由器則須要RoCEv2, 基於UDP的版本。 

那麼RDMA爲何快呢?普通網卡要接收完整報文,支持RoCE網卡直接讀寫內存,不用去內核繞圈子。就像咱們有1G內存要複製到對方,這是個大快遞,通常咱們用socket編程要經過kernel這個郵局,有不少限制,好比它有報文大小限制,你要本身拆分屢次發送,郵局是國企,內部流程也比較複雜,發個快遞又費勁又慢,並且他們還消耗不少資源. RoCE就是民營快遞,不用等你去郵局,告訴他你的內存在哪,要送到對方哪一個地址,再大的內存他們都老鼠搬家同樣在後臺默默搞定,你的CPU就能夠乾點別的。一樣,讀遠程內存也是。還能夠選擇要不要回執簽收。 

和DPDK不大同樣的是DPDK只是跳過了郵局,本身封裝報文給網卡,而RoCE則打包的事情都不須要管,比快遞公司還勤快。因此RDMA能夠看作網卡上封裝的消息機制,層次高一些。說了這麼多好處,你們是否是火燒眉毛要體驗一下呢?支持RoCE的網卡在淘寶上也要幾百塊仍是拆機的,貌似仍是10G的,還好有SoftRoCE,基於普通網卡用軟件實現了硬件要作的事情,在虛擬機上就能體驗一下到底有多神奇,重在體驗,實測效率不高。。。。其實這技術出來好多年了,只是一直。。。 

SoftRoCE安裝步驟參見 https://github.com/SoftRoCE/rxe-dev/wiki/rxe-dev:-Home 其餘readme什麼的都不夠新。 

rxe-dev其實就是完整的內核,在裏面增長了rxe驅動和一個頭文件,master下面的代碼不要用,不夠新。用v18分支,編譯出來的內核是4.7版本。注意這個克隆+編譯過程都很慢。。。 
在centos7下面須要安裝bc, ncurses-devel, openssl-devel. 編譯安裝完後grub下面會多出4.7的內核啓動菜單,進入後用rxe-cfg start, 而後rxe-cfg add <eth>, 能夠運行的測試命令主要在ib-utils和rdma-utils裏面, rping, rdma_server/client, qperf, ibv_rc_pingpong均可以玩玩看。 

RDMA主要有recv/send, 這個機制是倆邊要握手的,這邊send,那邊要有人recv。IB的verb,也就是這些send/recv是順序執行的,若是那邊沒人收,你後面就廢了。。 同理,你要收的時候,對方要有人發,不然你就掛在那傻等。。 recv這個命令必須等,send命令可選不用等,也就是un-signaled,相似寄信沒回執,可是有個特例,就是你send一堆不用等的消息,覺得扔bomb同樣沒事了,網卡沒發,爲何呢?由於須要有個signaled來觸發批量發送(看到有人提到這個問題, 沒驗證),這個設計比較傻,雖然提升了效率。。。 根據我編程測試un-signaled很容易,init_attr.sq_sig_all = 0,send_attr裏面不要帶IBV_SEND_SIGNALED。這個signaled就一直失敗... 

再說說read/write, 這兩個是不須要對方參與的直接存取遠端內存。首先這兩個send flags裏面必須IBV_SEND_SIGNALED,不帶server那邊就不響應。測試1M內存大概0.5S讀寫個來回。 建議你們對每一個rdma_xxx命令都打印出跟上個命令之間的耗時,這樣很容易知道哪邊沒響應,或者響應慢。同時再抓包看看每一個方向的udp大概對不對。read/write貌似比較傻,不能對遠端同一地址r/w, 只能是兩個不一樣地址。並且不能對地址加上偏移部分存取。。。不知道個人測試是否是哪裏不對。。。 r/w還必須知道遠程內存的address和key, 用前面的send/recv要回來,而後就能夠r/w. 

這裏有個小小疑問send/recv機制貌似是主從方式的,好比只有客戶端向服務端發送請求,服務端一直在recv, 客戶端有請求就send. 若是雙方是對等的,是否是隻能再開一個通道來傳遞消息呢?這個rdma_get_recv_comp()但是阻塞方式的,那不是要兩個線程? 

rdma_accept以前必須有個rdma_recv, 這個邏輯不科學,通常創建鏈接再去收發。。沒有的話服務器也能工做,只不過第一個請求會被delay 0.5Sec. 

基本代碼參照rdma_server.c 和rdma_client.c。 
推薦兩個文檔,不能google的Yahoo也能找到: 
   RDMA Read and Write with IB Verbs 
   Introduction to RDMA Programming 
   
理論上RDMA封裝層次高一些,並且硬件加送,節省CPU, 延時小。可是編程模型上跟之前不一樣,還要跟各類詭異的現象作鬥爭。。 從性能看,若是有網卡成本不高,幾乎之前全部的socket通訊均可以porting到這種高效率的傳輸方式上。 

RDMA還支持組播,不穩定傳輸方式(音頻,視頻)。。。 

從管理上看,ROCE用在VM上要有對應的監管方式,調試上也會比較挑戰,好比怎麼去抓包。 

Anyway若是你的系統須要提升網絡傳輸效率,解放CPU, 應該看看ROCE。git

相關文章
相關標籤/搜索