◆金 浩 梅君君
一種RDMA傳輸控制方法研究
◆金 浩 梅君君
(南京中興新軟件有限責任公司 江蘇 210012)
面對高性能計算、分布式存儲等應用的快速發展,新興的RDMA技術解決了傳統網絡架構的性能瓶頸,但RDMA傳輸過程中需要不斷交互實現內存狀態同步,本文提出一種滑動窗口傳輸控制方法,有效減少收發雙方交互次數,降低RDMA單邊操作的成本。
RDMA;內存池;滑動窗口
RDMA(Remote-Direct Memory Access)遠程內存直接訪問是Mellanox、Intel等公司推出的高速網絡技術,與傳統網絡技術相比,RDMA能夠繞過操作系統協議棧、減少內存拷貝次數、避免系統態內核態切換開銷,從而提供更高帶寬、更低時延、占用更少的系統資源。
RDMA是一種直接訪問遠端計算機存儲區的網絡傳輸技術,將數據從本地系統快速拷貝到遠程系統存儲器中,傳輸過程中只占用單邊CPU資源,同時繞過操作系統內核協議棧,能夠顯著提高數據傳輸性能。RDMA技術已經應用到各類業務場景,尤其是對帶寬、時延要求非常高的分布式存儲系統,采用RDMA網絡傳輸大量文件數據,繞過傳統網絡的性能瓶頸,充分發揮出NVMe SSD、PM等新型硬件的性能。
單邊操作是實現RDMA協議性能優勢的關鍵,單邊操作需要兩個條件:首先得到目標地址,其次確認目標內存狀態可用。RDMA遠程讀內存前提是遠端內存更新完成,RDMA遠程寫內存前提是目標內存可覆蓋。
單邊操作必須增加內存狀態同步的開銷,每次重新注冊內存的方式成本太高,目前RDMA數據傳輸多采用復用內存池的方法,以遠程寫操作為例,執行流程如下:
(1)客戶端,根據IP地址與服務端鏈接,服務端通過多段內存組成內存池。
(2)客戶端,根據業務需求向服務端發起內存分配請求。
(3)服務端,從內存池中分配一個內存塊,應答消息包含地址、主鍵信息。
(4)客戶端,執行write-with-imm指令,向服務端內存寫入數據。
(5)服務端,根據業務需要處理內存中數據,內存恢復可用狀態。
(6)客戶端重新執行步驟2。
客戶端每次寫數據前,必須向服務端口申請空閑內存,理論上只需要單邊CPU參與的WRITE指令降級為兩邊CPU都參與的多次交互,這與RDMA協議初衷相悖。
單邊讀寫實現的直接訪問遠端內存能力是RDMA協議的核心,可以看作將主機內存總線延伸到網絡節點,現有的RDMA數據傳輸過程需要頻繁交換內存狀態,才能避免內存覆蓋或讀取非法數據。
針對該問題,本文設計了一種基于滑動窗口的傳輸確認機制。客戶端節點初始化滑動窗口,窗囗大小為內存塊數量M,滑動窗口有足夠的空閑空間時,客戶端向服務端寫入x單位內存數據,則滑動窗囗縮減x單位,客戶端收到確認報文y后,滑動窗口擴展y單位。客戶端與服務端節點通過長度為M的滑動窗囗控制數據發送流程,只要發送窗囗可用,客戶端可以立即向遠端寫數據,不需要頻繁地從服務端口申請內存。RDMA傳輸過程出現丟包時,需要從頭重傳報文,開銷巨大,本方案中客戶端每次寫入長度較小,丟包重傳的成本固定可預測,服務端的應答報文支持批量確認,大大減少ACK的數量。
基于滑動窗口的動態控制方法解決了現行RDMA傳輸過程需要多次同步內存狀態的弊端,提高單邊操作傳輸效率,增加RDMA網絡的易用性。以RDMA遠程寫操作為例,詳細步驟如下,遠程讀操作的實現流程類似。
客戶端向服務端,建RC(Reliable Connection)鏈接,只有RC鏈接支持全部RDMA操作指令,成功后立即發起recv指令。
服務端,根據業務需要,分配支持遠程寫入的內存池,由M個長度為m字節的內存塊組成,服務端向客戶端發送(send指令)內存池信息,具體結構如下表1。

