當網(wǎng)絡(luò)傳輸協(xié)議SRD遇上DPU
What?
SRD(Scalable Reliable Datagram,可擴展的可靠數(shù)據(jù)報文),是AWS年推出的協(xié)議,旨在解決亞馬遜的云性能挑戰(zhàn)。它是專為AWS數(shù)據(jù)中心網(wǎng)絡(luò)設(shè)計的、基于Nitro芯片、為提高HPC性能實現(xiàn)的一種高吞吐、低延遲的網(wǎng)絡(luò)傳輸協(xié)議。
SRD 不保留數(shù)據(jù)包順序,而是通過盡可能多的網(wǎng)絡(luò)路徑發(fā)送數(shù)據(jù)包,同時避免路徑過載。為了最大限度地減少抖動并確保對網(wǎng)絡(luò)擁塞波動的最快響應(yīng),在 AWS 自研的 Nitro chip 中實施 SRD。
SRD 由 EC2 主機上的 HPC/ML 框架通過 AWS EFA(Elastic Fabric Adapter,彈性結(jié)構(gòu)適配器)內(nèi)核旁路接口使用。
SRD的特點:
- 不保留數(shù)據(jù)包順序,交給上層消息傳遞層處理
- 通過盡可能多的網(wǎng)絡(luò)路徑發(fā)包,利用ECMP標準,發(fā)端控制數(shù)據(jù)包封裝來控制ECMP路徑選擇,實現(xiàn)多路徑的負載平衡
- 自有擁塞控制算法,基于每個連接動態(tài)速率限制,結(jié)合RTT(Round Trip Time)飛行時間來檢測擁塞,可快速從丟包或鏈路故障中恢復
- 由于無序發(fā)包以及不支持分段,SRD傳輸時所需要的QP(隊列對)顯著減少
Why?
為什么不是TCP?
TCP 是 IP 網(wǎng)絡(luò)中可靠數(shù)據(jù)傳輸?shù)闹饕侄危哉Q生以來一直很好地服務(wù)于 Internet,并且仍然是大多數(shù)通信的最佳協(xié)議。但是,它不適合對延遲敏感的處理,TCP 在數(shù)據(jù)中心最好的往返延遲差不多是 25us,因擁塞(或鏈路故障)等待導致的異常值可以是 50 ms,甚至數(shù)秒,帶來這些延遲的主要原因是TCP丟包之后的重傳機制。另外,TCP傳輸是一對一的連接,就算解決了時延的問題,也難在故障時重新快速連線。
TCP 是通用協(xié)議,沒有針對HPC場景進行優(yōu)化,早在2020 年,AWS 已經(jīng)提出需要移除TCP。
為什么不是RoCE?
InfiniBand 是一種用于高性能計算的流行的高吞吐量低延遲互連,它支持內(nèi)核旁路和傳輸卸載。RoCE(RDMA over Converged Ethernet),也稱為 InfiniBand over Ethernet,允許在以太網(wǎng)上運行 InfiniBand 傳輸,理論上可以提供 AWS 數(shù)據(jù)中心中 TCP 的替代方案。
EFA 主機接口與 InfiniBand/RoCE 接口非常相似。但是 InfiniBand 傳輸不適合 AWS 可擴展性要求。原因之一是 RoCE 需要 PFC(優(yōu)先級流量控制),這在大型網(wǎng)絡(luò)上是不可行的,因為它會造成隊頭阻塞、擁塞擴散和偶爾的死鎖。PFC 更適合比 AWS 規(guī)模小的數(shù)據(jù)中心。此外,即使使用 PFC,RoCE 在擁塞(類似于 TCP)和次優(yōu)擁塞控制下仍會遭受 ECMP(等價多路徑路由)沖突。
為什么是SRD?
SRD是專為AWS設(shè)計的可靠的、高性能的、低延遲的網(wǎng)絡(luò)傳輸。這是數(shù)據(jù)中心網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)囊淮沃卮蟾倪M。SRD受InfiniBand可靠數(shù)據(jù)報的啟發(fā),結(jié)合大規(guī)模的云計算場景下的工作負載,SRD也經(jīng)過了很多的更改和改進。SRD利用了云計算的資源和特點(例如AWS的復雜多路徑主干網(wǎng)絡(luò))來支持新的傳輸策略,為其在緊耦合的工作負載中發(fā)揮價值。
任何真實的網(wǎng)絡(luò)中都會出現(xiàn)丟包、擁塞阻塞等一系列問題。這不是說每天會發(fā)生一次的事情,而是一直在發(fā)生。
大多數(shù)協(xié)議(如 TCP)是按順序發(fā)送數(shù)據(jù)包,這意味著單個數(shù)據(jù)包丟失會擾亂隊列中所有數(shù)據(jù)包的準時到達(這種效應(yīng)稱為“隊頭阻塞”)。而這實際上會對丟包恢復和吞吐量產(chǎn)生巨大影響。
SRD 的創(chuàng)新在于有意通過多個路徑分別發(fā)包,雖然包到達后通常是亂序的,但AWS實現(xiàn)了在接收處以極快的速度進行重新排序,最終在充分利用網(wǎng)絡(luò)吞吐能力的基礎(chǔ)上,極大地降低了傳輸延遲。
SRD 可以一次性將構(gòu)成數(shù)據(jù)塊的所有數(shù)據(jù)包推送到所有可能路徑,這意味著SRD不會受到隊頭阻塞的影響,可以更快地從丟包場景中恢復過來,保持高吞吐量。
眾所周知,P99尾部延遲代表著只有1%的請求被允許變慢,但這也恰恰反映了網(wǎng)絡(luò)中所有丟包、重傳和擁塞帶來的最終性能體現(xiàn),更能夠說明“真實”的網(wǎng)絡(luò)情況。SRD能夠讓P99 尾延遲直線下降(大約 10 倍)。
SRD的主要功能包括:
- 亂序交付:取消按順序傳遞消息的約束,消除了隊頭阻塞,AWS在EFA用戶空間軟件堆棧中實現(xiàn)了數(shù)據(jù)包重排序處理引擎
- 等價多路徑路由(ECMP):兩個EFA實例之間可能有數(shù)百條路徑,通過使用大型多路徑網(wǎng)絡(luò)的一致性流哈希的屬性和SRD對網(wǎng)絡(luò)狀況的快速反應(yīng)能力,可以找到消息的最有效路徑。數(shù)據(jù)包噴涂(Packet Spraying)可防止出現(xiàn)擁塞熱點,并可以從網(wǎng)絡(luò)故障中快速無感地恢復
- 快速的丟包響應(yīng):SRD對丟包的響應(yīng)比任何高層級的協(xié)議都快得多。偶爾的丟包,特別是對于長時間運行的HPC應(yīng)用程序,是正常網(wǎng)絡(luò)操作的一部分,不是異常情況
- 可擴展的傳輸卸載:使用SRD,與其他可靠協(xié)議(如InfiniBand可靠連接IBRC)不同,一個進程可以創(chuàng)建并使用一個隊列對與任何數(shù)量的對等方進行通信
How
SRD 實際工作的關(guān)鍵不在于協(xié)議,而在于它在硬件中的實現(xiàn)方式。換種說法,就目前而言,SRD 僅在使用 AWS Nitro DPU 時才有效。
SRD亂序交付的數(shù)據(jù)包需要重新排序才能被操作系統(tǒng)讀取,而處理混亂的數(shù)據(jù)包流顯然不能指望“日理萬機”的 CPU。即便真通過CPU 來完全負責 SRD 協(xié)議并重新組裝數(shù)據(jù)包流,無疑是高射炮打蚊子——大材小用,那會使系統(tǒng)一直忙于處理不應(yīng)該花費太多時間的事情,而根本無法真正做到性能的提升。
在SRD這一不尋常的“協(xié)議保證”下,當網(wǎng)絡(luò)中的并行導致數(shù)據(jù)包無序到達時,AWS將消息順序恢復留給上層,因為它對所需的排序語義有更好的理解,并選擇在AWS Nitro卡中實施SRD可靠性層。其目標是讓SRD盡可能靠近物理網(wǎng)絡(luò)層,并避免主機操作系統(tǒng)和管理程序注入的性能噪音。這允許快速適應(yīng)網(wǎng)絡(luò)行為:快速重傳并迅速減速以響應(yīng)隊列建立。
AWS說他們希望數(shù)據(jù)包在“棧上”重新組裝,他們實際上是在說希望 DPU 在將數(shù)據(jù)包返回給系統(tǒng)之前,完成將各個部分重新組合在一起的工作。系統(tǒng)本身并不知道數(shù)據(jù)包是亂序的。系統(tǒng)甚至不知道數(shù)據(jù)包是如何到達的。它只知道它在其他地方發(fā)送了數(shù)據(jù)并且沒有錯誤地到達。
這里的關(guān)鍵就是 DPU。AWS SRD 僅適用于 AWS 中配置了 Nitro 的系統(tǒng)?,F(xiàn)在不少使用AWS的服務(wù)器都安裝和配置了這種額外的硬件,其價值在于啟用此功能將能夠提高性能。用戶需要在自己的服務(wù)器上專門啟用它,如果需要與未啟用 SRD 或未配置 Nitro DPU 的設(shè)備通信,就不會得到相應(yīng)的性能提升。
至于很多人關(guān)心的SRD未來是否會開源,只能說讓我們拭目以待吧!