RDMA在數據中心的可靠傳輸

背景

高帶寬、低延遲是目前數據中心應用的基本需求。NVM(Non-Volatile Memory)和 RDMA(Remote Direct Memory Access)可以稱得上加速數據中心應用的兩架馬車,分別從存儲和網絡方面滿足高帶寬、低延遲的需求。

TCP/IP 只適用於中等帶寬需求且延遲不敏感的應用,不同層級間的數據拷貝和協議棧本身複雜性(現代網卡已經支持部分功能卸載,例如 TSO、CSO、LRO 等,但並不徹底)爲 TCP/IP 應用引入了大量延遲。RDMA 通過 Memory Region 機制使得網卡能夠直接讀寫用戶態的內存數據,避免了數據拷貝和上下文切換;並將網絡協議棧從軟件實現 offload 到網卡硬件實現,極大降低了 CPU 開銷。隨着 RoCEv2(RDMA over Converged Ethernet v2)技術的成熟,RDMA 可以部署在數據中心已有的網絡設施上,RDMA 成爲數據中心高速網絡通信的主流方案。

在大規模數據中心中部署 RoCEv2,首先面臨的問題是如何保證 RDMA 的可靠傳輸。

可靠傳輸

可靠傳輸是傳輸層對上層應用的承諾,上層幾乎不需要擔心丟包或者重傳的問題(只需要配置重試次數和超時時間)。可靠傳輸的核心是如何應對網絡丟包。

爲什麼會發生丟包?

當發送方發包速率超過了接收方的處理能力時,數據包開始在接收方的接收隊列中積壓,如果積壓情況持續沒有緩解直到接收隊列滿載,接收方只能選擇將之後接收到的數據包丟棄。這裏的接收方可能是數據包的最終接收者或者中間經過的交換機、路由器。

爲什麼需要可靠傳輸?

可靠傳輸是數據中心應用穩定低延遲的保證。一旦發生丟包,傳輸層通常會懲罰性地乘性減慢(Multiplicative-decrease)發送速率,並重傳丟棄的數據包,用戶會感受到突發的性能降級。

以下原因導致了丟包在數據中心網絡中很容易發生:

● 普通交換機的淺緩衝區特性。由於成本原因,數據中心交換機的緩衝區一般都不大(幾 MB 到數十 MB)。這些緩衝區被所有端口共享 [8],以便實現統計意義的多路複用。

● 許多分佈式應用都遵循 Partition/Aggregate 這種通信模式 [4]。一個請求可能分散到多個工作節點進行處理,每個節點處理數據集的一部分。處理完畢後,所有的工作節點幾乎同時地把結果匯聚到同一個節點做數據整合。這是典型多打一的場景(又稱爲 Incast),匯聚節點所在的端口很容易出現積壓。

● 多路徑負載不均衡。當網絡拓撲中存在多條可達路徑時,RoCEv2 通過 ECMP(Equal-cost multi-path) 爲每個 Flow 選擇合適的路由。ECMP 沒有感知擁塞情況的能力,Flow 可能被分配到擁塞程度已經十分嚴重的路徑,引起擁塞加劇和丟包。

丟包對 RDMA 造成大幅性能下降,這是由 RDMA 的重傳機制決定的。

RDMA 的重傳機制實現在網卡內部,功能比較簡單。如下圖,RDMA 接收方網卡對於每個成功接收到的數據包,都會回覆一個 ACK 包。如下圖中,PSN(Packet Sequence Number)爲 2 的數據包在發送的過程中被丟棄,接收方接收到 PSN 爲 3 的數據包時發現 PSN 不連續,會回覆一個 PSN 2 的 NACK(Not ACK)給發送方,丟棄後續接收到的數據包(PSN 3 ~ 5)。發送方需要重發 PSN 2 之後的所有數據包,導致大幅性能下降。一般我們稱這種方式爲 Go-back-N 重傳方式,即重傳丟棄的數據包 N 之後的所有數據包(Mellanox CX-6 系列網卡已經支持選擇性重傳,但存在一些限制[16])。而 TCP 的重傳則只需要重傳丟失的單個數據包,丟包帶來的性能負面影響比 RDMA 小得多。

