1. RDMA基本知識
RDMA是一種使一臺計算機可以直接將數據從內存通過網絡傳送到另一臺計算機內存中的技術,其流程是首先將數據通過DMA方式拷貝到NIC(網卡),再通過網絡傳輸到遠端NIC,然後直接到達遠端內存,而無需操作系統多次在緩衝區指間拷貝數據和CPU參與,因而能騰出總線空間和 CPU週期用於改進應用系統性能,從而減少對帶寬和處理器開銷的需要,顯著降低了時延。RDMA的核心優勢是內核旁路和零拷貝技術。
下圖給出了RDMA與TCP/IP的對比,這幅圖清楚地表明瞭RDMA的零拷貝特性,二者的詳細對比後面給出。
下圖給出了RDMA的內核旁路特性:
目前,有三種支持RDMA的技術:IB(InfiniBand)、RoCE(RDMA over Converged Ethernet)、以太網iWARP(the Internet Wide Area RDMA Protocol)。這三種技術使用同一API,但它們有着不同的物理層和鏈路層。
IB: 原生支持RDMA,它從硬件級別保證可靠傳輸;
iWARP: 基於 以太網之上的TCP or SCTP 做 RDMA,利用 TCP or SCTP 達到可靠傳輸,對網絡設備的要求比較少;
RoCE: 基於以太網做 RDMA,消耗的資源比 iWARP 少,支持的特性比 iWARP 多,需要額外做可靠傳輸。
在以太網解決方案中,RoCE相對於iWARP來說有着明顯的優勢,這些優勢體現在延時、吞吐率和 CPU負載。二者對比:
RoCE |
UDP |
IP |
以太網 |
iWARP |
TCP(無TCP/IP流量控制和管理) |
IP |
以太網 |
1.1 通信接口
Mellanox公司提供了兩個動態鏈接庫ib_verbs和rdma_cm(連接管理器庫,包含了對ib_verbs的封裝),通過verbs API 對硬件進行訪問。下面描述被暴露在操作系統編程接口的功能。
爲了執行RDMA操作,首選需要建立與遠程主機的連接和適當的認證。實現這些的機制是隊列對(QP) 。與標準的IP協議棧類似,一個QP大概等同於一個套接字(socket)。QP需要在連接兩端進行初始化。連接管理器(CM)用來在QP建立之前進行QP信息的交換。一旦一個QP建立起來,verbs API就可以用來執行RDMA讀/寫和原子操作,與套接字的讀/寫類似的連續收/發操作也能執行。
QP中的傳輸使用Work Request(WR)進行,而非數據流的形式。應用程序在Work Request中指定收發數據的地址(RDMA對數據存放的地址有要求,這些地址在使用前,必須註冊到IB驅動中)。除此之外,QP的Send Queue和Receive Queue還需要配備一個Completion Queue,這個Completion Queue用來保存WR處理結果(發送或者收到),WR信息可以從Completion Queue中的Work Completion(WC)中獲得。
進一步講,WR還分爲Receive WR和Send WR,Receive WR用來指定另一端發過來的數據存放位置,Send WR則是實際的數據發送請求。在主機中註冊的內存類型(ib_access_flags)決定了遠端client操作主機內存的方式。如果具有Remote Access權限,則可以直接在Send WR中指定待操作的地址(此爲RDMA Read/Write操作),主機無需參與操作;否則Send WR對遠端地址沒有控制權,即發送的數據的存放地址不由Send WR決定(只能Send/Recv操作),主機需要處理請求。使用哪種操作方式可以在ib_wr_opcode中指定。
1.1.1 傳輸操作
1) 發送/帶立即數(Immediate)的發送
發送操作可以把數據發送到遠程QP的接收隊列裏。接收端必須已經事先註冊好了用來接收數據的緩衝區。發送者無法控制數據在遠程主機中的放置位置。在特定設置下,一個4字節的立即數可以和數據緩衝一起被傳送。這個立即數發送到接收端是作爲接收的通知,不包含在數據緩衝之中。
2) 接收
這是與發送操作相對的操作。接收主機被告知接收到數據緩衝區,還可能附帶一個立即數。接收端應用程序負責接收緩衝區的維護和註冊。
3) RDMA讀
從遠程主機讀取部分內存。調用者指定遠程虛擬地址,像本地內存地址一樣用來拷貝。在執行RDMA操作之前,遠程主機必須提供適當的權限來訪問它的內存。一旦權限設置完成,RDMA讀操作就可以在對遠程主機沒有任何通知的條件下執行。不管是RDMA讀還是RDMA寫,遠程主機都不會意識到操作正在執行(除了權限和相關資源的準備操作)。
4) RDMA寫/帶立即數的RDMA寫
與RDMA讀類似,只是數據寫到遠程主機中。RDMA寫操作在執行時不通知遠程主機。然而,帶立即數的 RDMA寫操作會將立即數通知給遠程主機。
5) 原子取和加/原子比較和交換
這些是RDMA操作的原子操作擴展。原子取和加操作原子性地將特定虛擬地址中的數加上特定的值。被加之前的數返回給調用者。原子比較和交換操作原子性地將特定虛擬地址中的數與另一個特定的數加比,如果它們相等,那麼另一個特定的數將會被存在上述的特定虛擬地址中。
1.1.2 傳輸模式
在建立一個QP的時候,有幾種不同的傳輸模式可供選擇。每種模式中可用的操作如下表所示。 RD操作在此API中不支持。
- 可靠連接(RC)
一個QP只和一個另外的QP相連。消息通過一個QP的發送隊列可靠地傳輸到另一個QP的接收隊列。數據包按序交付。RC連接很類似於TCP連接。
- 不可靠連接(UC)
一個QP只和一個另外的QP相連。連接是不可靠的,所以數據包有可能會丟失。傳輸層不會出錯的消息進行重傳,錯誤處理必須由高層的協議來進行。
- 不可靠數據報(UD)
一個QP可以和其它任意的UD QP進行數據傳輸和單包數據的接收。不保證按序性和交付性。交付的數據包可能被接收端丟棄。支持多播消息(一對多)。連接很類似於UDP連接。
RDMA read/write 稱爲one-sided操作(也叫server-bypass),RDMA Send/Recv 稱爲two-sided操作(也叫server-reply,因爲它是request-reply模式,需要reply)。one-sided操作相比於Two-sided的好處是釋放了主機端的CPU,降低了傳輸的Latency。因爲one-sided方式在主機端無需生成WQE,也就不需要處理Work Completion。
下組圖給出了一次RDMA Send/Recv的示意圖:
1.2 關鍵概念
1)發送請求(SR)
SR定義了數據的發送量、從哪裏、發送方式、是否通過RDMA、到哪裏。
2)接收請求(RR)
RR定義用來放置通過非RDMA操作接收到的數據的緩衝區。如沒有定義緩衝區,並且有個傳輸者 嘗試執行一個發送操作或者一個帶立即數的RDMA寫操作,那麼接收者將會發出接收未就緒的錯誤(RNR)。
3)完成隊列(CQ)
完成隊列包含了發送到工作隊列(WQ)中已完成的工作請求(WR)。每次完成表示一個特定的 WR執行完畢(包括成功完成的WR和不成功完成的WR)。完成隊列是一個用來告知應用程序已結束的工作請求的信息(狀態、操作碼、大小、來源)的機制。CQ有n個完成隊列實體(CQE)。CQE的數量在CQ創建的時候被指定。當一個CQP被輪詢到,它就從CQ中被刪除。CQ是一個CQE的先進選出(FIFO)隊列。CQ能服務於發送隊列、接收隊列或者同時服務於這兩種隊列。多個不同QP中的工作請求(WQ)可聯繫到同一個CQ上。
4)內存註冊(MR)
內存註冊機制允許應用程序申請一些連續的虛擬內存空間或者連續的物理內存空間,將這些內存空間提供給網絡適配器作爲虛擬的連續緩衝區,緩衝區使用虛擬地址。內存註冊進程鎖定了內存頁。(爲了防止頁被替換出去,同時保持物理和虛擬內存的映射)在註冊期間,操作系統檢查被註冊塊的許可。註冊進程將虛擬地址與物理地址的映射表寫入網絡適配器。在註冊內存時,對應內存區域的權限會被設定。權限包括本地寫、遠程讀、遠程寫、原子操作、綁定。每個內存註冊(MR)有一個遠程的和一個本地的標誌(r_key,l_key)。本地標誌被本地的HCA 用來訪問本地內存,例如在接收數據操作的期間。遠程標誌提供給遠程HCA用來在RDMA操作期間允許遠程進程訪問本地的系統內存。同一內存緩衝區可以被多次註冊(甚至設置不同的操作權限),並且每次註冊都會生成不同的標誌。
5)內存窗口(MW)
內存窗口使應用程序對來自遠程的對本地的內存訪問有更靈活的控制。內存窗口(MW)作用於以下應用場景:
• 想動態地授予和收回已註冊緩衝區的遠程訪問權限,這種方式相比較與將緩衝區取消註冊之後 再註冊或者重註冊,有些更低的性能損耗代價。
• 想爲不同的遠程代理授予不同的遠程訪問權限,或者在一個已註冊的緩衝區中的不同範圍內授予 那些權限。
內存窗口和內存註冊之前的關聯操作稱爲綁定。不同的MW可以作用於同一個MR(即使有着不同的訪問權限)。
6)地址向量(Address Vector)
地址向量用來描述本地節點到遠程節點的路由。在每個UC/RC的QP中,都有一個地址向量存在於QP的上下文中。在UD的QP中,每個提交的發送請求(SR)中都應該定義地址向量。
7)保護域(PD)
一種集合,它的內部元素只能與集合內部的其它元素相互作用。這些元素可以是AH,QP,MR和SRQ。保護域用來隊列對(QP)與內存註冊和內存窗口想關聯,這是一種授權和管理網絡適配器對主機系統 內存的訪問。PD也用來將基於不可靠數據報(UD)的QP關聯到地址處理(AH),這是一種對UD目的端的訪問控制。
8)異步事件 網絡適配器可能會發送異步事件來通知子網管理器(SW)系統中發生的事件。有兩種異步事件:
附屬事件:在私有對象(CQ,QP,SRQ)中發生的事件。這些事件會被髮送到特定的進程。
非附屬事件:在全局對象(網絡適配器,端口錯誤)中發生的事件。這些事件會被髮送到所有進程 。
9)散聚表(Scatter Gather List) 用分散聚合元素來分散和聚合數據。這些元素包括:地址:本地數據緩衝區的地址,緩衝區是數據聚合的終點或者是數據分散的源頭。 大小:數據的大小會寫到這個地址或者從這個地址讀取。 L_key:註冊到這個緩衝區的MR的本地標誌。
10)輪詢(Polling) 輪詢CQ中的完成信息是爲了獲取已提交的WR(發送或者接收)的詳細信息。如果我們在WR中發現一個異常狀態的完成,接下來的完成都會異常(同時WQ會被移至錯誤狀態)。每個沒有完成(被輪詢到)的WR都屬於待處理狀態。只有在WR完成之後,發送/接收緩衝區纔可能被使用/再使用/釋放。應該經常檢測完成狀態。當一個CQE被輪詢,那麼它就被從CQ中移除。輪詢通過 ibv_poll_cq 操作來實現。
1.3 RDMA與TCP/IP對比
1) RDMA通信是完全異步的,而TCP/IP的原始socket通信是同步的,異步通信是藉助額外框架(或擴展)實現的,如CSocket、WSASocket。
2) TCP/IP是一種面向字節流的傳輸方式 ,信息以字節的形式在套接字應用程序之間傳遞。而RDMA是基於消息式的。TCP/IP本身是不可靠的(傳輸過程中數據可能丟失或者失序),但是它利用傳輸控制協議(TCP)來實現可靠性機制。TCP/IP在所有操作中都需要操作系統的干預,包括網絡兩終端結點的緩衝區拷貝。在面向字節流的網絡中,沒有消息的邊界概念。當一個應用想要發送一個數據包, 操作系統把這些字節數據放入內存中屬於操作系統的一個匿名緩衝區,當數據傳輸完畢時,操作系統把它緩衝區中的數據拷貝到應用程序的接收緩衝區。這個過程在每個包到達時都會重複執行, 直到整個字節流被接收到。TCP負責將任何因擁塞導致的丟包進行重發。
在IB中,一個完整的消息被直接發送到一個應用程序。一旦一個應用程序請求了RDMA的讀或寫傳輸, IB的硬件將需要傳輸的數據按照需要分割成一些數據包,這些數據包的大小取決於網絡路徑的最大傳輸單元。這些數據包通過IB網絡,被直接發送到接收程序的虛擬內存中,並在其中被組合爲一個完整的消息。當整個消息都到達時,接收程序會接收到提示。這樣,發送程序和接收程序在直到整個消息被髮送到達接收程序的緩衝區之前都不會被打擾中斷。
3) R DMA利用旁路和零拷貝技術提供了低延遲的特性,同時,減少了CPU佔用,減少了內存帶寬瓶頸,提供了很高的帶寬利用率。這得益於RDMA消息服務呈現給應用的方式,和底層用來發送和傳遞這些消息的技術。RDMA提供了基於IO的通道。這種通道允許一個應用程序通過RDMA設備對遠程的虛擬內存進行直接的讀寫。
在傳統的socket網絡中,應用程序要向操作系統申請使用網絡資源時,要通過特定的API來管理程序的相關行爲。但是,RDMA使用操作系統僅僅建設一個通道,然後就可以在不需要操作系統的干預下,應用程序之間就能夠進行直接的消息傳遞。消息可以是RDMA讀或寫操作,也可以是發送/接收操作。
2 實驗室測試結果
實驗室現有平臺:
處理器 |
Intel(R) Xeon(R) CPU E5-2650 (4 cores, 2.00GHz) |
操作系統 |
Ubuntu 12.04 |
PCI-e插槽 |
PCI-express 3.0 x8 |
內存 |
16GB DRAM |
IB設備類型 |
Mellanox MT27500 Family [ConnectX-3] |
ConnectX-3介紹
類型 |
CA(channel Aapter) |
傳輸速率 |
56 Gb/sec (4x FDR) |
鏈路層 |
infiniband |
注:FDR 十四倍速
測試性能
峯值帶寬 |
6.1GB/s |
平均延遲 |
~4μs |
峯值消息速率 |
6 million msg/sec |
注:此測試在單線程情況下執行,測試了四種原語(send/recv、write、read),兩種連接(RC、UD)。在多線程(每個主機2~4個線程)情況下,帶寬會有一點點提高,約6.2 GB/s,但延遲會大幅提高,會較單線程高一個數量級,這也符合預期,多線程會帶來上下文切換開銷。
3 編程接口設計
編程接口設計需要兼顧上層應用和底層通信原語。
3.1 上層應用直接調用通信原語
上層應用直接調用通信原語,相對而言,調用路徑更短,理論性能會更高。而且對於不同應用的特點可以調用不同的原語。但是對於大規模併發操作,需要一個管理程序做全局調度。當不同應用,各自爲戰,無法按照全局特性進行調度,比如在分佈式文件系統的使用過程中,客戶端同時產生了大量讀請求和寫請求,調用通信原語去遠程服務器上讀取、寫入數據,這些請求會封裝成WR,放到請求隊列裏,可能是無序的。事實上,在特定場景下,讀請求應該比寫請求優先級高,有了一個獨立的請求重排、調度會更好。
同時,主機(包括客戶端和服務器)需要有一個獨立於應用的通信資源管理模塊,比如面對大量連接的資源池(QP,類似於TCP/IP裏的Socket)。首先需要實現一個連接管理的通信框架,支持多線程調度、多QP傳輸、以及大量RDMA傳輸相關資源(如QP、CQ、channel等)的管理,包括但不限於以上功能。由於RDMA傳輸是異步的,不需要像同步的socket編程那樣自己來實現一個異步通信框架,來提高性能。
在應用負載低的情況下,更短的協議路徑更有效,但面大規模負載,分層設計會逐層減輕位於下層的模塊的壓力,同時也方便進行隔離與解耦,這時扁平化的設計不一定能帶來最佳效果,當然,這也需要後續測試來根據不同應用場景做決定。
另一方面,由於RDMA傳輸特點鮮明,one-sided RDMA和two-sided RDMA各有特點,另外,還有atomic原語。比如,在面對高併發場景時,在需要確保操作是線程安全的(特別是,在多生產者的環境下,更新下一個可用的序列號)場景,我們可以使用atomic原語(Compare And Swap/Set), 它的工作方式有點像樂觀鎖——CPU去更新一個值,但如果想改的值不再是原來的值,操作就失敗,因爲很明顯,有其它操作先改變了這個值。這個原語可以簡化我們的操作,如果按照傳統的爲保證線程安全,先獲取鎖,再更新值,至少會有兩次RDMA操作(獲取鎖並確認,一個round trip;進行修改操作並確認,一個round trip;算釋放鎖的話還要再加一次)。
在讀取數據時,選用RDMA read更好,性能更高,但不可避免地遇到讀寫競爭,導致客戶端讀到的服務器端的數據是不正確的。也可以採用增加自驗證數據結構的方式,增加對數據的校驗(指紋)。讀的時候採取樂觀鎖的方式,即先用RDMA read讀取數據(包含校驗),然後等拉取過來之後算校驗,如果校驗不符,說明遠端有讀寫競爭,數據不合法,所以將這個數據直接丟棄,過一段時間後重新取數據。如果校驗正確的話,就只有一次RDMA read 操作,延遲低很多。
所以,通信原語的選擇應該對應用(上層接口)開放,以便根據情況來選擇最合適的。
3.2 RPC
RPC 實現了對基礎通信原語的封裝,更具有通用性和可移植性。RPC框架包括基本的通訊組件、協議編解碼組件(序列化和反序列化網絡傳輸的數據,主要用於跨語言支持)、服務註冊調用組件等。
RPC具有的特點有
- 簡單:與基於RDMA原語構建的系統相比,RPC減少了設計分佈式數據存儲和事務所需的軟件複雜性,RPC與通訊層和應用邏輯層都不是緊耦合,使用RPC構建系統簡單、靈活。
- 可移植性:由於不與應用耦合,它可以簡單地移植到其他應用,同時增加功能非常方便,如增加負載均衡,優先級調度隊列。
- 可擴展性:RPC接口能很好地服務大規模分佈式應用,這在許多許多成熟系統裏都得到印證。當然,這也要求基於RDMA實現的RPC框架更健壯。
基於RDMA實現的RPC在面對大規模分佈式應用時,其多增加的一層RPC處理層(相對於應用直接用RDMA)的開銷並相對於其他瓶頸開銷並不大,大規模併發操作的關鍵瓶頸有鎖、上下文切換等。當然,最後需要測試結果來說明。
RPC還可以在服務級提供調度功能。比如讀一個文件是一個服務,它由多個通訊請求組成(發到不同的服務器上,請求不同的塊)。如果相同的讀請求,直接在服務層做請求合併,而不是等到在通訊層發現發送兩個相同的請求到同一個遠程服務器,在通訊請求層做服務合併和調度。RPC層可以增加一個調度粒度,避免了通訊請求層粒度細,給通訊調度層帶來壓力。
總結,綜上所述,現在的編程接口設計層次如下:
上層應用接口 |
RPC(可選) |
連接與資源管理、調度模塊 |
RDMA通訊原語 |
其中,RDMA通訊原語層實現五種不同的原語和三種傳輸類型的C/S或者request-reply的通訊;連接與資源管理、調度模塊負責QP連接和資源分配、調度、管理和釋放等工作,還有包括請求合併等功能。RPC做服務級管理和調度,由於使用這一層的必要性沒有實驗數據的論證,暫時不必要添加。最上層就是面對應用接口和業務邏輯。
附錄 A
術語對照表
術語 |
釋義 |
Access Layer |
操作系統底層構架,用來支持訪問互聯的集羣(VPI,InfiniBand,Ethernet,FCoE). 它包括所有支持上層網絡協議的基本傳輸服務、中間件和管理程序 |
AH(Address Handle) |
在UD QP中,用來描述遠程路徑的對象 |
CA(Channel Adapter) |
一個InfiniBand鏈路的終端設備,它執行傳輸層的功能 |
CI(Channel Interface) |
通過網絡適配器、相關固件和設備驅動的組合,呈現給Verbs 編程用戶的通信管道 |
CM(Communication Manager) |
負責建立、維持、釋放RC和UC QP服務類型連接的體系;服務ID解析協議 確保了使用UD服務的用戶找到支持指定設備的QP;每個終端節點的IB端口都有一個CM. |
Compare & Swap |
通知遠程QP讀取一個64bit的值,將這個值與提供的比較對象值作比較 ,如果相等,那麼就把讀取的這個值替換成QP提供的另一個數值。 |
CQ(Completion Queue) |
一個包含CQE的隊列(先進選出) |
CQE(Completion Queue Entry) |
CQ中的一個記錄,它描述了已完成的WR的信息 (狀態,大小等) |
DMA(Direct Memory Access) |
允許硬件在不經CPU參與的情況下 將數據塊移進和移出內存 |
Fetch & add |
通知遠程QP讀取一個64bit的數值,將它替換爲它和QP提供 的待加數的和。 |
GUID(Globally Unique IDentifier) |
在一個子網中,唯一標誌一個設備或組件的 64bit數字 |
GID(Global IDentifier) |
一個128位的標誌,用來標誌網絡適配器上的一個端口, 路由器上或者組播裏的一個端口;爲了更有效地尋找、通信和路由,IBA在標準IPV6地址的基礎上定義了一些額外的 特性和約束,這就形成了GID。 |
GRH(Global Routing Header) |
用來在子網間傳遞數據包和傳遞組播信息的包頭。 包頭基於IPv6協議 |
Network Adapter |
允許網絡中計算機之間傳遞數據的硬件。 |
Host |
一臺運行着操作系統,並且控制着一個或多個network adapter的計算機。 |
IB |
InfiniBand |
Join operation |
一個IB端口要明確地加入一個多播組,必須向SA發送請求來接收 多播數據包。 |
lkey |
在MR註冊之後接收到的一個數字,它在本地被WR用來標誌內存註冊和 相關權限。 |
LID(Local IDentifier) |
子網管理程序指定給終端節點的一個16位地址。每個LID在它所在的子網中是唯一的。 |
LLE(Low Latency Ethernet) |
在CEE(Converged Enhanced Ethernet聚合加強型以太網)基礎之上的RDMA服務。CEE允許IB在以太網上傳輸。 |
NA(Network Adapter) |
一個網絡鏈接的終端設備,它執行傳輸層功能。 |
MGID(Multicast Group ID) |
MGID唯一標誌一個IB多播組,它由SM管理。SM將每個MGID都關聯一個MLID,並對網絡中的IB交換機 進行編程控制,確保加入多播組的所有端口都能接收到數據包。 |
MR(Memory Region) |
已被註冊爲被允許使用的連續內存緩衝區。爲了使網絡適配器能利用它們,這些緩衝區需要先被 註冊。在註冊期間,一個L_Key和R_Key被創建出來用來關聯相應的註冊緩衝區。 |
MTU(Maximum Transfer Unit) |
端口收發數據包的最大有效負載的數據大小(不包括包頭)限度。 |
MW(Memory Window) |
一個被分配的資源,在與已註冊的內存中一塊特定的區域綁定後,能被遠程直接使用。每個MW都有一個 關聯的窗口句柄、一些使用權限信息和當前的R_Key |
Outstanding Work Request |
工作隊列中沒有被輪詢到已完成的WR |
pkey(Partition key) |
pkey標誌了端口所屬的分區。pkey大概類似於以太網中的VLAN ID。pkey用來指向端口的 pkey表中的一項。SM(subnet manager)將每個端口至少關聯一個pkey |
PD(Protection Domain) |
只有內部成員才能進行交互的域。AH與QP進行交互,MR與WQ進行交互。 |
QP(Queue Pair) |
爲了在網絡中節點之間傳遞數據,將獨立的WQ打包在一起形成的一個配對 (發送隊列和接收隊列)。有三種類型的QP:UD 不可靠數據報,UC 不可靠連接,RC 可靠連接。 |
RC(Reliable Connection) |
基於面向連連接的QP傳輸服務。一個QP與另一個QP相關聯,兩者之間的信息傳輸是可靠的 (具體體現在數據的正確性和順序性) |
RDMA(Remote Direct Memory Access) |
在不需遠程計算機CPU的干預下,對它的內存進行操作。 |
RDMA_CM(Remote Direct Memory Access Communication Manager) |
用來建立可靠性連接和不可靠性數據報傳輸的API。它爲建立連接提供了RDMA傳輸接口。 此API基於套接字,同時又適用於基於QP的語義:信息傳遞必須通過專門的RDMA設備, 並且數據傳輸是基於消息機制。 |
Requestor |
在一個連接中,發起數據傳輸的一端(通過發送一個請求) |
Responder |
在一個連接中,回覆發起者發送的請求命令的的一端。請求命令可能包括 對回覆者內存進行讀或寫的請求,和要求回覆者接收一條信息。 |
rkey |
在MR註冊之後接收到的一個數字,對到來的RDMA操作進行許可認證。 |
RNR(Receiver Not Ready) |
在一個基於RC的QP中,兩端的連接已經存在,但是RR目前不在接收端。 |
RQ(Receive Queue) |
一個用來存儲用戶發送的RR的工作隊列。 |
RR(Receive Request) |
是一個會被髮送到RQ中的WR。它描述了應該把到來的需要寫的數據寫在哪裏。 需要注意的是,一個RDMA寫操作會消耗一個RR。 |
RTR(Ready To Receive) |
一種QP的狀態,它表示某個RR可以被髮送和處理。 |
RTS(Ready To Send) |
一種QP的狀態,它表示某個SR可以被髮送和處理。 |
SA(Subnet Administrator) |
用來查詢和操作子網管理數據的接口。 |
SGE(Scatter/Gather Elements) |
一個結構,指向本地已註冊過的內存塊的一部分或者整塊。結構中的元素包含 內存塊的起始地址、大小和lkey(和它相關的權限信息一起)。 |
S/G Array |
在WR裏,存放S/G元素的元組。根據使用的操作命令,可以將不同緩衝區的數據收集起來, 並將這些數據當成一個單獨的數據流進行發送,或者將一個單獨的數據流切分成許多不同的 緩衝區。 |
SM(Subnet Manager) |
設置和管理子網的體系。它的功能包括:獲知子網的網絡拓撲結構,分配LID, 決定路由策略和設置路由表,一個主的SM或者還有一個從的SM(雙機熱備模式), 初始化子網中交換機的路由表從而在子網中建立網絡通路。 |
SQ(Send Queue) |
用來存儲用戶發送的SR的隊列。 |
SR(Send Request) |
是一個會被髮送到SQ中的WR,描述了需要傳輸的數據有多大、數據的目標位置以及傳輸的方式 (具體的操作碼會確定傳輸方式)。 |
SRQ(Share Receive Queue) |
是一個保存着接收到的信息的WQE隊列,接收到的信息可以來自於任何相關的RC/UC/UD QP. 多個QP可與同一個SRQ關聯。 |
TCA(Target Channel Adapter) |
一個不需要支持verb語法的通道適配器,通常用在I/O設備中。 |
UC(Unreliable Connection) |
基於面向連接的QP傳輸服務,一個QP和另一個QP相聯繫。QP們沒有執行可靠協議,傳輸過程中 信息可能丟失。 |
UD(Unreliable Connection) |
一種QP傳輸服務,消息的以包爲單位。每個UD QP能和子網中其它的UD QP進行數據的接收和發送。 消息在傳遞的過程中可能會丟失並且到達順序可能會混亂。UD QP是唯一支持多播消息的模式。 UD數據包的大小受限於MTU |
Verbs |
網絡適配器的功能的一種抽象描述。使用Verbs,任何應用都能創建和管理用於RDMA數據傳輸的 對象。 |
VPI(Virtual Protocol Interface) |
允許用戶能夠改變端口的2層協議。 |
WQ(Work Queue) |
SQ或RQ中的一種。 |
WQE(Work Queue Element) |
WQ(工作隊列)中的一個元素。 |
WR(Work Request) |
用戶提交至WQ(工作隊列)的一個請求。 |