一、RDMA概述
首先我們介紹一下RDMA的一些核心概念,當(dāng)然了,我并不打算寫(xiě)他的API以及調(diào)用方式,我們更多關(guān)注這些基礎(chǔ)概念背后的硬件執(zhí)行方式和原理,對(duì)于這些原理的理解是能夠?qū)懗龈咝阅躌DMA程序的關(guān)鍵。
Memory Region
RDMA的網(wǎng)卡(下文以RNIC指代)通過(guò)DMA來(lái)讀寫(xiě)系統(tǒng)內(nèi)存,由于DMA只能根據(jù)物理地址訪問(wèn),所以RNIC需要保存一份目標(biāo)內(nèi)存區(qū)域的虛擬內(nèi)存到物理內(nèi)存的映射表,這個(gè)映射表被存儲(chǔ)在RNIC的Memory Translation Table(MTT)中。同時(shí),由于目前RDMA的訪問(wèn)大都基于Direct Cache Access,不支持page-fault,所以我們還需要保證目標(biāo)內(nèi)存區(qū)域是被pagelock住以防止操作系統(tǒng)將這部分內(nèi)存頁(yè)換出。
總結(jié)一下就是,當(dāng)我們使用RDMA來(lái)訪問(wèn)一塊內(nèi)存的時(shí)候,這部分內(nèi)存首先要被pagelock,接著我們還需要把這塊內(nèi)存虛擬地址到邏輯地址的映射表發(fā)送給RNIC用于后續(xù)的訪問(wèn)查找,這個(gè)過(guò)程就叫Memory Registeration,這塊被注冊(cè)的內(nèi)存就是Memory Region。同時(shí)我們注冊(cè)內(nèi)存的時(shí)候需要指定這塊內(nèi)存的訪問(wèn)權(quán)限,RNIC將這個(gè)訪問(wèn)權(quán)限信息存儲(chǔ)在Memory Protection Tables(MPT)中用于用戶(hù)請(qǐng)求時(shí)的權(quán)限驗(yàn)證。
MTT和MPT被存儲(chǔ)在內(nèi)存中,但是RNIC的SRAM中會(huì)進(jìn)行緩存。當(dāng)RNIC接收到來(lái)自用戶(hù)的READ/WRITE請(qǐng)求的時(shí)候,首先在SRAM中的緩存中查找用戶(hù)請(qǐng)求的目標(biāo)地址對(duì)應(yīng)的物理地址以及這塊地址對(duì)應(yīng)的訪問(wèn)權(quán)限,如果緩存命中了,就直接基于DMA進(jìn)行操作,如果沒(méi)有命中,就得通過(guò)PCIe發(fā)送請(qǐng)求,在內(nèi)存的MTT和MPT中進(jìn)行查找,這帶來(lái)了相當(dāng)?shù)念~外開(kāi)銷(xiāo),尤其是當(dāng)你的應(yīng)用場(chǎng)景需要大量的、細(xì)粒度的內(nèi)存訪問(wèn)的時(shí)候,此時(shí)RNIC SRAM中的MTT/MPT命中缺失帶來(lái)的影響可能是致命的。
Memory Region的注冊(cè)是一個(gè)耗時(shí)的操作,但大部分情況下,我們都只需要在最開(kāi)始的時(shí)候做一次或者多次。現(xiàn)在也有不需要注冊(cè)MR基于on-demand paging的方式來(lái)訪問(wèn)的,比如AWS的EFA協(xié)議。但今天先不展開(kāi)這塊的內(nèi)容,因?yàn)檫@塊更多是Unified Memory這個(gè)話(huà)題下的,之后我可能會(huì)把這個(gè)和GPU的UVM放在一起介紹下,因?yàn)樗麄兊暮诵脑砥鋵?shí)是一樣的。
RDMA Verbs
用戶(hù)通過(guò)RDMA的Verbs API向RNIC發(fā)送指令,Verbs分為Memory Verbs和Message Verbs,Memory Verbs主要就是READ、WRITE以及一些ATOMIC的操作,Message Verbs主要包含SEND、RECV。Memory verbs是真正的CPU Bypass以及Kernel Bypass,所以總歸是性能比較好的。Message Verbs需要Responder的CPU的參與,相對(duì)而言更靈活,但是性能相比Memory Verbs而言一般不太行。
Queue Pair
RDMA的hosts之間是通過(guò)Queue Pair(QP)來(lái)通信的,一個(gè)QP包含一個(gè)Send Queue(SQ),一個(gè)Receive Queue(RQ)以及對(duì)應(yīng)的Send Completion Queue(SCQ)和Receive Completion Queue(RCQ)。用戶(hù)發(fā)送請(qǐng)求的時(shí)候,把請(qǐng)求封裝為一個(gè)Work Queue Element(WQE)發(fā)送到SQ里面,然后RDMA網(wǎng)卡會(huì)把這個(gè)WQE發(fā)送出去,當(dāng)這個(gè)WQE完成的時(shí)候,對(duì)應(yīng)的SCQ里面會(huì)被放一個(gè)Completion Queue Element(CQE),然后用戶(hù)可以從SCQ里面Poll這個(gè)CQE并通過(guò)檢查狀態(tài)來(lái)確認(rèn)對(duì)應(yīng)的WQE是否成功完成。需要指出的是,不同的QP可以共用CQ來(lái)減少SRAM的存儲(chǔ)消耗。
接下來(lái),我們重點(diǎn)介紹一下QP背后的知識(shí)。
首先,當(dāng)我們創(chuàng)建了QP之后,系統(tǒng)是需要保存狀態(tài)數(shù)據(jù)的,比如QP的metadata,擁塞控制狀態(tài)等等,除去QP中的WQE、MTT、MPT,一個(gè)QP大約對(duì)應(yīng)375B的狀態(tài)數(shù)據(jù)。這在以前RNIC的SRAM比較小的時(shí)候會(huì)是一個(gè)比較重的存儲(chǔ)負(fù)擔(dān),所以以前的RDMA工作會(huì)有QP Sharing的研究,就是不同的處理線(xiàn)程去共用QP來(lái)減少meta data的存儲(chǔ)壓力,但是這會(huì)帶來(lái)一定的性能的損失[1]?,F(xiàn)在新的RNIC的SRAM已經(jīng)比較大了,Mellanox的CX4、CX5系列的網(wǎng)卡的SRAM大約2MB,所以現(xiàn)在新網(wǎng)卡上,大家還是比較少去關(guān)注QP帶來(lái)的存儲(chǔ)開(kāi)銷(xiāo),除非你要?jiǎng)?chuàng)建幾千個(gè),幾萬(wàn)個(gè)QP。
其次,RNIC是包含多個(gè)Processing Unit(PU)的[2],同時(shí)由于QP內(nèi)的請(qǐng)求處理是具有順序的,且為了避免cross-PU的同步,一般而言我們認(rèn)為一個(gè)QP對(duì)應(yīng)一個(gè)PU來(lái)處理。所以,我們可以在一個(gè)線(xiàn)程內(nèi)建立多個(gè)QP來(lái)加速你數(shù)據(jù)處理,避免RDMA程序性能瓶頸卡在PU的處理上[3]。
二、RDMA性能優(yōu)化
RDMA性能優(yōu)化這個(gè)東西說(shuō)復(fù)雜也復(fù)雜,說(shuō)簡(jiǎn)單也簡(jiǎn)單。簡(jiǎn)單的點(diǎn)在于,從性能優(yōu)化角度而言,其實(shí)軟件層面我們可以做的設(shè)計(jì)和選擇不會(huì)太多,因?yàn)樾阅苌舷奘潜挥布ㄗ〉?,所以我們?yōu)榱俗非蟊M可能逼近硬件上限的性能表現(xiàn),其核心就在于按照硬件最友好的方式去做數(shù)據(jù)訪問(wèn)即可,沒(méi)有特別多復(fù)雜的算法在這里面,當(dāng)你想要高性能的時(shí)候,多多了解硬件就對(duì)了。對(duì)照著我們?cè)谏厦娼榻B的三個(gè)核心概念,我們一一介紹性能優(yōu)化的經(jīng)驗(yàn)。
2.1 關(guān)注地址翻譯的性能開(kāi)銷(xiāo)
前面我們提到,當(dāng)待請(qǐng)求的數(shù)據(jù)地址在RNIC SRAM中的MTT/MPT沒(méi)有命中的時(shí)候,RNIC需要通過(guò)PCIe去在內(nèi)存中的MTT和MPT進(jìn)行查找,這是一個(gè)耗時(shí)的操作。尤其是當(dāng)我們需要 high fan-out、fine-grained的數(shù)據(jù)訪問(wèn)時(shí),這個(gè)開(kāi)銷(xiāo)會(huì)尤為的明顯?,F(xiàn)有針對(duì)這個(gè)問(wèn)題的優(yōu)化方式主要有兩種:
- Large Page:無(wú)論是MTT亦或者操作系統(tǒng)的Page Table,虛擬地址到物理地址的映射表項(xiàng)是Page粒度的,即一個(gè)Page對(duì)應(yīng)一個(gè)MTT的Entry或者Page Table的Entry(PTE)。使用Large Page可以有效的減少M(fèi)TT的Size,進(jìn)而使得RNIC中的MTT Cache命中率更高。
- 使用Contiguous Memory + PA-MR[4, 5]。新一代的CX網(wǎng)卡支持用戶(hù)基于物理地址訪問(wèn),為了避免維護(hù)一個(gè)繁重的Page Table,我們可以通過(guò)Linux的CMA API來(lái)申請(qǐng)一大塊連續(xù)的物理內(nèi)存。這樣我們的MTT就只有一項(xiàng),可以保證100%的Cache命中率。但是這個(gè)本身有一些安全隱患,因?yàn)槭褂肞A-MR會(huì)繞過(guò)訪問(wèn)權(quán)限驗(yàn)證,所以使用的時(shí)候要注意這點(diǎn)。
當(dāng)然,其實(shí)還有一些別的優(yōu)化手段,在最近我們的工作中提出一種新的方式來(lái)提升地址翻譯的性能,具體等工作開(kāi)源出來(lái)之后我再來(lái)介紹介紹。
2.2 關(guān)注RNIC PU/QP的執(zhí)行模型
一個(gè)QP對(duì)應(yīng)一個(gè)PU,這是我們對(duì)RNIC執(zhí)行方式的一個(gè)簡(jiǎn)單建模。這個(gè)模型下,我們需要通過(guò)多QP來(lái)充分發(fā)揮多PU并行處理的能力,同時(shí)也要關(guān)注我們的操作減少PU之間的同步,PU之間同步對(duì)于性能有著較大的傷害。
2.3 RMDA Verbs
對(duì)于RDMA的Verbs的使用,以我個(gè)人的經(jīng)驗(yàn)來(lái)看,就是優(yōu)先使用READ/WRITE,在一些需要CPU介入且需要Batch處理邏輯的,可以嘗試使用SEND/RECV。過(guò)往的工作有很多基于READ/WRITE去構(gòu)建Message Passing處理語(yǔ)義的工作[1, 6, 7],可以著重參考。
同時(shí),一個(gè)READ/WRITE的WQE可以通過(guò)設(shè)置對(duì)應(yīng)的FLAG來(lái)設(shè)置其是否需要在完成時(shí)需要被SIGNALED,如果不需要?jiǎng)t該WQE完成時(shí)不會(huì)產(chǎn)生一個(gè)CQE。此時(shí)一個(gè)常見(jiàn)的優(yōu)化技巧是,當(dāng)你需要連續(xù)在一個(gè)QP中發(fā)送K個(gè)READ/WRITE請(qǐng)求時(shí),只把最后一個(gè)請(qǐng)求設(shè)置為SIGNALED,其他均為UNSIGNALED,由于QP的執(zhí)行本身具備順序關(guān)系,所以最后一個(gè)執(zhí)行完了后一定意味著之前的WQE都已經(jīng)執(zhí)行完了。當(dāng)然,是否執(zhí)行成功需要Application-Specific的方法來(lái)確認(rèn)。
三、 RNIC+ X
最經(jīng)典的RNIC的使用方式自然是RNIC + System Memory,即直接通過(guò)RNIC來(lái)訪問(wèn)內(nèi)存。但是隨著GP-GPU、NVM的發(fā)展,通過(guò)RNIC來(lái)直接訪問(wèn)GPU或者通過(guò)RNIC來(lái)直接訪問(wèn)NVM都是目前比較成熟和熱門(mén)的技術(shù)。RDMA + GPU可以大幅度加速GPU和GPU之間的通信,RDMA + NVM則可以大幅度的擴(kuò)大內(nèi)存容量,減少網(wǎng)絡(luò)通信的需求。這塊內(nèi)容既涉及到硬件又涉及到操作系統(tǒng)的虛擬內(nèi)存機(jī)制,要講清楚需要不少篇幅,我們放在下一篇進(jìn)行介紹。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-693787.html
四、總結(jié)
本篇文章主要是介紹一些RDMA的基礎(chǔ)概念以及背后的原理,基于這些概念和原理我們介紹了RDMA的常見(jiàn)性能優(yōu)化技巧,下一篇我們將會(huì)介紹RNIC + X,包括RNIC + GPU以及RNIC + NVM的內(nèi)容介紹,感興趣的讀者朋友可以保持關(guān)注~。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-693787.html
到了這里,關(guān)于RDMA性能優(yōu)化經(jīng)驗(yàn)淺談的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!