因此 RDMA 要求 L2 層或者 L3 層網絡是無損的。利用流量控制可以防止收發雙方速率不匹配導致的丟包問題。

流量控制和它帶來的問題

流控的原理是,接收方在預測到將要丟包之前通知發送方停止發包。下面介紹幾種流控算法的演變。

Global Pause

Global Pause 是 1997 年在 IEEE 802.3x 定義的第一種以太網流控機制,工作在 L2 層。

其工作原理是,接收方發現接收隊列深度超過某個閾值時,向發送方發送 XOFF Pause Frame,發送方接收到後就停止一切發送操作,直到收到接收方發來的 XON 控制消息或者超時。

Global Pause 無法對流量進行區分,對於上層應用一些高優先級的流量也會被暫停。

PFC(Priority Flow Control)

爲了解決 Global Pause 不區分流量類型的問題,IEEE 802.1Qbb 定義的 PFC 提出了對網絡流量按照優先級 0 - 7 分類。

如上圖,對於每個通信實體,有邏輯上的 Egress 端口和 Ingress 端口,分別對應出口和入口流量。每個端口都有 8 個隊列,對應優先級 0 - 7,不同優先級的數據包會緩存在不同隊列中。

在通信過程中,接收方發現 p1 隊列深度超過 XOFF 閾值,意味着數據包積壓,接收方發送一個 p1 優先級的 PFC Pause Frame 給發送方。Pause Frame 會包含了每個優先級需要暫停發送的時間。發送方將暫停 p1 優先級數據包的發送,直到收到對方發過來恢復控制幀。

按照優先級字段在數據包中的存放位置,可以將 PFC 分成兩類。

(1)基於 PCP 的 PFC

在 IEEE 802.1Qbb 最初的規定,類別 CoS (Class of Service)保存在 L2 層 VLAN Tag 的 PCP(Priority Code Point,3 bits)字段上。

(2)基於 DSCP 的 PFC

然而,VLAN 在某些生產環境可能帶來不便,例如有的生產環境需要使用 PXE 方式安裝部署系統,而 PXE 啓動時候是沒有 VLAN 配置的。RoCEv2 包含了 IP 頭部,因此可以考慮將優先級保存在 IP 頭部的 DSCP 字段。Microsoft 於 2016 年提出了基於 DSCP 的 PFC [1]。 目前大部分廠商的交換機和 RoCE 網卡都已經支持基於 DSCP 的 PFC。

PFC 的問題

在實際部署中 PFC 性能不佳,會導致不公平問題和 Head-of-Line 堵塞問題。

(1)不公平問題

如上圖 a),交換機上兩個流入端口有數據流向同一個流出端口:Ingress 1 攜帶 Flow 1,Ingress 2 攜帶 Flow 2 和 3。

圖 b) 觸發了 PFC Pause,Ingress 1 和 2 同時暫停發送。

圖 c) Egress 1 隊列空閒,通知 Ingress 1 和 2 恢復發送。

圖 d) 由於 Ingress 1 和 2 是同時暫停和恢復的,Flow 2 和 3 需要競爭 Ingress 2,導致 Flow 1 始終能夠獲得比 Flow 2 或 3 更高的帶寬,出現了不同 Flow 帶寬分配不公平。

(2)Head-of-Line 堵塞問題

如上圖 a),Flow 1 和 Flow 2 從同一個 Ingress 1 流向不同的 Egress 1 和 2。

圖 b),Egress 1 觸發了 PFC Pause,Ingress 1 暫停發送。Flow 2 並不需要經過 Egress 1,卻受其影響也被暫停了。

如何解決 PFC 問題

PFC 問題本質的原因是,Pause 機制運行在「端口 + 優先級」這個級別,不能細化到每一個 Flow,而粗暴地將整個發送端口停下來了。如果能夠動態地調整每個 Flow 的發送速率,保持端口的隊列深度比較穩定,那麼就不會觸發 PFC Pause 了。因此,基於 Flow 的擁塞控制算法出現了。

