[阅读本文之前需要现有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),同时对于协议头部的格式保持无关性。

[RoCE]RDMA over Converged Ethernet模式以及配置-冯金伟博客园 

[RoCE]RDMA over Converged Ethernet模式以及配置-冯金伟博客园

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>。