RDMA之infiniband专用网络 LID 和GID 的作用 (4)

RDMA之infiniband专用网络 LID 和GID 的作用 (4) 1、概述RDMA网络架构设计看上去是参考了TCP/IP如图1所示只不过不使用MAC和IP地址来进行寻址而是用LIDLocal Identifiers进行链路层的转发使用GID (Global Identifier)进行网络层的转发。传输层和上层协议不是本次的讨论点所以忽略。1.1 IB子网管理器subnet manager在这篇博客中会多次提到子网管理器有必要在这里提前介绍下IB网络的子网管理器OpenSM后面简称SM。每个Infiniband子网至少有一个SM。SM 位于 Channel Adapter、路由器或交换机的一个port上每个port只有一个 SM可以用硬件或软件实现。当子网内有多个 SM 时其中一个将被选举为主 SM其余为备用 SM。主 SM 是初始化和配置 IB子网的关键元素是子网初始化过程的一部分负责发现子网的物理拓扑为端节点、交换机和路由器分配本地标识符 (LID)在端节点之间建立可能的路径扫描子网发现拓扑变化并在添加和删除节点时管理变化1.2QP0 QP1用户调用ibv_create_qp创建QP时获取到的qpn都是2的因为每个port上的qp0和qp1是有专门用途的QP0用于子网管理QP1用于GSIGeneral Service Interface。后面在介绍LID时会提到QP0所以这里提前简单介绍下QP0的作用。每个 IBA port都有一个专用于子网管理的 QP0。QP0 与其他 QP 相比不同点在于QP0 永久配置为UD。IBA 设备的每个port都有一个发送和接收数据包的 QP0。QP0 是所有partition的成员即可以接受指定任何分区的任何数据包。QP0只处理子网管理数据包 (SMP)QP0的流量即 SMP不受链路级流量控制2、LIDLocal IdentifiersLID是SM子网管理器分配的16 bit标识符在子网中LID是唯一的LID不能用于子网之间的路由。0x0000 为保留标识符0x0001到0xBFFF是单播标识符总共有49151个单播LID这意味着一个IB网络子网最大可以有48000左右的IB网卡0xC000到0xFFFE是多播标识符0xFFFF用于和QP0通信可以先不管。每个port都有一个由SM子网管理器分配的LID。交换机使用 LID 在子网内路由数据包LID填充在包的LRHLocal Route Header。SM根据 LID 以及该port相对于特定交换机的位置在交换机中配置路由表。每个数据包都包含一个源 LID (SLID)用于标识数据包的源port以及一个目地 LID (DLID)用于标识数据包目的port。为了便于多路径操作同时尽量减少Channel Adapter的复杂性SM需要为每个endport分配一个基本 LID 和一个 LID Mask Control(LMC)LMCLID Mask Control 是一个 3 bit字段。SM 可以将endport上的 LMC 定义为 0 到 7 之间的任何值。等价于每个port可以有一个或者多个连续LID上限为 从而实现通过多个 LID1-128来寻址endport。如图所示从Channel Adapter A到Channel Adapter C之间有4条路径那么对应的就有4个目的LID。2.1 LID 的特点由子网管理员分配子网内唯一不可用于子网间路由。• LID 作为一种网络地址分为预留、单播和多播地址段。• 数据包中的本地路由报头 local route header LRH中包含了 LID。• 源 LID 指的是第一个将数据包插入子网的终端端口的 LID。• 一个单播型的目的 LID 适用于某一个目的终端端口。一个多播型的目的 LID 适用于一个子网中某个多播组里的一系列目的终端端口。• 如果最终的目的端口不在这个子网内数据包中的目的 LID 指向的是负责转发这个数据包到下一跳的路由器的某个端口。• 一个终端端口在连接到子网后收到的数据包可能经过了子网内的多条物理路径。例如图 2中交换机之间相同类型的连线表示一条可能的路径这样的路径共有 4条。每条路径可以被一个或多个物理 LID 标识。为了降低 HCA 的多路径操作的复杂度每个物理端口应分配一个基本 LID 和一个 LMC。 LMC 是一个 3 位的域代表2LMC 条路径。图 2中 HCA A 和 HCA C 之间存在多条路径。如果 HCA A 被分配了基本 LID 4 LMC 2则其 LID 的范围是 4、 5、 6、 7。如果 HCA C 被分配了基本LID 8 LMC2则其 LID 的范围就是 8、 9、 10、 11。• LID 的分配规则 LID 0x0000 无效 LID 0xFFFF 分配给接收数据包的终端端口的 QP00x0001 和 0xBFFF 之间为单播 LID 0xC000 和 0xFFFE 之间为多播 LID。对于 RoCE 类型的网络 LID 无效所有端口的 LID 都为 0x0000。3、GID (Global Identifier)GID的构造稍微复杂些涉及到EUI-64GUID还有subnet prefix等为了尽可能把GID描述清楚每个小知识点都需要单独说明。3.1 背景信息EUI-64IEEE 定义的分配给设备的 64 位标识符。EUI-64 是由 24 位 company_id 值和 40 位扩展标识符连接而成的 64 位标识符。company_id 由 IEEE 注册机构分配扩展标识符由分配 company_id 的组织分配GUIDGolbal Unique Identifier符合 EUI-64 标准的全球唯一的标识符。制造商需要给每个 HCA、TCA、交换机和路由器都分配一个 EUI-64 GUID。还需为每个port分配一个 EUI-64 GUID一个HCA或者TCA可能有多个port交换机和路由器也有多个port。EUI-64与GUID不等价除了制造商SM也可以分配用于子网内且子网内唯一的EUI-64但只有制造商分配的全球唯一的EUI-64才能叫做GUID。Subnet Prefix0 到 64 位的标识符用于唯一标识由公共SM管理的一组endport。3.2 GID的定义GID是一个128 bit用于标识endport或multicast group的单播或多播标识符。GID利用了 IPv6 地址的众多概念和语义根据 RFC 2373但是IBA 未定义 GID 和 IPv6 地址之间的关系即对于任何endport或multicast groupGID 和 IPv6 地址之间没有定义映射。注意这些规则仅适用于 IBA 操作不适用于原始 IPv6 操作除非特别说明。GID 是在不同子网之间发送数据包时的全局地址。值由两部分组成高 64 位为GID前缀。低 64 位为EUI-64可能是IEEE分配的全球唯一的GUID也可能是SM分配的只在子网内唯一的EUI-64。GID前缀分为默认和非默认两种1如果SM没有配置GID前缀那么使用默认GID前缀GUID组成GID。默认 GID 前缀定义为 (0xFE80::/64)如果数据包的 GRH Global Route Header 里目的 GID 使用了默认GID前缀意味着这个数据包不能由路由器转发只能在二层网络转发。2如果SM给endport配置了非默认 GID 前缀则使用非默认GID前缀GUID组合成GID。每个endport支持的单播 GID 的最大数量 (N) 取决于具体实现。1个为GID前缀GUID组合而成剩余的N-1个GID则为SM分配的 N-1个 EUI-64 标识符与 GID 前缀拼接而成。单播 GID 地址 0:0:0:0:0:0:0:0 是保留的 - 称为保留 GID。不能分配给任何endport也不能用作目的GID。单播 GID 地址 0:0:0:0:0:0:0:1 称为环回 GID仅供原始 IPv6 服务使用 - 不供 IBA 传输服务使用。禁止分配给endport或出现在任何 IBA 数据包中。3.3 单播GID的格式单播GID有三种类型1link-local GIDlink local - 用于子网内的单播GID使用默认 GID 前缀即 0xFE80::/64。路由器不得转发有默认GID前缀的数据包link local GID 格式2site-loal GIDsite local - 用于子网集合中的单播 GID该 GID 在集合内是唯一的例如数据中心或校园但不一定是全局唯一的。路由器不得转发有site local GID不管是SGID还是DGID的数据包到site local之外。格式为3全局GID。全局 - 具有全局前缀的单播 GID路由器可以使用此 GID 在整个 Internet 中路由数据包。全局 GID 格式为3.4 多播GID的格式多播组由多播GIDMGID唯一标识并且多播组的所有成员除了有相同的MGID外还必须共享相同的P_Key和Q_Key。MGID的格式如下GID 开头的 8 位 11111111 标识这是一个多播 GID。Flags 是一个4bit的标志位前3bit为保留位定义为0。第4个bit0 表示这是永久分配的多播 GID。有关这些永久分配的 GID。1 表示这是非永久分配的即临时的多播 GID。Scope 是 4 位多播范围值用于限制多播组的范围0和0xF代表reserved2代表link-local5代表site-local8代表origanization-local0xE代表global其他取值都是unassigned。endport可以属于0个、1个或多个多播组即endport可以分配0个、1个或多个多播 GID。 多播 GID 不得作为 GRH 中的源 GID (SGID) 出现。最后使用IBA的一张官方图作为结束吧本来想举一个具体的例子描述在子网内交换机是如何根据LID进行数据包转发的但是发现需要补充的背景知识有点多会导致博客的篇幅过长所以留到后面单独更一篇吧。3.5 GID 特点• 每个终端端口必须被分配至少一个单播 GID。第一个单播 GID 在创建时必须使用厂商分配的 EUI-64 标识符。此 GID 称为 0 号 GID。• 默认的 GID 前缀为 0xFE80::0共 64 位。使用默认 GID 前缀和厂商/子网管理器分配的 EUI-64 可以组成 128 位的 GID使用这种 GID 封装的数据包必须被终端接纳。一个数据包的全局路由报头 GRH中如果有这种前缀的目的 GID则路由器不能将其转发也就是必须限制在本地子网内处理。通道适配器、交换机或路由器上的任何 QP都可以用默认 GID 前缀加上为这个 QP分配的 GID 来寻址。这使得一个子网可以在不中断已有通信会话的情况下从默认GID 前缀状态转换为托管状态。• 每个终端端口可以支持的单播 GID 的最大数量 N取决于具体实现。子网管理器可以分配 N-1 个额外的单播 GID这 N-1 个 GID 中的每一个都是通过将一个子网管理器分配的 EUI-64 标识符与 GID 前缀连接起来创建的。• 单播 GID 地址 0:0:0:0:0:0:0:0 是保留的称为保留 GID。不得将其分配给任何终端端口也不得将其用作目的地址或用在 GRH 中。• 单播 GID 地址 0:0:0:0:0:0:0:1 称为环回 GID仅由原始 raw IPv6 服务使用不由InfiniBand 传输服务使用。不得将其分配到终端端口或出现在任何 InfiniBand 数据包中。• 单播 GID 子网前缀应限于 GID 地址空间的高 64 位。子网前缀的位的数量可能会进一步受到填充 filler和作用域 scope位的限制见下文分析。• 单播 GID 的低 64 位不能进一步划分子网。• 单播 GID 的低 64 位在子网中是唯一的。• GRH 中应包含有效的源 GID 和目的 GID。3.6 GUIDGIDLID区别标识符作用范围唯一性生成方式示例GUID全局硬件唯一硬件固化结点GUID: 0x0002c9030020abcdGID全局子网相关动态子网前缀 端口GUIDfe80::0002:c903:0020:abceLID子网内子网内唯一动态子网管理器分配单播 LID: 0x0014、RoCEV2的MAC,IP,GID在 RoCEv2 类型的网络上传递的是EthernetIPUDP 的数据包。每个 RoCEv2 类型的 RDMA 网卡在封装数据包时必须知道• 自己的 MAC 地址• 自己的 IP 地址• 对端的 MAC 地址• 对端的 IP 地址。RDMA 应用程序在修改 QP 和向对端发起数据传输前需要先通过套接字获取对端的几个关键信息。这些关键信息包括 LID、 QPN、数据缓存的地址、 R_Key 和 GID等。 对端的 MAC 地址和 IP 地址就是根据对端的 GID通过换算或查询获取的。要理解如何通过对端的 GID 获取对端的 MAC 地址和 IP 地址 前提是知道 RoCEv2 网卡的 GID 有什么特点。RoCE 类型的终端和 InfiniBand 类型的终端一样都有默认的 GID。在网卡没有做任何人工配置的情况下执行 show_gids 命令从其输出中可以看到一个“0号 GID”由于使用了默认 GID 前缀因此这也是一个默认 GID。$ show_gids //看看网卡支持的roce版本, DEV PORT INDEX GID IPv4 VER DEV --- ---- ----- --- ------------ --- --- mlx5_4 1 0 fe80:0000:0000:0000:ee0d:9aff:fe2f:c21a v1 p1p1 mlx5_4 1 1 fe80:0000:0000:0000:ee0d:9aff:fe2f:c21a v2 p1p1可以为ROCEV2网卡添加一个新的GID,方法是为该网卡在操作系统中对应的网络接口上配置一个IPV4地址192.168.1.1然后再执行show_gids命令就可以看到设备多了一个GID如下所示:$ show_gids //看看网卡支持的roce版本, DEV PORT INDEX GID IPv4 VER DEV --- ---- ----- --- ------------ --- --- mlx5_4 1 0 fe80:0000:0000:0000:ee0d:9aff:fe2f:c21a v1 p1p1 mlx5_4 1 1 fe80:0000:0000:0000:ee0d:9aff:fe2f:c21a v2 p1p1 mlx5_4 1 2 0000:0000:0000:0000:0000:ffff:c0a8:0101 192.168.1.1 v1 p1p1 mlx5_4 1 3 0000:0000:0000:0000:0000:ffff:c0a8:0101 192.168.1.1 v2 p1p1可以看到这个新的GID 0000:0000:0000:0000:0000:ffff:c0a8:0101是由刚刚设置的 IP 地址192.168.7.2 转换而来的 0xC0 等于 192 0xA8 等于 168。如果为网络接口配置的是一个 IPv6 类型的 IP 地址也会产生新的 GID新 GID 和配置的 IPv6 类型的 IP 地址完全相同.关键列DEV/PORT: 指明是哪个RDMA设备如mlx5_0的哪个端口。INDEX: GID表的索引号。一个端口可以有多个GID。GID: 128位的全局标识符本身。IPv4: 当GID类型为RoCE v2且由IPv4地址映射而来时这里会显示对应的IPv4地址极大方便了调试。VER: 标识GID用于哪个版本的RoCE协议。v1对应RoCE v1基于以太网二层v2对应RoCE v2基于UDP/IP三层。DEV: 关联的Linux网络接口名。注意fe80::开头的GID是链路本地地址Link-local GID它是网卡在未配置IP时自动生成的仅用于同一物理链路如直连或同一交换机VLAN内的通信。而由IPv4映射而来的GID如::ffff:192.168.1.1才是用于跨三层网络进行RoCE v2通信的关键。