擁塞控制

擁塞控制與 PFC 有兩個明顯區別:

● 擁塞控制根據擁塞程度動態調節發送速率,而 PFC 會讓發送端口完全停下;

● 擁塞控制一般會由接收方將擁塞情況通知到真正的發送方,而 PFC 只會通知前一跳。

後者意味着擁塞控制能夠實現在 Flow 級別:當接收方發現擁塞發生,將會在擁塞通知消息中攜帶 Flow 標識,通知到發送方。發送方可以據此調節該 Flow 的發送速率。在 RoCE 的語境中,Flow 可以通過一對 RDMA QP(Queue Pairs)來標識。

擁塞控制是一個自適應調節過程,依賴於一個好的擁塞檢測方法。

擁塞檢測

檢測擁塞的方式大致可以歸爲三類:基於丟包檢測、基於 ECN 的檢測和基於 RTT 的檢測。

(1)基於丟包檢測

基於丟包檢測的原理很顯然,丟包是擁塞持續得不到緩解的最終結果。TCP 經典的 Tahoe 算法和 CUBIC 算法 [19],都是基於丟包來做檢測的。上文提到,丟包對於 RDMA 的性能影響要比 TCP 大得多,如果等到已經丟包再進行控制成本就太高了,因此 RDMA 不能採用這種方式。

(2)基於 ECN 檢測

ECN(Explicit Congestion Notification)是 IP 頭部 Differentiated Services 字段的後兩位,用於指示是否發生了擁塞。它的四種取值的含義如下:

Binary Keyword 含義
00 Non ECN-Capable Transport 表示發送方不支持 ECN
01 ECN Capable Transport 表示發送方支持 ECN
10 ECN Capable Transport 同上
11 Congestion Encountered 表示發生了擁塞

部署 ECN 功能一般需要交換機同時開啓 RED。如果通信雙方都支持 ECN(ECN 爲 01 或者 10),當擁塞出現時,交換機會更新報文的 ECN 爲 11(Congestion Encountered),再轉發給下一跳。接收方可以根據 ECN 標誌向發送方彙報擁塞情況,調節發送速率。

RED,即 Random Early Drop,是交換機處理擁塞的一種手段。交換機監控當前的隊列深度,當隊列接近滿了,會開始隨機地丟掉一些包。丟棄包的概率與當前隊列深度正相關。隨機丟棄帶來的好處是,對於不同的流顯得更公平,發送的包越多,那麼被丟棄的概率也越大。

當 RED 和 ECN 同時開啓,擁塞發生時交換機不再隨機丟包,而是隨機爲報文設置 ECN。

(3)基於 RTT 檢測

RTT(Round-Trip Time)是發送方將數據包發送出去,到接收到對端的確認包之間的時間間隔。RTT 能夠反映端到端的網絡延遲,如果發生擁塞,數據包會在接收隊列中排隊等待,RTT 也會相應較高。而 ECN 只能夠反映超過隊列閾值的包數量,無法精確量化延遲。

RTT 可以選擇在軟件層或者硬件層做統計。一般網卡接收到數據包後,通過中斷通知上層,由操作系統調度中斷處理收包事件。中斷和調度都將引入一些誤差。因此,更精確地統計最好由硬件完成,當網卡接收到包時,網卡立即回覆一個 ACK 包,發送方可以根據它的到達時間計算 RTT。

需要注意的是,ACK 回覆包如果受到其他流量影響遇到擁塞,那麼 RTT 計算會有偏差。可以爲 ACK 回覆包設置更高優先級。或者保證收發兩端網卡的時鐘基本上同步,然後在回覆包加上時間戳信息。另外,網絡路徑的切換也會帶來一些延遲的變化。

下面介紹 RDMA 下分別基於 ECN 和 RTT 檢測的兩種主流控制算法。

控制算法

