基於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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM