Nvidia-IB 路由器架构和功能-RDMA子网-GID-LID

描述

InfiniBand (IB) 路由器旨在用于将非常大的网络分段(segment), 分为由 IB 路由器连接的较小子网(subnets)。 分段对于将某些子网彼此隔离或构建非常大的网络可能很有用。 这篇文章讨论 IB 路由器架构和功能

术语

SM:子网管理器。 InfiniBand网络的SDN控制器 SA:子网管理。 处理 SM 带内北向接口的软件。 实现 InfiniBand 客户端软件可以查询 SM 并与 SM 交互的服务 OpenSM:兼容 InfiniBand 的子网管理器和管理软件 OpenMPI:开放消息传递接口实现 SRQ:共享接收队列。 一种通过多个QP共享接收缓冲区来减少接收缓冲区资源的方法 Per Peer QP:每个对等队列对 (QP) LID:本地标识符。 InfiniBand使用的L2地址(由SM分配) DLID:目的地 LID multi-swid:多开关 ID。 在单个 InfiniBand 交换机之上虚拟化多个交换机。 P_Key:分区键。 限制发送/接收或转发特定流量的 InfiniBand 方式(与 VLAN 类似但不同)

其他参考

IB端口属性

代码语言:javascript
复制
struct ibv_port_attr {
    enum ibv_port_state     state;          /* Logical port state */
    enum ibv_mtu            max_mtu;        /* Max MTU supported by port */
    enum ibv_mtu            active_mtu;     /* Actual MTU */
    int                     gid_tbl_len;    /* Length of source GID table */ -> 源GID表长度
    uint32_t                port_cap_flags; /* Port capabilities */
    uint32_t                max_msg_sz;     /* Maximum message size */
    uint32_t                bad_pkey_cntr;  /* Bad P_Key counter */
    uint32_t                qkey_viol_cntr; /* Q_Key violation counter */ -> Q_key违反次数
    uint16_t                pkey_tbl_len;   /* Length of partition table */ -> 分区键表长度
    uint16_t                lid;            /* Base port LID */ -> 基本端口的本地标识
    uint16_t                sm_lid;         /* SM LID */ -> 子网标识
    uint8_t                 lmc;            /* LMC of LID */ -> LID 掩码控制(lid mask control) 由子网管理器分配的每个端口值。 LMC的值指定本地标识符中的路径比特数
    uint8_t                 max_vl_num;     /* Maximum number of VLs */
    uint8_t                 sm_sl;          /* SM service level */
    uint8_t                 subnet_timeout; /* Subnet propagation delay */ -> 子网传播时延
    uint8_t                 init_type_reply;/* Type of initialization performed by SM */
    uint8_t                 active_width;   /* Currently active link width */ -> 当前位宽
    uint8_t                 active_speed;   /* Currently active link speed */ -> 当前带宽速度
    uint8_t                 phys_state;     /* Physical port state */
    uint8_t                 link_layer;     /* link layer protocol of the port */ -> 链路层类型
};

概述

IB Router主要用于支持以下需求:

  • 子网隔离,使您能够构建由路由器隔离的较小子网,以获得更快的 SM 响应时间,并可选择防止流量在所有节点之间交叉。 在常见用例中,您可以在彼此隔离的多个节点以及其他计算子网之间共享存储网络。
  • 包含主机数 > 42K(4.2万)的集群

Mellanox IB 路由器执行路由算法,能够从 L3 地址获取最后一跳的 L2 地址,从而避免 L3 到 L2 表查找的开销。 因此,路由简单且快速,可以以非常小的延迟开销和线速执行。 在这篇文章中,我们描述了该解决方案的架构。

重要说明/限制

  • 第一个支持路由器的 Mellanox OpenSM 版本是 4.7.0 版,带有 UFM 5.6 和 Mellanox MLNX-OFED 版本 3.3
  • 从 MLNX OS 版本 3.6.200 开始的基于交换机的 OpenSM 具有路由器感知能力(aware),MLNX_OFED 版本 3.3 或 UFM 5.6 附带的 SM 也是如此
  • 仅支持单跳路由(single hop routing)。 换句话说,路由流量最多只能穿过一个路由器
  • 没有跨子网的多播流量。 计划在稍后阶段进行
  • ConnectX-3、Connect-IB 和 ConnectX-4 是唯一支持路由器的 HCA。 但是,旧的 HCA 仍然可以在每个 IB 子网中使用,只是无法发送/接收路由流量
  • ConnectX-3(和 Pro)不支持从客户端到服务器的路径使用与从服务器到路由器的路径不同的路由器的情况。 这是因为他们实施了 IBTA 规范 1.2 并对传入流量执行 SLID 检查。 相同的合规性声明在版本 1.3 中进行了修改,要求在存在 GRH 时忽略 SLID 检查。 设备的这种限制不会阻止它们发送/接收穿过路由器的流量,只要它是“路由器可逆”的,即同一路由器用于两个方向。 librdmacm 建立的连接本质上是“路由器可逆”的。
  • IB 子网大小受 LID 数量限制。 当 LMC=0 时,它是 0xBFFF =~ 48000。当 LMC>0 时,您需要将该数字除以 2^LMC
  • IB路由器系统SB7780基于Switch-IB(点击此处了解详细信息),使用MLNX-OS版本3.6.0502或更高版本。 它有以下限制:
    • IB 路由器无法运行嵌入式 SM 和所有相关 IB 工具
    • IB 路由器无法运行基于交换机的 MPI 集合聚合节点(Mellanox SHARP 技术)
    • IB 路由器无法运行自适应路由
  • 最新的 MLNX_OFED 3.4 现在支持存储隔离
  • 目标是在 2017 年大规模运行 MPI

单跳拓扑(SINGLE HOP TOPOLOGIES)

单跳拓扑是假设 2 个子网之间需要每条 L3 连接的网络拓扑,它们必须至少由一台路由器连接,如图 1 所示。 路由器。 当流量需要多个路由器跃点才能从一个路由器到达另一个路由器时,我们称拓扑为多跳。 自 2016 年 5 月起,在 IB 路由下,这些子网将无法相互通信

图 1-单跳拓扑

图 2 - 具有两个子网的多跳拓扑 不支持这些子网之间的 L3 路由

网络拓扑设计

在本节中,我们提供一些设计拓扑的基本规则,该拓扑包含由 IB 路由器连接的多个子网

1. 信用环路自由度(Credit-Loop freedom)

当引入 L3 流量时,由于路由器是无损的,我们必须确保不存在由穿过路由器的流量形成的缓冲区依赖环路(信用环路)。每个子网内的信用环路自由度由 SM可防止信用循环的形成。 但是,当我们将子网相互连接时,存在创建此类依赖环路的风险,其中涉及穿过路由器的多个流量。 为了避免信用循环,需要进行详细而准确的设计,因为它可能涉及使用 InfiniBand 虚拟通道和服务级别来支持不同的拓扑集。 然而,依赖于 Up/Dn 路由原理的简单规则可以通过限制可能的拓扑空间来避免该问题,而无需任何高级功能。 根据该规则,拓扑必须维护“水平”的概念,以便可以清楚地定义“向上”方向。 当定义了这样的方向时,通过路由器的流量可能不会执行任何“向下然后向上”的转弯,足以避免任何信用循环。 我们提供了此类拓扑的 2 种可选简单方案:

a) 适用于新集群的情况,

b) 适用于公共子网连接到多个可能的预先存在的子网时

a.保留此规则的一种拓扑类型要求将 IB 路由器放置在拓扑的顶部。 图 3 显示了此类拓扑。请注意,在这种情况下,路由器连接到位于子网“顶部”的每个子网交换机。 由于此选项需要在连接路由器的子网顶部有空闲连接,因此它非常适合同时设计整个拓扑的情况。 图 3a - 第一个可选的简单拓扑将路由器置于“顶部”

b. 替代拓扑可以允许单个子网连接到一组彼此隔离的子网。对于现有子网连接到公共存储子网的情况,这是一种简单的解决方案。 仅需要新的公共子网来提供“顶级”端口。 Up/Dn 方向得以保留,因为旧子网位于拓扑的顶部,并通过以前可能连接到主机的端口连接到路由器。 新的公共子网通过子网顶部的端口连接到旧子网。 由于没有流量进入公共子网(下行)并离开其他子网(再次上行),因此不可能出现信用循环。 图 3b - 第二个可选的简单拓扑将路由器放置在公共子网的“顶部”和旧子网的下方

注意:图 3a 和 3b 显示了所有路由器连接到所有子网的情况。 这不是必需的:路由器可以连接到子网的子集

2. 确保每个子网使用的端口位于同一组路由器端口中(具有相同的subnet_prefix)

IB 路由器系统需要配置端口和子网分组

3. 确保子网之间有足够数量的路由器以维持所需的带宽

4. OpenSM路由引擎链提供了许多单一引擎无法支持的路由拓扑选项