(1)DCQCN(ECN 檢測)

DCQCN(Data Center Quantized Congestion Notification)是 2015 年由 Microsoft 和 Mellanox 提出的 RoCEv2 的擁塞控制算法 [2]。其設計基於 QCN(Quantized Congestion Notification)[3] 和 DCTCP(Data Center TCP)[4]。

QCN 是 802.1Qau 定義的 L2 層擁塞控制算法,通過統計單位時間窗口 ECN 標記報文的數量來量化擁塞程度。發送方可以根據量化擁塞程度動態調節發送速率。QCN 通過 MAC 地址來識別一個 Flow,Flow 的接收端將擁塞信息反饋給發送端。如果網絡流量跨路由,報文的 MAC 地址將發生變化,接收端無法知道真正的發送端 MAC 地址,擁塞信息也就無法抵達發送端了,因此 QCN 不適用於跨路由的網絡。

DCTCP 由網絡界大佬 Mohammad Alizadeh 提出,主要改善數據中心小流量被大流量搶佔的問題。接收方對於每個打上 ECN 標記的包,都會回覆一個 ECN-ECHO 的 ACK,發送方可以根據它來量化擁塞程度,按比例調節擁塞窗口。與普通 TCP 不同的是,TCP 遇到擁塞直接將擁塞窗口(更準確的是擁塞門限值)減小一半。

DCQCN 把 QCN 拓展到 IP 網絡,以便用於 RoCEv2,主要功能實現在 RDMA 網卡中,中間交換機只需要支持 RED/ECN。

DCQCN 可以劃分爲三個部分:

擁塞點算法

中間交換機檢查當前擁塞情況,當隊列深度超過閾值時,通過 RED/ECN 標記報文,然後轉發給下一跳。

通知點算法

由接收方網卡完成,主要是把擁塞信息通知到發送方。RoCEv2 新增了 CNP(Congestion Notification Packets)控制報文用於擁塞通知。接收方網卡檢查每個接收包的 ECN 標誌,如果 CN 被設置,那麼發送 CNP 給發送方。爲了減少性能開銷,每 50 us 只發送一個 CNP(DCTCP 是每個包都回復一個)。

響應點算法

由發送方網卡完成,負責調節發送速率避免擁塞。在每個週期窗口,發送方網卡更新擁塞程度參數(取值爲 0 ~ 1),更新的依據是:

● 如果收到擁塞通知,增加擁塞參數

● 否則,逐漸減少擁塞參數

然後根據擁塞程度參數調節發送速率(Rt 爲目標速率,Rc 爲當前速率),

● 如果收到擁塞通知,降低速率(最多降低到原來的一半):

● 否則(與 QCN 一樣)
○ 快速恢復(持續沒收到擁塞通知的前五個週期,每個週期爲每發出 150 KB 報文或者 10 ms),向上一次遇到擁塞的速率 Rt 靠近:

○ 主動恢復(快速恢復後,每個週期爲 50 個報文或者 5 ms),探測可用帶寬(可能超過 Rt):

其中擁塞點算法依賴於交換機的已有的 RED/ECN 功能。而通知點和響應點算法需要在 RDMA 網卡實現,包括收發 CNP 報文、發送端需要增加對於每個 Flow 的計時器和字節計數器。目前 Mellanox 的網卡已經支持 DCQCN。

(2)Timely(RTT 檢測)

Timely 與 DCQCN 同年出現 SIGCOMM 會議上,由 Google 提出,旨在提供一種通用的擁塞控制方法,而不僅限於 RoCE [5]。它是數據中心網絡第一個基於延遲的擁塞控制算法。

Timely 算法主要包括三個部分,它們都運行在發送方。算法不涉及中間交換機的處理,但要求接收方網卡對於每一個接收包回覆一個 ACK。

RTT 統計模塊

Timely 中將 RTT 定義爲數據包在網絡中傳播時間與在隊列中等待時間之和。下面的公式中,發送的時間戳由發送方軟件層記錄;完成的時間戳爲發送方接收到接收方網卡返回的 ACK 時間戳。由於一個大包可能被拆分成多個,同時數據包從網卡發送出去有傳輸時延,因此還需要減去這部分時間。

