作者:李豪 ? ? RDMA(remote direct memory access)即遠(yuǎn)端直接內(nèi)存訪問,是一種高性能網(wǎng)絡(luò)通信技術(shù),具有高帶寬、低延遲、無CPU消耗等優(yōu)點(diǎn)。RDMA相比TCP在性能方面有明顯的優(yōu)勢(shì),但在編程復(fù)雜度上RDMA verbs卻比TCP socket復(fù)雜一個(gè)數(shù)量級(jí)。 ? 開源社區(qū)和各大云廠商在RDMA通信庫方面都有不少嘗試,今天我們精讀阿里云的RDMA通信庫論文X-RDMA: Effective RDMA Middleware in Large-scale Production Environments,來看看阿里云是如何使用RDMA技術(shù)的。 ?
? 01 摘要和背景介紹
? (2019年)RDMA技術(shù)在數(shù)據(jù)中心越來越受歡迎,當(dāng)前最新的ConnectX-6 Infiniband網(wǎng)卡可以支持200Gbps的帶寬和極低的延遲(0.6微妙)。RDMA技術(shù)也在越來越多的系統(tǒng)中得到應(yīng)用,比如KV存儲(chǔ)、文件系統(tǒng)、圖計(jì)算等。 ? 但是在規(guī)模生產(chǎn)環(huán)境中,RDMA的實(shí)際收益還不夠明顯,一個(gè)重要原因是RDMA編程復(fù)雜性太高,想用好它很難,RDMA verbs編程有一堆的新概念(QP,MR,PD,RQ,SQ,CQ,……),這根傳統(tǒng)socket編程迥異。想要直接把已有應(yīng)用直接遷移到RDMA更是不可能。 ? 使用RDMA需要解決以下問題: ?
問題定位困難
大規(guī)模集群中存在性能抖動(dòng)和擁塞
大消息會(huì)增加incast擁塞概率
本文分享我們關(guān)于大規(guī)模RDMA部署的經(jīng)驗(yàn),以及如何啟發(fā)我們?cè)O(shè)計(jì)出RDMA通信中間件X-RDMA。X-RDMA很多功能是業(yè)務(wù)需求推動(dòng)的,比如穩(wěn)健性、高效的資源管理以及用于調(diào)試和性能調(diào)整的便捷工具。 ? X-RDMA已經(jīng)在阿里大量使用近兩年(16年至今),幾乎所有的基于RDMA的應(yīng)用都在使用X-RDMA,包括云數(shù)據(jù)庫和存儲(chǔ)系統(tǒng)。X-RDMA收益如下: ?
網(wǎng)絡(luò)吞吐提升24%
網(wǎng)絡(luò)延遲降低5%(相比于ucx-am-rc)
RDMA的編程模型
原生以太網(wǎng)無法滿足我們的網(wǎng)絡(luò)性能要求,而RDMA可以提供: ?
超低延遲(2微秒)
高吞吐
零拷貝
不經(jīng)過內(nèi)核
因此RDMA可以降低傳統(tǒng)TCP協(xié)議棧的1. 上下文切換開銷,2. 協(xié)議處理開銷,3. 數(shù)據(jù)拷貝開銷。 ? RDMA提供RC、UD、RD等多種連接,同時(shí)提供兩類數(shù)據(jù)語義: ?
單邊語義:Write/Read/Atomic,這類語義不需要對(duì)端CPU參與。
雙邊語義:Send/Recv,這類語義跟傳統(tǒng)以太網(wǎng)有些相似,需要對(duì)端CPU配合做一些事情(但不需要CPU做協(xié)議棧處理)。
RDMA verbs編程有一堆的新概念,跟socket編程迥異。使用verbs編寫一個(gè)簡(jiǎn)單的echo server/client程序需要200行以上,流程十分繁瑣。 ?
阿里的數(shù)據(jù)中心網(wǎng)絡(luò)部署
阿里數(shù)據(jù)中心網(wǎng)絡(luò)是基于以太網(wǎng)的clos網(wǎng)絡(luò),由三層交換機(jī)組成,分別是spine、leaf、ToR,拓?fù)淙缦拢??
? 每個(gè)ToR下面有40個(gè)節(jié)點(diǎn),每臺(tái)機(jī)器有一張雙口網(wǎng)卡,上聯(lián)兩臺(tái)ToR。 ?
阿里的RDMA使用場(chǎng)景
RDMA有三種實(shí)現(xiàn)方式: ?
Infiniband
RoCE/RoCEv2
iWARP
目前數(shù)據(jù)中心廣泛使用的是RoCEv2,RoCEv2依賴PFC保證網(wǎng)絡(luò)無損,同時(shí)通過DCQCN做到端到端的擁塞的控制。 ? 本論文主要介紹三個(gè)阿里有代表性的應(yīng)用:ESSD、XDB、PolarDB。Pangu一個(gè)阿里云開發(fā)的高可靠、高可用、高性能的分布式文件系統(tǒng),類似于Ceph。Pangu中每個(gè)服務(wù)器上有兩個(gè)核心組件:block server和chunk server。 ? block server從前端接收數(shù)據(jù)(ESSD、XDB等),然后將數(shù)據(jù)以三副本形式分發(fā)給不同機(jī)器上的chunck server。block server和chunk server通過RDMA進(jìn)行fullmesh通信。
? 02 大規(guī)模生產(chǎn)環(huán)境遇到的問題 ? 大規(guī)模生產(chǎn)環(huán)境使用RDMA主要遇到以下問題: ? RDMA編程復(fù)雜:verbs編程比socket編程復(fù)雜很多,一個(gè)簡(jiǎn)單的ping-pong程序RDMA需要200行代碼,而socket只需要50行。 ? RDMA可擴(kuò)展性挑戰(zhàn):主要體現(xiàn)在幾個(gè)方面:a. RDMA資源占用會(huì)隨著集群規(guī)模增加,比如連接數(shù)和內(nèi)存的占用。Pangu中每個(gè)block server上有N個(gè)線程,每個(gè)chunk server上有M個(gè)線程,而每?jī)蓚€(gè)線程之間都要建立fullmesh的鏈接,換算下來每個(gè)chunk server的內(nèi)存占用為: ? ?
? b. 大規(guī)模RDMA集群存在擁塞和嚴(yán)重的incast。c. 建聯(lián)速度太慢,通過rdmacm建聯(lián)平均需要花4毫秒,而TCP只需要100微秒。 ? RDMA健壯性問題:體現(xiàn)在 a. RDMA單邊操作無法感知對(duì)端應(yīng)用層的處理狀態(tài),這給內(nèi)存管理帶來挑戰(zhàn),因?yàn)閷?duì)端接收完成之前發(fā)送方的buffer不能釋放,兩邊配合不好會(huì)導(dǎo)致RNR出現(xiàn)。b. RDMA無法感知通信的對(duì)端是否還活著(這一點(diǎn)跟TCP很不同,TCP會(huì)有內(nèi)核做鏈接保活,RDMA是kernel by pass的,即使對(duì)端掛了,本地也不會(huì)受到任何通知),這會(huì)導(dǎo)致鏈接泄露,跟這個(gè)鏈接相關(guān)的資源也無法釋放。 ? RDMA問題排查工具缺失:RDMA沒有類似netstat和pingmesh之類的工具,也沒有類似netfilter的工具。 ? 基于以上挑戰(zhàn)我們?cè)O(shè)計(jì)了X-RDMA通信庫。 ? ? 03 X-RDMA設(shè)計(jì)思想
整體架構(gòu)
X-RDMA有三層抽象,包含16個(gè)核心組件: ? 最上層:提供簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)和API抽象,屏蔽RDMA verbs編程復(fù)雜性。 ? 中間層:提供1. 可靠的協(xié)議拓展(KeepAlive),2. 資源管理(qp管理,內(nèi)存管理,消息管理等),3. flow control, 4. 性能分析工具(trace, statistic, config, filter, mock, monitor)等功能。 ? 底層:timer、task、fd數(shù)據(jù)結(jié)構(gòu)。
?
X-RDMA API ?
線程模型
X-RDMA采用run-to-complete線程模型,從而避免了數(shù)據(jù)路徑上鎖/原子變量/系統(tǒng)調(diào)用的使用,代價(jià)就是所有的核心資源都是線程粒度的,即每個(gè)線程都要有單獨(dú)的內(nèi)存池、鏈接池等。導(dǎo)致的后果就是內(nèi)存占用和連接數(shù)的膨脹。但在存儲(chǔ)場(chǎng)景下為了更好的性能多使用一些資源是可以接受的。 ? 思考:存儲(chǔ)之外的場(chǎng)景適合使用R2C的設(shè)計(jì)嗎? ? X-RDMA混合使用epoll和busy polling 來平衡CPU占用和響應(yīng)速度,當(dāng)有消息到來或者timer超時(shí)是切換到busy polling模式,當(dāng)長(zhǎng)時(shí)間沒有事件時(shí)則切換到epoll模式。KeepAlive和統(tǒng)計(jì)功能都是注冊(cè)到timer上的事件。 ?
消息模型
阿里大部分應(yīng)用通信采用RPC模式,即request-response模式。X-RDMA實(shí)現(xiàn)了RPC的通信模式。 ? 由于RDMA操作的內(nèi)存需要reg_mr,這個(gè)動(dòng)作是將虛地址pin在物理內(nèi)存中防止page換出,然后將頁表項(xiàng)也發(fā)給網(wǎng)卡,顯然這個(gè)動(dòng)作比較耗時(shí)間。為了降低內(nèi)存準(zhǔn)備的開銷和過多的內(nèi)存占用,X-RDMA將消息分成兩類分別處理,這種劃分類似于MPI中的eager和rendezvous模式: ? 小消息:小消息對(duì)延遲敏感,默認(rèn)將4KB以內(nèi)的消息稱為小消息。采用RDMA SEND/RECV完成收發(fā),兩側(cè)各只需要下發(fā)一個(gè)WR,效率比較高。但是這要求接收方率先準(zhǔn)備好接收buffer,為避免較多的內(nèi)存占用,該模式只能用于小消息收發(fā)。 ? 大消息:大消息對(duì)吞吐敏感,大消息收發(fā)通過多輪協(xié)商完成,步驟如下:a. 發(fā)送方發(fā)送一個(gè)WR告知接收方有數(shù)據(jù)要發(fā)送,b. 接收方按需準(zhǔn)備好接收buffer,c. 接收方通過RDMA READ讀取數(shù)據(jù)。 ?
每個(gè)線程的工作流
X-RDMA采用run-to-complete的線程模型,因此每個(gè)線程都有一個(gè)單獨(dú)的工作流,如下圖: ?
上圖中信息很豐富,做幾點(diǎn)說明: ? X-RDMA支持event模式和polling模式,可通過xrdma_get_event_fd()的方式獲取polling所需的fd,然后調(diào)用xrdma_process_event()進(jìn)行事件處理。 ? X-RDMA發(fā)送消息是異步非阻塞的,因此可能有多個(gè)消息在同時(shí)發(fā)送,被稱為inflight messages,但是X-RDMA會(huì)限制inflight messages不超過CQ深度。 ? 鏈接的心跳信息依賴于timer超時(shí)事件,X-RDMA會(huì)自動(dòng)發(fā)送keepAlive信息做鏈接保活。 ?
資源管理
為了1. 提升性能,2. 降低內(nèi)存占用,3. 縮短建聯(lián)時(shí)間,X-RDMA為每個(gè)線程維護(hù)內(nèi)存池和連接池。 ? 內(nèi)存池:RDMA內(nèi)存池主要是管理MR(memory region),由于網(wǎng)卡可以管理的MR數(shù)量是有限的,因此過多的MR不僅可能會(huì)導(dǎo)致性能下降,甚至?xí)?dǎo)致超過網(wǎng)卡MR上限而無法注冊(cè)新內(nèi)存,因此X-RDMA采用4MB的粒度來注冊(cè)MR,以此來降低MR的數(shù)量。 ? 連接池:RDMA建聯(lián)比TCP建聯(lián)耗時(shí)更長(zhǎng)(4ms VS. 100us),X-RDMA為每個(gè)線程維護(hù)一個(gè)qp cache來降低建聯(lián)開銷。如果一個(gè)鏈接斷開,則會(huì)把qp設(shè)置為IBV_QPS_RESET狀態(tài),并放到qp cache中,以便后續(xù)復(fù)用。 ? X-RDMA沒有使用CM建聯(lián),而是自己實(shí)現(xiàn)的一套帶外建聯(lián),論文評(píng)估章節(jié)有說明。 ? ? 04 RDMA協(xié)議拓展 ? X-RDMA從以下幾個(gè)方面對(duì)RDMA做了拓展:
KeepAlive
Seq-Ack Window
Flow Control
KeepAlive
TCP/IP協(xié)議棧會(huì)由內(nèi)核發(fā)送心跳消息檢查鏈接是否存活,但RDMA協(xié)議棧沒有內(nèi)核參與,因此無法由內(nèi)核自動(dòng)發(fā)送心跳信息。鏈接保活檢查時(shí)必須的,因?yàn)橛泻芏嗟脑驎?huì)導(dǎo)致鏈接泄露。當(dāng)一個(gè)鏈接在S毫秒內(nèi)沒有沒有和對(duì)端通信時(shí),X-RDMA會(huì)觸發(fā)KeepAlive機(jī)制,通過RDMA Write探測(cè)鏈接是否存活,Write的payload是零字節(jié),如果對(duì)端還存活,網(wǎng)卡會(huì)自動(dòng)恢復(fù)ACK報(bào)文。 ?
Seq-Ack Window
X-RDMA的seq-ack window機(jī)制主要出于以下考量: ? 網(wǎng)卡的ack只能保證數(shù)據(jù)已經(jīng)到達(dá)對(duì)端,但并不能保證接收側(cè)的應(yīng)用程序已經(jīng)處理了這些數(shù)據(jù)報(bào)文。 ? 發(fā)送小消息時(shí)X-RDMA需要接收方提前準(zhǔn)備好接收buffer,如果消息數(shù)量很多而接收方的buffer數(shù)量不足,則會(huì)導(dǎo)致RNR(request not ready),這不僅會(huì)導(dǎo)致性能下降,甚至?xí)?dǎo)致鏈接斷開。 ? 通過X-RDMA的seq-ack window機(jī)制可以避免RNR出現(xiàn),具體做法是:收發(fā)兩邊分別有一個(gè)緩存in-flight請(qǐng)求的ring buffer窗口,窗口大小設(shè)置為IO depth。每次發(fā)送數(shù)據(jù)時(shí)(RDMA Write/Send)X-RDMA都會(huì)將seq-ack編號(hào)通過RDMA immediate Data發(fā)送給對(duì)方。具體算法如下圖:
Flow Control
在大規(guī)模incast場(chǎng)景下DCQCN并不能很好的工作,具體體現(xiàn)在: ? DCQCN是一種被動(dòng)控制,在CC起作用之前可能已經(jīng)出現(xiàn)了性能下降(比如ECN報(bào)文還沒有返回,交換機(jī)buffer就已經(jīng)出現(xiàn)了丟包)。 ? 根據(jù)觀察,incast導(dǎo)致CNP和PFC會(huì)導(dǎo)致網(wǎng)絡(luò)性能和健壯性的下降。 ? X-RDMA通過1. 消息分片和2. 消息排隊(duì) 來協(xié)助DCQCN緩解網(wǎng)絡(luò)擁塞。 ? 消息分片:對(duì)于大的請(qǐng)求,X-RDMA會(huì)把請(qǐng)求按照64KB的粒度進(jìn)行切分,然后逐片發(fā)送。以避免大消息對(duì)網(wǎng)卡的阻塞。 ? 消息排隊(duì):X-RDMA限制同時(shí)能發(fā)起的WR請(qǐng)求數(shù)量為N,多出來的請(qǐng)求放到隊(duì)列里排隊(duì)。 ? 上述兩種流控算法均實(shí)現(xiàn)X-RDMA通信庫里,對(duì)網(wǎng)卡硬件沒有限制。 ? ? 05 性能和問題分析框架 ? X-RDMA提供了眾多工具和機(jī)制定位各種類型的bug,分析工具如下圖:
Tracing
X-RDMA數(shù)據(jù)通路有兩種模式,分別是: ?
bare-data模式:直接發(fā)送用戶的原始數(shù)據(jù),不做任何的鏈路追蹤。
req-res模式:會(huì)在用戶的數(shù)據(jù)之前加入header,通過header記錄必要的信息,用于tracing和問題定位。通過該機(jī)制可以計(jì)算出網(wǎng)絡(luò)的RTT。
X-RDMA的tracing功能還可用于: ?
定位網(wǎng)絡(luò)擁塞
發(fā)現(xiàn)慢polling:通過記錄兩次polling之間的時(shí)間差,發(fā)現(xiàn)慢polling。通常這可能是由于用戶工作線程有比較耗時(shí)的操作所致。
發(fā)現(xiàn)執(zhí)行較慢的代碼片
Monitoring
我們提供三種工具彌補(bǔ)RDMA工具不足的問題,分別是: ?
XR-Stat:對(duì)標(biāo)TCP的netstat
XR-Ping:對(duì)標(biāo)TCP的ping,以及RDMA自己的rping(rping功能太簡(jiǎn)單了)
XR-Perf:用于做RDMA性能和壓力測(cè)試。
性能調(diào)優(yōu)
X-RDMA通信庫有很多參數(shù)可以調(diào)整,可分為兩類:1. 運(yùn)行時(shí)動(dòng)態(tài)可調(diào)的(通過XR-adm命令控制),以及2. 啟動(dòng)程序是可配置的,具體如下表:
? 06 性能評(píng)估 ? 目前(2017)阿里有超過4000臺(tái)服務(wù)器部署了X-RDMA,使用RoCEv2協(xié)議。最大的一個(gè)RDMA集群有4個(gè)子集群,每個(gè)子集群有256個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)有一張雙口的25Gbps Mellanox ConnectX4-Lx網(wǎng)卡(總共50Gbps)。 ? ? 07 讀后總結(jié) ? 本文介紹了阿里X-RDMA的核心設(shè)計(jì)思想,包含線程模型、消息模型、資源管理、心跳檢測(cè)、Flow Control等各個(gè)維度,對(duì)用好RDMA以及設(shè)計(jì)新的RDMA通信庫有很好的參考價(jià)值。其Run-to-Complete線程模型大大降低了X-RDMA自身的設(shè)計(jì)和編程復(fù)雜性,在存儲(chǔ)等典型場(chǎng)景下有很不錯(cuò)的效果。 ? 美中不足的是X-RDMA沒有公開代碼,文中介紹的很多細(xì)節(jié)和工具無法進(jìn)一步了解。 ? 論文鏈接: https://ieeexplore.ieee.org/document/8891004 ? 【投稿】:SDNLAB原創(chuàng)文章獎(jiǎng)勵(lì)計(jì)劃
審核編輯:黃飛
?
評(píng)論
查看更多