https://www.cnblogs.com/burningTheStar/p/8565612.html
[閱讀本文之前需要現有RDMA的基礎知識]
1.RDMA over Converged Ethernet(RoCE)
Remote Direct Memory Access(RDMA)是一種遠程內存管理能力,允許不同服務器上應用的內存之間直接移動數據,不需要CPU的干預。RoCE是一種機制,它提供了在無損以太網絡上極低延遲的高效數據傳輸。 隨着數據中心朝着可靠以太網發展,搭載RoCE的CX系列以太網卡使用經過證實的,高效的RDMA傳輸方式以10GigE和40GigE線速為主流數據中心的應用提供部署RDMA技術的平台。當RDMA應用工作在以太網鏈路層上時,應該注意以下幾點:
- 不需要子網管理員(Subnet Manager, SM,在infiniband網絡下需要)。
- 因為LID(Local ID)是infiniband協議棧中的2層屬性,因此在RoCE網絡下不需要設置該屬性,當查詢這個端口時,該字段為0。
- 在RoCE網絡下,RC QP(可靠鏈接的QP)的alternate path也不需要設置,因此infiniband 協議下的高可用服務也不支持。
- 因為SM不存在,也就不可能向SM查詢路徑。因此,在建立鏈接前,路徑記錄結構體里面必須被填充相關的值。建議使用RDMA_CM來建立鏈接,因為它會處理該結構體。
- 打上VLAN標簽的以太網幀帶有一個3bit的優先級域。這個域的值從IB的SL(service_level, 是建立QP時要設置的一個屬性)域提取最低3bit的值得到。
- RoCE流量不會被以太網設備的計數器統計,因此流量被卸載到了硬件上,沒有經過內核以太網驅動。但是RoCE流量和IB流量的統計位置是一樣的:/sys/class/infiniband/<device>/ports/<port number>/counters/
1.1 RoCE模式
RoCE將IB傳輸的流量封裝到下面兩種以太網幀中:
- RoCE v1 - RoCE v1協議被定義為帶有以太網頭部的IB幀。 它使用以太網類型0x8915並且可以選擇啟用或者關閉VLAN標簽。常規的以太網MTU也適用於RoCE幀。
- RoCE v2 - RoCE協議的直接擴展使得流量能在3層IP環境下運行。將RoCE中的GRH頭部替換成IP頭部,使用UDP類型和專用的目的UDP端口(4791)。UDP源端口域用來攜帶一個模糊的流標識符,使得網絡設備能夠實現包的轉發優化(例如ECMP),同時對於協議頭部的格式保持無關性。
1.2 RoCE模式參數
對於CX3和CX3Pro設備來說,RoCE模式可以通過使用/etc/modprobe.d/mlx4_core.conf文件中的roce_mode參數來設置。下面是可用的RoCE模式值:
- 0,驅動將所有的GID索引都關聯到RoCE v1(GID是Global ID,RoCE網絡下必須使用此值來建立QP而不是像IB網絡下僅僅使用LID即可)
- 2,驅動將所有的GID索引都關聯到RoCE v2
- 4,驅動將所有的GID索引交替關聯到RoCE v1和RoCE v2上
對於CX4或者CX5設備,這些設備默認都是RoCEv2,且包含了RoCEv1的GID,使用show_gids可以查看。
1.3 GID表格分布
每當以太網設備的一個網絡端口配置了一個IP地址時,就會在GID表格中創建一個表項。每個表項包含:GID值,GID類型,網絡設備。對於兩種模式都支持的設備端口,表中會存在兩個GID,有相同的值,但是類型不同。表項中的網絡設備是該GID關聯的以太網設備的IP地址。
GID格式有可以有兩種:IPv4和IPv6。IPv4版本的GID是一個IPv4映射的IPv6地址,而IPv6版本的GID是IPv6地址本身。對於RoCEv2,關聯到IPv4版本GID的三層網絡包,其頭三層頭部是IPv4,IPv6亦然。對於RoCEv1,關聯到IPv6或IPv4版本GID的網絡包,頭部是IPv6或者GRH。
GID表格項的總數等於N(K+1), N是賦予給所有網絡設備上關聯端口的IP地址數量,包括VLAN設備,別名設備,和bonding master。鏈路本地的IPv6地址被排除在這個計數之外,因為它們的GID總是存在的,是默認的GID,處於每個GID表格的開始。K是支持的RoCE類型數量。每個硬件端口的表格項數量限制在128。show_gids命令可以查看系統中的GID表。
在系統文件sysfs中查看GID的路徑是:
- GID值:/sys/class/infinband/<device>/ports/<port>/gids/<index>
- GID類型:/sys/class/infinband/<device>/ports/<port>/gid_attrs/types/<index>
- GID網絡設備:/sys/class/infinband/<device>/ports/<port>/gid_attrs/ndevs/<index>
對一個QP設置RoCE模式(前提是配置好了GID表):
- 對於RC/UC QP,在從INIT轉換到RTR狀態時,填充一個地址向量(Address Vector)時,應該為QP的源GID指定硬件端口的GID表索引。這個索引對應的GID類型就被設置為該QP的RoCE類型。
- 對於UD QP,必須修改mlx4_core模塊中的ud_gid_type參數的值來為設備上所有的UD QP設置RoCE模式。 可用的值有:0(對應於RoCE v1), 2(對應於RoCE v2)。
對於RDMA_CM應用設置RoCE模式:由於RDMA_CM接口僅僅要求傳遞遠端的IP地址即可,因此RDMA_CM決定了要使用的源GID,並從表中獲取該GID。而表中可能包含多個GID,因此必須按照GID類型來查詢。而這個查詢的類型被定義為RDMA_CM模塊的一個全局變量。要改變這個值需要使用cma_roce_mode腳本。例如:cma_roce_mode -d <dev> -p <port> -m <1,2>。