速率計算模塊

對於每一個發包結束事件,速率計算模塊從 RTT 統計模塊得到該包的 RTT,然後輸出一個期望的發送速率。

Timely 並沒有根據 RTT 的絕對值來衡量擁塞情況,而是通過 RTT 的梯度變化來捕捉延遲變化:當 RTT 上升時,表明擁塞愈發嚴重;反之,擁塞正在減輕。這種方式對於延遲更加敏感,有利於滿足應用低延遲需求。

速率計算的算法如上圖,首先計算 RTT 梯度變化。計算連續兩個 RTT 的差值,並與歷史值做平滑化過濾掉突發抖動帶來的偏差,然後再與 minimum RTT(可以取值爲估計的網絡傳播往返時間)做歸一化,得到 RTT 梯度變化率。然後確定期望的發送速率:

● 如果新的 RTT 低於 Tlow,那麼採用和性增長(Additive Increment)探測可用帶寬,提高發送速率。流量剛啓動時,RTT 可能會突然增長,這時候不應該視爲擁塞加重。

● 如果新的 RTT 高於 Thigh,那麼採用乘性減少(Multiplicative Decrement)減少發送速率。如果 RTT 持續維持在高水平,但梯度幾乎沒有變化,就需要這個機制防止擁塞。

● 根據 RTT 梯度變化率計算,

○ 如果 RTT 梯度變化率不爲正,說明擁塞減輕,那麼通過和性增長提高發送速率。如果連續五次 RTT 梯度變化率都不爲正,那麼增長步長相應提高。

○ 如果 RTT 梯度變化率爲正,說明擁塞加重,那麼通過乘性減少方式降低發送速率。

速率控制模塊

Timely 在軟件層增加了一個調度器。當應用需要發送數據包時,不會將發送請求提交給網卡,而是先交給調度器。根據前一模塊得到的期望發送速率,調度器將注入發包延遲,把能夠放行的數據包交給網卡發送,將需要延遲發送的數據包加入等待隊列中,在未來發送。

算法對比

DCQCN 作者隨後於 2016 年在文章 [6] 中,通過流體模型和仿真測試證明 Timely 將 RTT 作爲唯一衡量標準,難以同時兼顧公平性和延遲上限;而 DCQCN 卻可以做到。感興趣的同學可以瞭解一下。

下面從檢測方式、不同通信組件行爲、速率調整方式、適用場景等角度對比 DCQCN 和 Timely 兩種擁塞控制算法,同時也把經典的 TCP Tahoe 流控作爲參考。DCQCN 和 Timely 沒有采用基於窗口的調整方式,主要是窗口方式可能出現突發的流量帶來較大延遲,同時實現起來也比基於速率的方式複雜。

DCQCN Timely TCP Tahoe
檢測方式 ECN RTT 的梯度變化 丟包(重複確認或者 ACK 超時)
交換機 檢測擁塞設置 ECN
接收方 網卡發送 CNP 通知擁塞 網卡發送 ACK TCP 發送 ACK
發送方 網卡根據是否有 CNP 調整發送速率 軟件調度器根據 RTT 調整發送速率 TCP 根據是否丟包調節擁塞窗口
速率調整方式 基於擁塞參數調節,增加時包括快速增加和主動增加兩階段,減少時是乘性減 基於 RTT 的 AIMD 如果發生丟包,那麼進入快重傳,慢啓動門限降爲當前擁塞窗口一半,擁塞窗口降爲 1
適用場景 RoCEv2 通用,只要網卡支持發送 ACK TCP

在生產中,一般需要調節 DCQCN 和 Timely 的參數,使得它們在 PFC 生效之前先被觸發。但 PFC 仍然是必要的配置,因爲無論是 DCQCN 還是 Timely,RDMA 網卡在開始傳輸時都是以線速發送而不是慢啓動探測,需要藉助於 PFC 防止擁塞和丟包嚴重化。
DCQCN 的實現主要在網卡,是 RDMA 目前推薦的擁塞控制方案。