注意:路由器可以在不使用路由链的情况下连接胖树(fat-tree)、环面和网状拓扑,但在每个子网内,路由器确实需要成为每个本地拓扑的有效部分。

分区

如果您希望对哪些子网可以相互通信进行管理控制,您可以进一步阻止子网之间的通信,即使有路由器连接它们。 这可能是一种经济高效的解决方案,因为它允许您使用单个路由器,但会阻止连接到该路由器的某些子网之间的通信。 例如,请参见下图所示的三个子网 S1、S2 和 S3。 您需要决定允许哪些子网进行通信,并分配一个全局唯一的 P_Key 用于该通信。 确保不应通信的子网没有公共路由器或没有分配给路由器端口的公共 P_Key。 实际的 P_Key 分配由 SM 执行,并通过每个子网 SM 上的partitions.conf 文件进行配置。

注 1:如果您想让两个子网相互通信,它们必须共享相同的 P_Key 编号。 IB 规范不允许跨子网更改 P_Key。

注 2:不可能在同一子网或不同子网的两个不同 P_Key 上路由数据包。

图 4-P_Key 编号共享(S2和S3不能通信, S1可以和S2和S3通信)

IPOIB

截至 2016 年 5 月,IB 路由器不包括内部 IP/IPoIB 路由器(仅 IB 路由器)。 然而,管理、存储应用程序依赖 IP 连接来建立连接是很常见的。 为了支持子网之间的 IPoIB 通信,您需要依赖辅助以太网或使用 IP 路由器。 如果您不想拥有辅助网络,则首先需要在每个 IB 子网(通过选择不同的 IP 范围创建)上设置专用的 IPoIB 子网,然后在子网之间放置 IP 路由器。 每个IP路由器可以连接多个子网。 由于 IP 路由器不承载带宽或延迟关键流量,因此可以使用每个子网上带有 IPoIB 接口的 Linux 盒子来构建它们。 您可能想参考如何将Linux盒子制作成IP路由器的教程,可以在http://www.howtoing.com/setup-linux-as-router找到

注意:

  • IPoIB 流量不会穿过 IB 路由器,因为它不携带 GRH 标头,用户有一个选择,但不建议使用。 这涉及使所有子网成为同一 IPoIB 子网。
  • 作为替代方案,我们建议用户在每个 IB 子网上设置不同的 IPoIB 子网,
  • 连接到所有子网的 IP 路由器将执行 IP 路由

路由器算法架构

为了简化路由器实现并提供全线速和最低延迟,Mellanox 引入了算法路由器的概念。主要思想是路由器可以避免通过算法执行 L3 地址(GID)到 L2 地址(LID)的查找和学习的需要。 当数据包到达最终子网时,需要在 L3 转发的最后一跳进行此类查找,因此需要经过 L2 转发到最终目的地。 算法路由器执行简化的 GID (L3) 到 LID(L2) 映射。 Switch-IB 实现了简单的算法路由映射功能,仅从 GID 中提取 LID。 这依赖于一个简单的函数,该函数将 LID 设置为 GID 的 16 LSB (最低有效位)。 因此,用于必须穿过路由器的流量的 GID 表示为“算法可路由 GID”,并如图 6 所示。L2 地址向量的其他参数(如 P_Key、SL、MTU 和速率)在交换机中并不灵活 -基于IB的算法路由器。 对于这些字段,传出数据包使用传入数据包 L2 标头提供的相同值。 图 6-可路由 GID 格式

另请参阅:LRH 和 GRH InfiniBand 报文头

算法路由器使用子网前缀值和从GID中提取的LID值,并对出口的目的端口进行简单查找

IB 路由如何运作? 逐步说明

1.设置网络

  • 在网络设置期间,每个子网 OpenSM 必须将 LID 和可路由 GID 分配给终端端口。
  • 截至 2016 年 5 月,MOFED 解决方案依赖 ibacm 提供 IP 到 GID 解析。需要将预填充的 ibacm 缓存分发到所有终端主机,并将 IP 映射到可路由的 GID
  • 可以使用 DNS 或 /etc/hosts 文件执行名称到 IP 的解析。 在这两种情况下,都需要定义名称到 IP 的映射。

2.域名解析

如上所述,可以使用 DNS 或 /etc/hosts 文件执行名称到 IP 的解析。

3.建立连接