表1 內存池的信息接口
客戶端收到內存池的信息后,創建發送窗口,定義循環鏈表分別保存內存塊ID[1,M],至此,收發雙方完成滑動窗口初始化,滑動窗口可用空間為M。
某個時刻客戶端待發送數據為L字節,滑動窗口空閑空間為r,則實際發送內存塊數為:
x = min(ceil(L/m),r)
循環執行write-with-imm指令向遠端寫x塊內存,每個指令立即數為ID值,寫指令成功則發送窗囗尾部前移1,寫完x內存塊發送窗囗尾部前移x。
服務端接收到數據后,立即發給f,則內存f已經寫入新數據,業務邏輯處理[f]內存數據,若內存塊f數據用完,內存空間可用,則根據當前鏈路的控制策略發送確認報文。控制策略為NoDelay算法,會立即發送值為f的Ack報文,若為Nagle策略,則會等待下面發送條件滿足:
TimeWait〉= MAT || SegAvail > = MAS
TimeWait為當前內存塊空閑等待時間,MAT(Max Available Time)為內存塊空閑時間閾值,SegAvail為節點當前空閑內存塊總數,MAS(Max Available Segments)為空閑內存塊數量閾值。
空閑內存塊數量為y,則向客戶端發送ack報文y。
客戶端收到y確認報文后,滑動窗囗頭部前移y,發送緩沖區可用空間增加y,后續客戶端重復前面步驟發送業務數據,整個緩沖區基于循環隊列循環復用滑動窗口內存。
滑動窗囗可用為0時,客戶端暫停發送數據,多次出現滑動窗囗耗盡時,雙方應該協商增加滑動窗口的范圍。
本方法借鑒TCP協議中的滑動窗口機制,實現RDMA單邊操作內存可用狀態的確認機制;同時將Nagle算法應用到內存確認過程,大大減少ACK確認數量,減少雙方交互次數;另外,客戶端采用循環隊列實現滑動窗口,邏輯簡單高效,且支持窗口大小擴展。
為驗證本方法可行性,本文對RDMA的遠程write操作的做相關測試,測試環境:
網卡類型:Mellanox Technologies MT27520-Family [ConnectX-3 Pro]
交換機:mellanos-switch SX6012/U1 40Gbps QDR
服務器:Centos7 Intel Xeon Silver 4114 CPU@2.20G 128GB內存
通過配置文件為服務端指定由16個內存塊組成的內存池,每個內存塊大小為1MB,應用層循環向遠端寫入1GB數據,經過測試驗證,采用本方法后,整個數據傳輸時延降低13%。
RDMA在很多業務產品都已商用,如阿里的PolarFS、華為的FusionStore等,針對RDMA傳輸應用過程存在的弊端,本文提出一種基于滑動窗口的傳輸控制方法,通過降低內存狀態同步成本,提高RDMA鏈接傳輸效率。
[1]吳昊,陳康.基于RDMA和NVM的大數據系統一致性協議研究[J].大數據,2019(04):89-99.
[2]李龍飛,史陽春,王劍峰.面向千兆以太網的動態RDMA通信方法[J].電子科技大學學報,2018(05):672-679.
[3]陳游旻,陸游游.基于RDMA的分布式存儲系統研究綜述[J].計算機發展與應用,2019(02):227-239.
深圳市科技創新委員會科技應用示范項目資金資助項目(No.SF20170036);國家重點研發計劃項目(2018YFB1003302);江蘇省工業和信息產業轉型升級專項資金項目;南京市工業和信息化發展專項資金項目基金項目