13.3.3 iWARP
iWARP(Internet Wide Area RDMA Protocol)是 IETF 定義的基于 TCP 的 RDMA,它和RoCE v2 都可以路由。因?yàn)?TCP 是面向連接的可靠協(xié)議,這使得 iWARP 在面對(duì)有損網(wǎng)絡(luò)場(chǎng)景時(shí),相比 RoCEv2 和 InfiniBand 具有更好的可靠性,在大規(guī)模組網(wǎng)時(shí)也有明顯的優(yōu)勢(shì)。但在大規(guī)模數(shù)據(jù)中心和大規(guī)模應(yīng)用程序(比如大型企業(yè)網(wǎng)、云計(jì)算、Web 2.0 應(yīng)用程序等)中使用 iWARP 時(shí),大量連接的內(nèi)存需求以及 TCP 的流量和可靠性控制將會(huì)導(dǎo)致可擴(kuò)展性和性能相關(guān)的問(wèn)題,并且會(huì)耗費(fèi)很多的內(nèi)存資源。總體來(lái)看,RoCE 在時(shí)延、吞吐量和 CPU 開(kāi)銷(xiāo)方面明顯優(yōu)于 iWARP。此外,RoCE 規(guī)范中定義了多播,而當(dāng)前的 iWARP 規(guī)范沒(méi)有定義如何執(zhí)行多播 RDMA。
需要注意的是,雖然存在軟件實(shí)現(xiàn)的 RoCE 和 iWARP,但是真正商用時(shí)上述幾種協(xié)議都需要專(zhuān)門(mén)的硬件(網(wǎng)卡)支持。本書(shū)中測(cè)試和分析代碼時(shí)所使用的 RDMA 網(wǎng)卡都為支持RoCEv2 協(xié)議的網(wǎng)卡。
13.4 RDMA 網(wǎng)絡(luò)構(gòu)成
InfiniBand 體系結(jié)構(gòu)定義了組網(wǎng)通信所需的多種設(shè)備:通道適配器(channel adapter)、交換機(jī)(switch)、路由器(router)和子網(wǎng)管理器(subnet manager)。其中子網(wǎng)管理器屬于虛擬設(shè)備,它可以在其他任何一臺(tái)設(shè)備上實(shí)現(xiàn)。圖 13-8 展示了一個(gè)包含所有這些實(shí)體設(shè)備的網(wǎng)絡(luò)。每個(gè)終端(endnode)設(shè)備必須至少有一個(gè)通道適配器(HCA 或 TCA)。一個(gè)子網(wǎng)中至少有一個(gè)子網(wǎng)管理器用于配置和維護(hù)鏈路。所有的通道適配器和交換機(jī)必須包含子網(wǎng)管理代理(subnet management agent,SMA),用于處理與子網(wǎng)管理器的通信。
除了子網(wǎng)管理器,RoCE 類(lèi)型的網(wǎng)絡(luò)中也需要上述這些組件。
主機(jī)通道適配器(host channel adapter,HCA)
HCA 即本書(shū)中經(jīng)常提及的安裝在主機(jī)上的 RDMA 網(wǎng)卡,用于將一個(gè)主機(jī)設(shè)備連接到一個(gè) RDMA 網(wǎng)絡(luò)上。
一個(gè) HCA 可以有多個(gè)物理端口(port),每個(gè)端口有自己的本地標(biāo)識(shí)符(local identifier,LID)或 LID 范圍。另外,每個(gè)端口還有自己的發(fā)送和接收緩存(buffer),因此所有端口可以并行發(fā)送和接收。
子網(wǎng)管理器為 HCA 的每一個(gè)物理端口配置子網(wǎng)內(nèi)的本地地址,即 LID。HCA 中的子網(wǎng)管理代理和子網(wǎng)管理器通信,共同實(shí)現(xiàn)子網(wǎng)管理功能。
廠(chǎng)商會(huì)給每一個(gè) HCA 分配獨(dú)一無(wú)二的標(biāo)識(shí)符,稱(chēng)為 GUID(globally unique identifier)。子網(wǎng)管理器分配給 HCA 的 LID 并不是永久的(斷電重啟后可能會(huì)變),所以 GUID 就成了永久識(shí)別某一個(gè) HCA 的主要標(biāo)識(shí)符。另外,廠(chǎng)商還給每一個(gè)端口分配了一個(gè)端口 GUID。
HCA 支持 InfiniBand 定義的所有軟件 Verbs。Verbs 是一種抽象表示,它定義了客戶(hù)端軟件和 HCA 功能之間所需的接口。Verbs 不直接指定操作系統(tǒng)的應(yīng)用程序編程接口(API),而是定義了一系列操作,提供給操作系統(tǒng)供應(yīng)商開(kāi)發(fā)相應(yīng)的 API。
目標(biāo)通道適配器(target channel adapter,TCA)
TCA 為 I/O 設(shè)備(比如硬盤(pán)控制器)提供其到 RDMA 網(wǎng)絡(luò)的連接,支持每個(gè)設(shè)備的特定操作所需的 HCA 功能子集。
子網(wǎng)管理器(subnet manager)
InfiniBand 子網(wǎng)管理器為連接到 InfiniBand 網(wǎng)絡(luò)的每個(gè)端口分配 LID,并基于分配的 LID建立路由表。子網(wǎng)管理器屬于軟件定義網(wǎng)絡(luò)(SDN)的概念,它消除了互連的復(fù)雜性,支持創(chuàng)建非常大規(guī)模的計(jì)算和存儲(chǔ)基礎(chǔ)設(shè)施。子網(wǎng)管理器配置本地子網(wǎng)并確保其持續(xù)運(yùn)行。每個(gè)子網(wǎng)中必須至少有一個(gè)子網(wǎng)管理器,用于管理所有交換機(jī)和路由器的配置,并在鏈路斷開(kāi)或出現(xiàn)新鏈路時(shí)重新配置子網(wǎng)。
子網(wǎng)管理器可以位于子網(wǎng)中的任何設(shè)備內(nèi),它通過(guò)與每臺(tái)設(shè)備上的子網(wǎng)管理代理通訊來(lái)進(jìn)行工作。一個(gè)子網(wǎng)中可以有多個(gè)子網(wǎng)管理器,但只能有一個(gè)子網(wǎng)管理器處于活動(dòng)狀態(tài)。不在活動(dòng)狀態(tài)的子網(wǎng)管理器(即備用子網(wǎng)管理器),會(huì)同步保存處于活動(dòng)狀態(tài)的子網(wǎng)管理器轉(zhuǎn)發(fā)的信息副本,并驗(yàn)證活動(dòng)狀態(tài)的子網(wǎng)管理器是否仍在運(yùn)行。如果處于活動(dòng)狀態(tài)的子網(wǎng)管理器停機(jī)了,備用子網(wǎng)管理器將接管它的工作,以確保整個(gè)子網(wǎng)不會(huì)停擺。
在 RoCE 類(lèi)型的網(wǎng)絡(luò)中,不存在子網(wǎng)管理器。
交換機(jī)(switch)
InfiniBand 交換機(jī)在概念上類(lèi)似于標(biāo)準(zhǔn)以太網(wǎng)交換機(jī),但其設(shè)計(jì)旨在滿(mǎn)足 InfiniBand 的性能要求。它們實(shí)現(xiàn) InfiniBand 鏈路層的流量控制以防止丟包,有避免阻塞和自適應(yīng)路由的功能,并支持高級(jí)服務(wù)質(zhì)量(QoS)。許多交換機(jī)包含了子網(wǎng)管理器的功能。交換機(jī)包含多個(gè)端口,并根據(jù)協(xié)議第二層本地路由報(bào)頭中包含的 LID,將數(shù)據(jù)包從一個(gè)端口轉(zhuǎn)發(fā)到另一個(gè)端口。交換機(jī)只會(huì)管理和轉(zhuǎn)發(fā)數(shù)據(jù)包,不會(huì)消耗或產(chǎn)生數(shù)據(jù)包。與通道適配器(HCA 和 TCA)一樣,交換機(jī)必須包含子網(wǎng)管理代理功能,以處理子網(wǎng)管理報(bào)文。交換機(jī)可以被配置為轉(zhuǎn)發(fā)單播數(shù)據(jù)包(到單個(gè)設(shè)備)或多播數(shù)據(jù)包(到多個(gè)設(shè)備)。
RoCE 類(lèi)型的網(wǎng)絡(luò)中使用的是以太網(wǎng)交換機(jī)。
路由器(router)
InfiniBand 路由器將數(shù)據(jù)包從一個(gè)子網(wǎng)轉(zhuǎn)發(fā)到另一個(gè)子網(wǎng),而不消耗或產(chǎn)生數(shù)據(jù)包。與交換機(jī)不同,路由器根據(jù)全局路由報(bào)頭(global route header,GRH)中包含的 IPv6 網(wǎng)絡(luò)層地址來(lái)轉(zhuǎn)發(fā)數(shù)據(jù)包。在將數(shù)據(jù)包發(fā)送到下一個(gè)子網(wǎng)中時(shí),路由器會(huì)按照目標(biāo)子網(wǎng)中合適的 LID 來(lái)修改數(shù)據(jù)包中的本地路由報(bào)頭(local route header,LRH),重新組裝每個(gè)數(shù)據(jù)包。
路由對(duì)終端來(lái)說(shuō)并不是透明的,因?yàn)榻K端發(fā)包時(shí)必須指定路由器的 LID 和最終目標(biāo)的GID。
每一個(gè)子網(wǎng)都有獨(dú)一無(wú)二的子網(wǎng) ID,稱(chēng)為子網(wǎng)前綴。子網(wǎng)管理員會(huì)把這個(gè)子網(wǎng)前綴賦值給這個(gè)子網(wǎng)中所有的端口(包含在端口的 PortInfo 屬性中)。這個(gè)子網(wǎng)前綴和端口的 GUID結(jié)合,就成了端口的 GID。端口也可以有其他的 GID。
從路由器的角度看,GID 中的子網(wǎng)前綴部分就代表了穿過(guò)路由器的路徑。路由器依據(jù)數(shù)據(jù)包的目的 GID 和轉(zhuǎn)發(fā)表來(lái)決定把數(shù)據(jù)包轉(zhuǎn)發(fā)到哪個(gè)或哪些端口。
RoCE 類(lèi)型的網(wǎng)絡(luò)中使用的是以太網(wǎng)路由器。
13.5 LID 和 GID
從功能上看,LID(local identifier)和 GID(globally identifier)的概念類(lèi)似于“以太網(wǎng)和IP 網(wǎng)”中的 MAC 和 IP,分別用于子網(wǎng)內(nèi)的目標(biāo)尋址和子網(wǎng)間的目標(biāo)尋址。
根據(jù) InfiniBand 協(xié)議,兩臺(tái)設(shè)備間建立連接時(shí),需要知道對(duì)方的 QP 號(hào)和端口,其中對(duì)端口的識(shí)別根據(jù) LID 和 GID(后者可選)進(jìn)行。
13.5.1 LID
InfiniBand 定義的 LID 是一個(gè) 16 位的標(biāo)識(shí)符。LID 有以下特征。? 由子網(wǎng)管理員分配,子網(wǎng)內(nèi)唯一,不可用于子網(wǎng)間路由。
? LID 作為一種網(wǎng)絡(luò)地址,分為預(yù)留、單播和多播地址段。
? 數(shù)據(jù)包中的本地路由報(bào)頭(local route header,LRH)中包含了 LID。
? 源 LID 指的是第一個(gè)將數(shù)據(jù)包插入子網(wǎng)的終端端口的 LID。
? 一個(gè)單播型的目的 LID 適用于某一個(gè)目的終端端口。一個(gè)多播型的目的 LID 適用于一個(gè)子網(wǎng)中某個(gè)多播組里的一系列目的終端端口。
? 如果最終的目的端口不在這個(gè)子網(wǎng)內(nèi),數(shù)據(jù)包中的目的 LID 指向的是,負(fù)責(zé)轉(zhuǎn)發(fā)這個(gè)數(shù)據(jù)包到下一跳的路由器的某個(gè)端口。
? 一個(gè)終端端口在連接到子網(wǎng)后,收到的數(shù)據(jù)包可能經(jīng)過(guò)了子網(wǎng)內(nèi)的多條物理路徑。例如,圖 13-9 中交換機(jī)之間相同類(lèi)型的連紅表示一條可能的路徑,這樣的路徑共有 4條。每條路徑可以被一個(gè)或多個(gè)物理 LID 標(biāo)識(shí)。為了降低 HCA 的多路徑操作的復(fù)雜度,每個(gè)物理端口應(yīng)分配一個(gè)基本 LID 和一個(gè) LMC。LMC 是一個(gè) 3 位的域,代表2LMC條路徑。圖 13-9 中,HCA A 和 HCA C 之間存在多條路徑。如果 HCA A 被分配了基本 LID 4,LMC =2,則其 LID 的范圍是 4、5、6、7。如果 HCA C 被分配了基本LID 8,LMC=2,則其 LID 的范圍就是 8、9、10、11。
? LID 的分配規(guī)則:LID 0x0000 無(wú)效;LID 0xFFFF 分配給接收數(shù)據(jù)包的終端端口的 QP0;0x0001 和 0xBFFF 之間為單播 LID;0xC000 和 0xFFFE 之間為多播 LID。
對(duì)于 RoCE 類(lèi)型的網(wǎng)絡(luò),LID 無(wú)效,所有端口的 LID 都為 0x0000。
13.5.2 GID
GID 是一種 128 位的單播或多播標(biāo)識(shí)符,用于標(biāo)識(shí)端口或多播組。
GUID(globally unique identifier)是全局唯一的 EUI-64 標(biāo)識(shí)符,共 64 位。其中的 24 位表示廠(chǎng)商 ID,另外 40 位是擴(kuò)展標(biāo)識(shí)符,由生產(chǎn)設(shè)備的廠(chǎng)商來(lái)分配。
GID 有以下特征。
? 每個(gè)終端端口必須被分配至少一個(gè)單播 GID。第一個(gè)單播 GID 在創(chuàng)建時(shí)必須使用廠(chǎng)商分配的 EUI-64 標(biāo)識(shí)符。此 GID 稱(chēng)為 0 號(hào) GID,格式見(jiàn)圖 13-10(a)或圖 13-10(b)。
? 默認(rèn)的 GID 前綴為 0xFE80::0,共 64 位。使用默認(rèn) GID 前綴和廠(chǎng)商/子網(wǎng)管理器分配的 EUI-64 可以組成 128 位的 GID,使用這種 GID 封裝的數(shù)據(jù)包必須被終端接納。一個(gè)數(shù)據(jù)包的全局路由報(bào)頭(GRH)中如果有這種前綴的目的 GID,則路由器不能將其轉(zhuǎn)發(fā),也就是必須限制在本地子網(wǎng)內(nèi)處理。
? 一個(gè)子網(wǎng) GID 必須使用下列一個(gè)或多個(gè)規(guī)則來(lái)創(chuàng)建。
規(guī)則 1。把默認(rèn) GID 前綴和廠(chǎng)商給終端端口分配的 EUI-64 標(biāo)識(shí)符連接起來(lái)。這個(gè) GID 就是默認(rèn)的 GID。
規(guī)則 2。把子網(wǎng)管理器分配的 64 位的 GID 前綴和廠(chǎng)商給終端端口分配的 EUI-64標(biāo)識(shí)符連接起來(lái)。
規(guī)則 3。子網(wǎng)管理器分配的 GID。子網(wǎng)管理器把默認(rèn)或者分配的 GID 前綴和一組本地分配的 EUI-64 值連接起來(lái)。這種 GID 稱(chēng)為 1 號(hào)或更大號(hào)碼的 GID。每個(gè)終端端口必須用規(guī)則 1 分配至少一個(gè)單播 GID。其他 GID 可用規(guī)則 2 或規(guī)則 3分配。注意,一個(gè)子網(wǎng)在某個(gè)時(shí)間點(diǎn)只能有一個(gè)分配的(非默認(rèn)的)GID 前綴。
? 通道適配器、交換機(jī)或路由器上的任何 QP,都可以用默認(rèn) GID 前綴加上為這個(gè) QP分配的 GID 來(lái)尋址。這使得一個(gè)子網(wǎng)可以在不中斷已有通信會(huì)話(huà)的情況下,從默認(rèn)GID 前綴狀態(tài)轉(zhuǎn)換為托管狀態(tài)。
? 每個(gè)終端端口可以支持的單播 GID 的最大數(shù)量(N)取決于具體實(shí)現(xiàn)。子網(wǎng)管理器可以分配 N?1 個(gè)額外的單播 GID,這 N?1 個(gè) GID 中的每一個(gè)都是通過(guò)將一個(gè)子網(wǎng)管理器分配的 EUI-64 標(biāo)識(shí)符與 GID 前綴連接起來(lái)創(chuàng)建的。
? 單播 GID 地址 0000:0 是保留的,稱(chēng)為保留 GID。不得將其分配給任何終端端口,也不得將其用作目的地址或用在 GRH 中。
? 單播 GID 地址 0000:1 稱(chēng)為環(huán)回 GID,僅由原始(raw)IPv6 服務(wù)使用,不由InfiniBand 傳輸服務(wù)使用。不得將其分配到終端端口或出現(xiàn)在任何 InfiniBand 數(shù)據(jù)包中。
? 單播 GID 子網(wǎng)前綴應(yīng)限于 GID 地址空間的高 64 位。子網(wǎng)前綴的位的數(shù)量可能會(huì)進(jìn)一步受到填充(filler)和作用域(scope)位的限制,見(jiàn)下文分析。
? 單播 GID 的低 64 位不能進(jìn)一步劃分子網(wǎng)。
? 單播 GID 的低 64 位在子網(wǎng)中是唯一的。
? GRH 中應(yīng)包含有效的源 GID 和目的 GID。
? 單播 GID 的范圍包括以下類(lèi)型。
本地連接型(link-local)。這種單播 GID 使用默認(rèn)的 GID 前綴(0xFE80::0),只在子網(wǎng)內(nèi)使用。如果數(shù)據(jù)包中有此類(lèi) GID,無(wú)論是作為源 GID 還是目的 GID,路由器都不能把數(shù)據(jù)包轉(zhuǎn)發(fā)到子網(wǎng)外。本地連接型 GID 的格式如圖 13-10(a)所示。
本地區(qū)域型(site-local)。這種單播 GID 在一組子網(wǎng)(比如一個(gè)數(shù)據(jù)中心的多個(gè)子網(wǎng))組成的區(qū)域內(nèi)是唯一的,但不一定是全局唯一。路由器不能把帶有這種源 GID或目的 GID 的數(shù)據(jù)包轉(zhuǎn)發(fā)到區(qū)域外。本地區(qū)域型 GID 的格式如圖 13-10(b)所示。
全局唯一型(global)。這種單播 GID 是帶有全局前綴的,即路由器可以使用此 GID在整個(gè)企業(yè)網(wǎng)或互聯(lián)網(wǎng)上路由數(shù)據(jù)包。全局唯一型 GID 的格式如圖 13-10(c)所示。
多播 GID(MGID)用于識(shí)別多播組。多播組中的所有成員,除了具有相同的 MGID,還必須共享相同的 P_key 和 Q_key。
? 多播 GID 的格式如圖 13-11 所示。
起始的 11111111 表示這是多播 GID。
標(biāo)記(Flag)字段有 4 個(gè) 1 位的標(biāo)記,格式為 000T,目前保留前 3 個(gè)標(biāo)記,并定為 0。如果 T 為 0,表示這是一個(gè)永久分配的(即眾所周知的)多播 GID;如果 T 為 1,表示這是一個(gè)非永久分配(即暫時(shí))的多播 GID。
Scope(作用域)字段也有 4 位,用于限制多播組的作用域。如果 Scope 字段的值為 2,表示此多播 GID 僅限在子網(wǎng)內(nèi)使用;如果 Scope 字段的值為 5,表示此多播 GID 僅限在由幾個(gè)子網(wǎng)組成的一個(gè)區(qū)域中使用;如果 Scope 字段的值為 8,表示此多播 GID 可以在一個(gè)本地組織中使用;如果 Scope 字段的值為 0xE,表示此多播 GID 可以全局使用。
? 一個(gè)終端端口可以加入 0、1 或多個(gè)多播組,也就是說(shuō),一個(gè)終端端口可以被分配 0、1 或多個(gè)多播 GID。
? 多播 GID 不能作為源 GID 出現(xiàn)在全局路由報(bào)頭中。
? 多播 GID FF02000:1 是一個(gè)本地連接型的多播 GID,路由器不能把以這種 GID為目的 GID 的數(shù)據(jù)包轉(zhuǎn)發(fā)到子網(wǎng)外。此 GID 在作為 GRH 內(nèi)的目的地址時(shí),被用來(lái)與參與所有通道適配器多播組的一組 QP 通信。所有通道適配器多播組包括希望參與該多播組的所有通道適配器,和增強(qiáng)型交換機(jī)的 0 號(hào)端口。所有通道適配器多播組用于向能夠參與多播操作的所有通道適配器(必須共享相同的 MGID、P_key 和 Q_key)實(shí)現(xiàn)廣播服務(wù)。
審核編輯:湯梓紅
-
cpu
+關(guān)注
關(guān)注
68文章
10702瀏覽量
209424 -
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7391瀏覽量
88218 -
路由器
+關(guān)注
關(guān)注
22文章
3643瀏覽量
112823 -
TCP
+關(guān)注
關(guān)注
8文章
1324瀏覽量
78759 -
RDMA
+關(guān)注
關(guān)注
0文章
74瀏覽量
8896
原文標(biāo)題:好書(shū)連載|RDMA技術(shù)簡(jiǎn)介(4)
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論