討論:流控是否有必要?

總結一下,RDMA 對於丟包十分敏感,需要 PFC 流控防止丟包發生。PFC 流控有不公平和 Head-of-Line 堵塞問題,需要藉助擁塞控制緩解它對網絡性能帶來的負面影響。但是,流控和擁塞控制有許多參數需要配置,默認參數無法適應所有場景,在我們的部署中就發現需要進行繁瑣的調參過程。

回過頭來,我們思考一下 RDMA 是否可以沒有 PFC 流控呢?

網卡改進

RDMA 網卡低效的 Go-back-N 重傳方式導致其依賴於 PFC。沿着這一思路,Timely 的作者於 2018 年提出新的 RDMA 網卡設計 IRN(Improved RoCE NIC)[7]。其靈感來源於 iWARP,在設計哲學上卻與 iWARP 有本質差別:iWARP 力求完整地將 TCP/IP 協議棧在網卡內部實現一遍,雖然可以高效應對丟包問題,但是其臃腫而複雜的實現導致其性能低下,在市場上表現弱於 RoCE;IRN 則是在 RoCEv2 之上做加法,只考慮加入最小的功能來去除對 PFC 的依賴。

IRN 主要從兩方面改進 RoCE 網卡:

1)增強丟包恢復機制

類似於 TCP,接收方不丟棄亂序包,發送方只選擇性重傳丟失的數據包。當接收方接收到一個亂序包,接收方會回覆一個 NACK,攜帶當前接收到的包序列號和期望收到的包序列號。發送方根據它就知道哪些包丟失了,哪些包已經被成功接收。

網卡作爲發送方時,通過維護一個位圖記錄發送的包是否收到了確認,如果接收到 NACK 或者發送超時,那麼就會重傳丟失或者超時的數據包。

網卡作爲接收方時,需要處理接收到的亂序包。假設我們限制每個 Flow 最多同時發送 100 個標準 MTU 大小(1 KB)大小的包,爲了支持 1000 個 Flow,網卡需要至少 100 MB 內存緩存亂序的包。而網卡內部一般只有幾 MB 的內存。IRN 提出不緩存接收到的亂序包,而是直接 DMA 寫到用戶的內存中。在這種設計下,需要解決以下問題:

● 首包問題。對於一個 RDMA Write 操作,可能被拆分成多個 MTU 大小的包,只有第一個包包含 RETH(RDMA Extented Transport Header)攜帶遠端的地址信息,如果第一個包在其他包之後被接收,其他包將無法知道 DMA 的目的地址。因此,IRN 要求爲每個包都有 RETH 信息的拷貝。

● WQE(Work Queue Entry)匹配問題。熟悉 RDMA 編程 API 的同學知道,應用通過構造一個 WQE 發起 RDMA 操作,WQE 記錄了操作的描述信息。RDMA 的內部實現假定了每次接收到完整的數據包,對應的就是下一個待處理的 WQE。亂序推翻了這一假設。IRN 要求每個 WQE 有自己的序列號,同時報文頭部需要攜帶序列號信息,用於兩者匹配。

● 尾包問題。RDMA 網卡在處理最後一個包時,一般會對包序列號加一,同時產生一個 CQE(Completion Queue Entry)用於通知上層 RDMA 操作完成。在亂序場景中,只有當同一個操作的所有包都完成傳輸,才能向上通知完成事件。IRN 需要額外的狀態來跟蹤每個包是否是最後一個完成傳輸的包。

● 覆蓋寫問題。假如同一片內存區域發生了兩次 RDMA 寫操作,第一次寫操作發生了丟包,第二次寫先到達,第一次寫經過重傳後到達,就可能出現舊數據將新數據覆蓋。IRN 需要上層應用自己處理這一問題。

2)網卡內實現基於 BDP(Bandwidth Delay Product)的流量控制

