一種基於InfiniBand網絡的跨平臺RDMA通信方法
2023-08-01 11:32:01 5
專利名稱:一種基於InfiniBand網絡的跨平臺RDMA通信方法
技術領域:
本發明涉及通信技術,具體來說,涉及在Linux作業系統和Windows作業系統之間通過高速的InfiniBand網絡來進行RDMA通信技術。
背景技術:
InfiniBand網絡是一種支持多並發連結的「轉換線纜」技術,該技術的主要特點是高帶寬(單條鏈路的SDR帶寬為2. 5Gbps, DDR為5(ibps,QDR為10(ibps,如果需要更大的帶寬,只需要增加鏈路數量即可,比如4x的QDR帶寬可以達到40(ibpS)、低時延(交換機延時140ns、應用程式延時3 μ S、新的網卡技術將使應用程式延時降低到1 μ s水平)、系統擴展性好(可輕鬆實現完全無擁塞的數萬端設備的hfiniBand網絡)。另外,InfiniBand 標準支持RDMA (Remote Direct Memory Access),使得在使用hf iniBand構築伺服器、存儲器網絡時比萬兆乙太網以及Fibre Channel具有更高的性能、效率和靈活性。目前,基於 InfiniBand的編程方式主要有如表1所示的三種:IB Verbs、SDP和IPoIB,其中IB Verbs 性能最好,但是開發難度最高,需要用戶很高的編程技巧;而IPoIB則完全兼容普通的TCP/ IP協議,不需要用戶關注InfiniBand帶來的不同,但是其性能也較差,並不能完全發揮 InfiniBand網絡的優勢;而SDP則介於兩者之間。表IInfiniBand網絡編程模式對照表
IB VerbsSDPIPoIB接口直接操作底層接口Socket接口,僅支持TCPSocket 接口涎遲最少很少少帶寬最高尚中等處鰣利用率最低BCopy方式高,ZCopy方式低最高旁顧乍系統是否否協職開銷輕量中等內存往冊用戶顯式操作由SDP負責用戶不需關注適雌需要用戶開發應用程式不需任何修改 Infiniband發展的初衷是把伺服器中的總線給網絡化,所以InfiniBand除了具有很強的網絡性能以外還直接繼承了總線的高帶寬和低時延。大家熟知的在總線技術中採用的DMA技術在InfiniBand中以RDMA的形式得到了繼承。這也使InfiniBand在與CPU、 內存及存儲設備的交流方面天然地優於萬兆乙太網以及Fibre Channel。可以想像在用 Infiniband構築的伺服器和存儲器網絡中任意一個伺服器上的CPU可以輕鬆地通過RDMA
去高速搬動其他伺服器中的內存或存儲器中的數據塊,而這是Fibre Channel和萬兆以太
3網所不可能做到的。傳統的TCP/IP技術在數據包處理過程中,要經過作業系統及其他軟體層,需要佔用大量的伺服器資源和內存總線帶寬。所產生嚴重的延遲來自系統龐大的開銷以及數據在系統內存、處理器緩存和網絡控制器緩存之間來回進行複製移動。而在RDMA中數據的處理不需要經過作業系統和其他軟體層,它使得網卡可以直接與應用內存相互傳輸數據,從而消除了在應用內存與內核內存之間複製數據的需要,整個傳輸過程如圖1所示。主機1中緩衝區1裡面的數據可以直接經網卡寫入主機2的緩衝區2中,整個過程不需要處理器和作業系統的參與。如何高效簡單地使用InfiniBand網絡帶來的性能上的優勢是一個巨大的挑戰, 採用IPoIB是最簡單的實現方式,但如果希望將InfiniBand網絡的性能發揮到極致,則需要採取IB Verbs的方法。該方法的弊端是需要用戶直接操作底層資源,帶來編程的不便, 這種不便在跨平臺交互過程中變得更加困難。
發明內容
本發明旨在提供一種封裝,可以使用戶通過簡單的方法在Windows和Linux系統之間通過InfiniBand網絡進行高速通信,這裡採用IB Verbs方法和RDMA技術實現。一種基於InfiniBand網絡的跨平臺RDMA通信方法,伺服器端初始化本地環境,成功後創建監聽線程等待客戶端連接,客戶端初始化本地環境,成功後通過socket與伺服器端建立連接,通過建立的socket連接交換RDMA通信環境;用等待發送的數據計算出一個中間值,並將此中間值序列化後與真正的數據合併到一起,通過RDMA寫入到客戶端的緩衝區中;傳輸完成後,伺服器端關閉監聽線程、釋放緩衝區、清理RDMA環境,客戶端釋放緩衝區和清理RDMA環境。優選的,所述伺服器端和客戶端連接建立後,關閉socket通路,數據傳輸通過 InfiniBand的RDMA機制進行。優選的,述客戶端可以在任意時刻查看緩存是否有數據到達,如果有數據則將數據頭解析並讀出真正的數據來處理。優選的,所述數據從RDMA緩衝區中被讀出後,此緩衝區被標識為可用狀態,伺服器端的數據可以寫入此緩衝區;如果客戶端的所有緩衝區均被寫滿,則伺服器發送失敗,系統向上層應用匯報此消息,等待處理。優選的,所述伺服器端使用Linux作業系統,客戶端使用Windows作業系統,且數據僅從伺服器端發往客戶端。優選的,所述緩衝區包括私有內存區,對用戶是不可見的,用於存儲本地管理、雙方協調的信息;幀緩衝區,留給用戶使用。優選的,所述緩衝區包括一個當前引用計數,當用戶申請此緩衝區時加1,向每個客戶端發送時分別加1,輪詢結束時分別減1 ;此計數初始化為0,且只有為0的時候,用戶才可以申請成功。優選的,所述交換RDMA通信環境的信息時,伺服器需要告訴客戶端的信息包括傳輸緩衝區的大小,私有緩衝區的大小,緩衝區個數,建立QP連接所需要的QP連接數,RDMA 通信所需要的內存地址;客戶端告訴伺服器的信息包括建立QP連接所需要的QP連接數, RDMA通信所需要的內存地址。優選的,所述伺服器端的錯誤包括三類內部嘗試修復的內部錯誤、直接反饋給用戶的外部錯誤和傳播至客戶端的遠程。優選的,所述伺服器端在每個幀前附加一個私有區,在伺服器和客戶端間一同傳輸,私有區中存放一個64位的整數序列號,伺服器端對每一幀數據以遞增1的方式編號,客戶端端檢測序列號不連續的錯誤,反饋給客戶端代碼。
圖1是RDMA的傳輸過程圖2是本發明的傳輸過程
具體實施例方式本發明將傳輸雙方分別稱為伺服器端和客戶端,伺服器端使用Linux作業系統, 客戶端使用Windows作業系統,且數據僅從伺服器端發往客戶端,系統的運行流程包括三個部分建立連接、傳輸數據和斷開連接。建立連接過程首先,伺服器端初始化本地環境,成功後創建監聽線程等待客戶端連接;其次,客戶端初始化本地環境,成功後通過socket與伺服器端建立連接;最後,通過建立的socket連接交換必須的RDMA通信環境,如緩衝區地址、數量等信息。這樣整個傳輸鏈路即創建完畢,用於前期建立連接的socket通路可以關閉,之後的數據傳輸通過 InfiniBand的RDMA機制進行。傳輸數據過程傳輸過程如圖2所示,首先用等待發送的數據計算出一個中間值, 並將此中間值序列化後與真正的數據合併到一起通過RDMA寫入到客戶端的緩存中,此過程不需要客戶端主動參與;客戶端可以在任意時刻查看是否有數據到達,如果有數據則將數據頭解析並讀出真正的數據來處理。一旦數據從RDMA緩衝區中被讀出,則此緩衝區被標識為可用狀態,伺服器端的數據可以寫入此緩衝區。如果客戶端的所有緩衝區均被寫滿,則伺服器發送失敗,系統向上層應用匯報此消息,等待處理。斷開連接過程此過程在伺服器端表現為關閉監聽線程、釋放緩衝區、清理RDMA 環境等;在客戶端主要是釋放緩衝區和清理RDMA環境。建立連接過程首先需要進行伺服器端的初始化操作,要指定的參數主要包括1)監聽線程的監聽埠(tcp_port);2) 一幀數據的大小(buf_size);3)幀緩衝區個數(buf_num);初始化過程不會失敗,系統不對所設置的參數作任何檢查,不合適的參數可能導致的錯誤由後續操作來處理。然後分配資源,這一步只分配幀緩衝池,InfiniBand資源的分配推遲到伺服器端與客戶端信息交換部分,避免socket通信錯誤時,InfiniBand分配和釋放成為多餘的操作。分配幀緩衝池,本質上是分配buf_num個大小為(buf_size+PAGE_SIZE)的緩衝區,其中 PAGE_SIZE是伺服器端作業系統虛擬內存頁面的大小。此緩衝區前面的PAGE_SUE部分作為私有內存區,對用戶是不可見的,主要用來存儲一些本地管理、雙方協調所需要的信息; 除去前面PAGE_SUE以外的部分則為幀緩衝區,留給用戶使用。本地管理信息包括一個當前引用計數,當用戶申請此緩衝區時加1,向每個客戶端發送時分別加1,poll_completion 時分別減1 ;此計數初始化為0,且只有為0的時候,用戶才可以申請成功。雙方協調信息,典型地,包括一個序列號,用來標誌當前緩衝區傳送的幀編號,方便檢測丟幀情況。此編號是由系統控制並解釋的,與用戶代碼中的協議無關。信息交換,伺服器需要告訴客戶端的信息包括1)傳輸緩衝區(私有+幀緩衝)的大小,私有緩衝區的大小,緩衝區個數2)建立QP連接所需要的qp_num,lid3) RDMA 通信所需要的 memory addr 禾口 rkey客戶端告訴伺服器的信息包括1)建立QP連接所需要的qp_num,lid2) RDMA 通信所需要的 memory addr 禾口 rkey說明1)MTU兩邊要一樣,這個可以前期協商,也可以程序中直接指定;2) memory addr和rkey在雙邊通信(SEND/RECV)中並不需要,但是為了兼容以後可能的修改,這些信息依然交換;傳輸數據過程1)獲取 buffer (get_next_buffer),要求不能失敗a)對所有 completion queue 執行 poll_completion,試圖釋放一些 buffer 資源。b)由mem pool的當前index獲得buffer,通過其私有區找到引用計數,並對引用計數執行原子操作cmp_and_SWap (0,1),即若為0則置為1c)若原來的值為0,表明可用,將mem pool的當前index增1 (可能要迴繞),然後返回幀緩衝區的地址;否則繼續如下操作d)此時沒有獲得預分配的緩衝區,則malloc —個緩衝區,同樣為PAGE_SUE+buf_ size大小,若失敗則重複malloc直至成功,並將私有區的index置為_1e)返回 buffer 首地址 +PAGE_SIZE2)用這個buffer去採集數據,並將處理後的數據放在buffer中原始數據之後3)發送buffer中數據到客戶端(send_data)a)序列號原子加1b)buffer_PAGE_SUE得到私有區地址,檢查其中的index值,若為_1則為臨時 malloc出來的緩衝區,執行如下額外操作i. get_next_buffer獲得註冊過的緩衝區ii.若獲取成功,則memcpy臨時buffer中的內容memcpy至註冊過的buffer裡, 釋放臨時bufferiii.若獲取不成功,則退出函數,返回錯誤碼c)持讀鎖(專用於保護鍊表的讀寫鎖)
d) list_for_each_entry得到RDMA通信上下文ctx,在此循環體中執行如下操作i.執行poll_completion (ctx),嘗試釋放一些可用的IB和mempool資源ii.讀取對方RDMA WRITE過來的recv_cnt,即到當前時刻對方已經遞交的recv 請求數目;若大於本地維護的sencLcnt,執行後續操作,否則continueiii.對私有區記錄的引用計數執行原子加1iv. post_send,1.若失敗則對私有區記錄的index原子減1,然後修改qp狀態到INIT- > RTR- > RTS,本ctx的失敗記錄加1,若超過某個特定值,在局部變量中記錄下這個ctx,並continue2.若成功則增加本地post_cnt計數v.此時post_send成功,到下一輪循環e)釋放讀鎖f)檢查之前是否記錄了失敗次數過多的ctx,若有,通常意味著客戶端或者連接本身出了問題,可以考慮刪除這個客戶端(持寫鎖)4)歸還buffer (put_buffer),本質上是引用計數減15)檢查停止條件,若需要退出,則取消其它傳輸線程和監聽線程;否則跳至1)6)退出poll_completion (ctx)操作1)對 ctx 中的 cq 執行 ibv_poll_cq 操作,只 poll —個2)如果返回值大於0,表明有completion,執行如下操作a)從wr_id得到mem pool中第wr_id個緩衝區,將私有區中的引用計數原子減1b)檢查wc的status,若不是SUCCESS則轉3),否則轉1)3)到此處有兩種可能一是pollcompletion的返回值 RTR- > RTS斷開連接伺服器端1)嘗試將所有數據發送完畢;2)關閉監聽線程,釋放相關資源;3)釋放分配的InfiniBand資源;4)釋放緩衝區;客戶端1)處理完畢所有緩衝區中已經接收的數據;2)釋放分配的InfiniBand資源;3)釋放緩衝區;出錯處理伺服器端要注意的一個問題是,InfiniBand或者其它資源使用出現error,絕大多數是在系統中嘗試修復或者簡單忽略(錯誤傳播至客戶端,如序列問題),不向用戶呈現。但是也有一些錯誤必須呈現給用戶,比如明顯的內存分配失敗,設備初始化失敗。這裡將錯誤分為三種內部、外部、遠程,分別指內部嘗試修復的,直接反饋給用戶的,以及傳播至客戶端的。實時性伺服器端始終只發送實時數據。任何發送操作都是非阻塞的,若失敗一般不作重新嘗試。為了檢測由此導致的丟幀現象,在每個幀前附加一個私有區,在伺服器和客戶端間一同傳輸,私有區中存放一個64位的整數序列號,伺服器端對每一幀數據以遞增1的方式編號,即使對所有客戶端發送失敗,也要維持序列號的遞增。客戶端端檢測序列號不連續的錯誤,反饋給客戶端代碼。
權利要求
1.一種基於InfiniBand網絡的跨平臺RDMA通信方法,其特徵在於伺服器端初始化本地環境,成功後創建監聽線程等待客戶端連接,客戶端初始化本地環境,成功後通過socket與伺服器端建立連接,通過建立的socket連接交換RDMA通信環境;用等待發送的數據計算出一個中間值,並將此中間值序列化後與真正的數據合併到一起,通過RDMA寫入到客戶端的緩衝區中;傳輸完成後,伺服器端關閉監聽線程、釋放緩衝區、清理RDMA環境,客戶端釋放緩衝區和清理RDMA環境。
2.如權利要求1所述的方法,其特徵在於所述伺服器端和客戶端連接建立後,關閉 socket通路,數據傳輸通過InfiniBand的RDMA機制進行。
3.如權利要求1所述的方法,其特徵在於所述客戶端可以在任意時刻查看緩存是否有數據到達,如果有數據則將數據頭解析並讀出真正的數據來處理。
4.如權利要求3所述的方法,其特徵在於所述數據從RDMA緩衝區中被讀出後,此緩衝區被標識為可用狀態,伺服器端的數據可以寫入此緩衝區;如果客戶端的所有緩衝區均被寫滿,則伺服器發送失敗,系統向上層應用匯報此消息,等待處理。
5.如權利要求1所述的方法,其特徵在於所述伺服器端使用Linux作業系統,客戶端使用Windows作業系統,且數據僅從伺服器端發往客戶端。
6.如權利要求1所述的方法,其特徵在於所述緩衝區包括私有內存區,對用戶是不可見的,用於存儲本地管理、雙方協調的信息;幀緩衝區,留給用戶使用。
7.如權利要求1所述的方法,其特徵在於所述緩衝區包括一個當前引用計數,當用戶申請此緩衝區時加1,向每個客戶端發送時分別加1,輪詢結束時分別減1 ;此計數初始化為 0,且只有為0的時候,用戶才可以申請成功。
8.如權利要求1所述的方法,其特徵在於所述交換RDMA通信環境的信息時,伺服器需要告訴客戶端的信息包括傳輸緩衝區的大小,私有緩衝區的大小,緩衝區個數,建立QP 連接所需要的QP連接數,RDMA通信所需要的內存地址;客戶端告訴伺服器的信息包括建立QP連接所需要的QP連接數,RDMA通信所需要的內存地址。
9.如權利要求1所述的方法,其特徵在於所述伺服器端的錯誤包括三類內部嘗試修復的內部錯誤、直接反饋給用戶的外部錯誤和傳播至客戶端的遠程。
10.如權利要求1所述的方法,其特徵在於所述伺服器端在每個幀前附加一個私有區,在伺服器和客戶端間一同傳輸,私有區中存放一個64位的整數序列號,伺服器端對每一幀數據以遞增1的方式編號,客戶端端檢測序列號不連續的錯誤,反饋給客戶端代碼。
全文摘要
本發明提供了一種基於InfiniBand網絡的跨平臺RDMA通信方法,伺服器端初始化本地環境,成功後創建監聽線程等待客戶端連接,客戶端初始化本地環境,成功後通過socket與伺服器端建立連接,通過建立的socket連接交換RDMA通信環境;用等待發送的數據計算出一個中間值,並將此中間值序列化後與真正的數據合併到一起,通過RDMA寫入到客戶端的緩衝區中;傳輸完成後,伺服器端關閉監聽線程、釋放緩衝區、清理RDMA環境,客戶端釋放緩衝區和清理RDMA環境。
文檔編號H04L29/06GK102404212SQ201110364569
公開日2012年4月4日 申請日期2011年11月17日 優先權日2011年11月17日
發明者劉新春, 袁清波, 許建衛, 邵宗有 申請人:曙光信息產業(北京)有限公司