获得目的地的 IP 后,应用程序应调用 librdmacm,后者进一步使用 ibacm 服务,或者为内核提供一个钩子以使用 ibacm(如果存在)进行解析。连接请求中提供的信息必须保存来自本地源的路径记录 HCA端口经过路由器最后到达目的主机端口。 因此,第一个解决方案是找到目的地的可路由 GID,然后找到将流量转发到路由器 L2 地址。 一旦解决,连接请求就可以发送到远程节点 (通过 QP1)以发起连接。 驻留在另一个子网节点上的连接管理器 (CM) 通常要求将从其节点到请求发起者的反向 PathRecord 嵌入到连接请求中。 然而,当原始端口与 CM 节点不在同一子网上时,它实际上会避免这些字段并使用数据包标头中提供的信息。 这样就不需要反向 PathRecord

4.解析IP到GID地址

将 IP 解析为 GID, 基于 2016 年 5 月版本的 ibacm 缓存。 缓存文件在设置阶段填充并提供给所有集群节点。调用 librdmacm 时,它首先尝试调用 ibacm 来执行解析,然后 ibacm 尝试在其缓存中查找 IP 到 GID 记录

5.下一跳 (L2) 地址解析

在发送任何 InfiniBand 流量之前,客户端应用程序或内核模块必须获取描述目的地 L2 地址的 PathRecord。 PathRecord 是通过提供源 GID 和目标 GID 从子网管理员 (SA) 获取的。 重要的是,提供的目标 GID 将包括目标的子网前缀及其 GUID。 路由器就绪的 OpenSM 检查连接到目标子网的可能路由器,并可以根据路由器策略文件或 PathRecord 查询中提供的某些标准进一步过滤它们。 例如,提供特定 P_Key 的查询将仅允许通过在两个子网端口上支持该 P_Key 的路由器进行路由。 然后,SM 执行基于目的地的路由,并选择哪个可能的路由器将承载流量,并在返回的 PathRecord 中提供其 LID 作为 DLID。

6.向网络发送可路由流量

需要使用正确的可路由 SGID 发送流量,以便路由器另一侧的接收方节点可以执行 PathRecord 并进行回复。 InfiniBand规范为SM提供了配置每个端口的子网前缀的方法。 它还允许 SM 将多个 GUID 关联到一个端口。 但问题是设备如何知道在发送数据包时使用这些 GUID 中的哪一个。 答案是,为了让 librdmacm 和其他内核客户端使用正确的 GUID,我们需要将 IB 端口的 IPoIB 与该特定的可路由 GID 相关联。 此设置在设置阶段执行。

7. 通过路由器转发

对于单跳路由,路由器本身正在执行用直接从数据包 GRH 中可用的 DGID 中提取的目标 DLID 替换 DLID 的最小任务

IB报文头之LRH 和 GRH

参考IB规范: InfiniBand Specification version 1.3

图1: IB数据报文格式

图2: 本地路由头

链路层中的寻址是本地标识符(LID)。 请注意源 LID (SLID) 和目标 LID (DLID) 的存在。 16 位 LID 位于子网本地并由 SM 分配(与固定的 MAC 地址不同)

图3: 全局路由头

一般来说,GRH 标头不需要伴随 InfiniBand 数据包。 然而,当数据包需要通过 IB 路由器路由时,就需要它。 请参阅 IB 路由器架构和功能。

网络层的寻址是 128 位全局标识符GID

单播 GID 范围定义为

a) 链路本地 - 使用默认 GID 前缀的本地子网内使用的单播 GID。 路由器不得在本地子网之外转发任何具有链路本地源 GID 或目标 GID 的数据包。 链路本地 GID 具有以下格式:

b) 本地站点 - 在子网集合中使用的单播 GID,在该集合(例如数据中心或园区)中是唯一的,但不一定是全局唯一的。 路由器不得在站点外部转发任何具有站点本地源 GID (SGID) 或站点本地目标 GID (DGID) 的数据包。

IB 路由器使用本地站点 GID

参考

https://enterprise-support.nvidia.com/s/article/ib-router-architecture-and-functionality

  • InfiniBand specification - IB规范
  • LRH and GRH InfiniBand Headers - (IB本地路由头和全局路由头)
  • HowTo Configure IB Routers - 如何配置IB路由器

晓兵(ssbandjl)

博客: https://cloud.tencent.com/developer/user/5060293/articles | https://logread.cn | https://blog.csdn.net/ssbandjl | https://www.zhihu.com/people/ssbandjl/posts | https://chattoyou.cn

DPU专栏

https://cloud.tencent.com/developer/column/101987

技术会友: 欢迎对DPU/智能网卡/卸载/网络,存储加速/安全隔离等技术感兴趣的朋友加入DPU技术交流群