Bandwidth 一般是通信雙方網卡支持的速率上限,Delay 是網絡包在網絡信道中的傳播時間,因此 BDP 反映的是端到端的最大通信能力。文中計算 BDP 時 Delay 採用的是其網絡最長路徑的傳播時延估算值,這樣才能保證在最長路徑中,網絡帶寬始終是滿載的。

將每個 Flow 發送中的流量限制在一個 BDP 內,一方面可以減少網卡需要維護每個包狀態的數量,另一方面也降低了中間交換機出現緩衝區溢出的可能性。我們來簡單計算一下:一個 25GbE 兩層網絡架構,跨 ToR 交換機兩個節點間的 RTT 大概是 6us,BDP 爲 19 KB(即 25 * 1000 * 1000 * 1000 * 6 / 1000 / 1000 / 8 B);而 Mellanox Spectrum 交換機的動態緩衝區大小爲 12 MB,因此可以容忍大約 640 路 Incast。這樣,在一般場景下丟包會很少出現,也就可以去掉 PFC 的配置了。

這種方式可能存在的缺陷是:

● 如果多個 Flow 同時經過同一路徑,即便限制每個 Flow 流量在 BDP 內,在中間路徑交換機上仍舊會開始排隊積壓,乃至出現丟包。一種可能的優化方式是動態地調整 BDP 限制值。

● 它要求整張網絡中沒有其他一些不守規矩的流量。換句話說,它要求網絡中的所有流量都限制在 BDP 內。

● BDP 的取值可能影響性能。如果設置地過小,那麼帶寬可能無法跑滿;設置地過大,可能容易引起擁塞。

總結一下,選擇性重傳實際上在 TCP 早已支持,但在 RDMA 中實現卻是困難重重,這主要是因爲 RDMA 零拷貝的設計以及 RDMA 網卡內部資源受限。IRN 目前並沒有完整實現,帶來的更多是對於未來 RDMA 網卡設計的思考。

應用約束

針對小包傳輸爲主的業務,擁塞導致丟包發生的機率非常小,PFC 就沒有那麼必要了。基於這一思想,Anuj Kalia 提出了 FaSST(Fast, Scalable and Simple Distributed Transactions)[17](OSDI 2016),一個基於不可靠的 RDMA 數據報傳輸模式設計的分佈式事務系統。FaSST 中的 RPC 大小一般是 256 字節。由於丟包很少發生,FaSST 直接重啓 FaSST 進程,處理方式比較粗暴。

Anuj Kalia 後續在 NSDI 2019 又提出了 eRPC [8],旨在提供數據中心的一個通用的高性能 RPC 庫,大家不再需要爲了高性能將 RDMA 網絡模塊和業務邏輯耦合在一起實現。eRPC 主要的設計要點有,

● 爲了減少擁塞,IRN 在網卡內部實現基於 BDP 的流量控制,eRPC 則是在應用層實現。eRPC 爲每一個 RPC 會話分配可用的發送額度 credits,其值小於 BDP 與 MTU 的商。RPC 客戶端每次發送一個請求都需要花費一個 credit,服務端確認接收後歸還一個 credit。如果 credits 耗盡,客戶端的請求將進入隊列。eRPC 默認的 credits 額度爲 8。可以想象到 credits 值的選擇將影響到單個會話和多個會話的帶寬和延遲。

● 在 RDMA 數據報傳輸模式下,網卡不會處理丟包或者亂序包。eRPC 會丟棄所有的亂序包,然後客戶端以 Go-back-N 方式重傳丟包序列號之後的所有請求。eRPC 認爲丟包是非常罕見的,因此並沒有在丟包處理上做太多優化。

FaSST 和 eRPC 都是基於不可靠的 RDMA 數據報傳輸模式,不再需要 PFC,適合丟包很少的業務場景。對於像分佈式存儲這樣的業務就不適合了。可見,針對具體業務場景進行選型也是 RDMA 系統設計的重點。

展望

流控和擁塞控制技術是網絡領域的基本問題,對於 RDMA 這種新型網絡也不例外。DCQCN 的出現使得 RDMA 在數據中心真正落地,可以想象未來將會有更多的 RDMA 應用。簡單總結一下 RDMA 應用和研究的現狀。

如何用好 RDMA 本身的研究,如 [13, 14]。這已經比較成熟,前人總結了許多經驗:

● 如何使用 Memory Region 管理內存?
● 如何選擇 RDMA Verbs?
● 編程基於事件驅動還是輪詢?
● 如何減少 MMIO 或者 DMA 操作提高性能?
● 如何避免網卡的 Cache Miss?
● 如何利用好網卡的多隊列和多處理器併發?

流控和擁塞控制。PFC 和 DCQCN 的配置對於大規模數據中心帶來不小挑戰,參數配置會極大影響性能。基於 SDN 由中央控制器負責調度整張網絡的流量是一個比較 promising 的方向。另外,基於機器學習的擁塞控制算法也有不少研究。

網卡架構的新設計。目前 RDMA 網卡已經支持包括 NVMe over Fabric、EC、OvS、VXLAN/NVGRE 等多種功能卸載。對於 IRN 提出的亂序接收問題,Mellanox ConnectX-5 網卡已經支持亂序數據存放,但需要用戶層自己檢測亂序。相信 RDMA 與 SRIOV、NVM、Multi-Path、容器等技術的結合中會對網卡設計帶來更多的需求。

RDMA 在容器中的應用。SRIOV 可以將 RDMA 網卡的虛擬功能分配給容器使用,但是容器遷移時需要重新配置,不夠輕便。最近有一些研究希望在軟件層面實現 RDMA 在容器中的隔離,將 RDMA 控制路徑(如創建 QP,註冊 MR,創建 GID 等)交給軟件層實現,例如 FreeFlow(NSDI 2019)和 MasQ(SIGCOMM 2020)。另外,vDPA [18] 允許 VM 或者 容器通過標準的 VirtIO 控制和數據接口與網卡 VF 交互,目前已經在 RedHat 支持,在未來可能替代 SRIOV,vDPA 與 RDMA 結合也是一個有意思的話題。

RDMA 與新型存儲結合。目前基於 RDMA 的網絡存儲協議發展比較成熟,包括 NFS over RDMA、iSER、NVMe over Fabric 等,許多存儲廠商已經支持。對於新型的 NVM,FileMR(NSDI 2020)提出瞭如何將 RDMA 和 NVM 之間重疊的部分(命名、權限管理、內存管理等)去掉,提高效率。

參考文獻

[1] RDMA over Commodity Ethernet at Scale
[2] Congestion Control for Large-Scale RDMA Deployments
[3] Data Center Transport Mechanisms: Congestion Control Theory and IEEE Standardization
[4] Data Center TCP (DCTCP)
[5] TIMELY: RTT-based Congestion Control for the Datacenter
[6] ECN or Delay: Lessons Learnt from Analysis of DCQCN and TIMELY
[7] Revisiting Network Support for RDMA
[8] Datacenter RPCs can be General and Fast
[9] Traffic Control for RDMA-Enabled Data Center Networks- A Survey
[10] White Paper: RoCE in the Data Center
[11] RDMA in Data Centers: Looking Back and Looking Forward
[12] 數據中心網絡的流量控制:研究現狀與趨勢
[13] Minimizing the Hidden Cost of RDMA
[14] Design Guidelines for High Performance RDMA Systems
[15] Intro to Congestion Control
[16] ConnectX-6 Dx Adapter Cards Firmware Release Notes
[17] FaSST: Fast, Scalable and Simple Distributed Transactions with Two-Sided (RDMA) Datagram RPCs
[18] Achieving network wirespeed in an open standard manner: introducing vDPA
[19] TCP congestion control

作者介紹

Jiewei,SmartX 研發工程師。SmartX 擁有國內最頂尖的分佈式存儲和超融合架構研發團隊,是國內超融合領域的技術領導者。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章