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 类似但不同)
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主要用于支持以下需求:
Mellanox IB 路由器执行路由算法,能够从 L3 地址获取最后一跳的 L2 地址,从而避免 L3 到 L2 表查找的开销。 因此,路由简单且快速,可以以非常小的延迟开销和线速执行。 在这篇文章中,我们描述了该解决方案的架构。
单跳拓扑是假设 2 个子网之间需要每条 L3 连接的网络拓扑,它们必须至少由一台路由器连接,如图 1 所示。 路由器。 当流量需要多个路由器跃点才能从一个路由器到达另一个路由器时,我们称拓扑为多跳。 自 2016 年 5 月起,在 IB 路由下,这些子网将无法相互通信
图 1-单跳拓扑
图 2 - 具有两个子网的多跳拓扑 不支持这些子网之间的 L3 路由
在本节中,我们提供一些设计拓扑的基本规则,该拓扑包含由 IB 路由器连接的多个子网
当引入 L3 流量时,由于路由器是无损的,我们必须确保不存在由穿过路由器的流量形成的缓冲区依赖环路(信用环路)。每个子网内的信用环路自由度由 SM可防止信用循环的形成。 但是,当我们将子网相互连接时,存在创建此类依赖环路的风险,其中涉及穿过路由器的多个流量。 为了避免信用循环,需要进行详细而准确的设计,因为它可能涉及使用 InfiniBand 虚拟通道和服务级别来支持不同的拓扑集。 然而,依赖于 Up/Dn 路由原理的简单规则可以通过限制可能的拓扑空间来避免该问题,而无需任何高级功能。 根据该规则,拓扑必须维护“水平”的概念,以便可以清楚地定义“向上”方向。 当定义了这样的方向时,通过路由器的流量可能不会执行任何“向下然后向上”的转弯,足以避免任何信用循环。 我们提供了此类拓扑的 2 种可选简单方案:
a) 适用于新集群的情况,
b) 适用于公共子网连接到多个可能的预先存在的子网时
a.保留此规则的一种拓扑类型要求将 IB 路由器放置在拓扑的顶部。 图 3 显示了此类拓扑。请注意,在这种情况下,路由器连接到位于子网“顶部”的每个子网交换机。 由于此选项需要在连接路由器的子网顶部有空闲连接,因此它非常适合同时设计整个拓扑的情况。 图 3a - 第一个可选的简单拓扑将路由器置于“顶部”
b. 替代拓扑可以允许单个子网连接到一组彼此隔离的子网。对于现有子网连接到公共存储子网的情况,这是一种简单的解决方案。 仅需要新的公共子网来提供“顶级”端口。 Up/Dn 方向得以保留,因为旧子网位于拓扑的顶部,并通过以前可能连接到主机的端口连接到路由器。 新的公共子网通过子网顶部的端口连接到旧子网。 由于没有流量进入公共子网(下行)并离开其他子网(再次上行),因此不可能出现信用循环。 图 3b - 第二个可选的简单拓扑将路由器放置在公共子网的“顶部”和旧子网的下方
注意:图 3a 和 3b 显示了所有路由器连接到所有子网的情况。 这不是必需的:路由器可以连接到子网的子集
IB 路由器系统需要配置端口和子网分组
注意:路由器可以在不使用路由链的情况下连接胖树(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通信)
截至 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找到
注意:
为了简化路由器实现并提供全线速和最低延迟,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值,并对出口的目的端口进行简单查找
如上所述,可以使用 DNS 或 /etc/hosts 文件执行名称到 IP 的解析。
获得目的地的 IP 后,应用程序应调用 librdmacm,后者进一步使用 ibacm 服务,或者为内核提供一个钩子以使用 ibacm(如果存在)进行解析。连接请求中提供的信息必须保存来自本地源的路径记录 HCA端口经过路由器最后到达目的主机端口。 因此,第一个解决方案是找到目的地的可路由 GID,然后找到将流量转发到路由器 L2 地址。 一旦解决,连接请求就可以发送到远程节点 (通过 QP1)以发起连接。 驻留在另一个子网节点上的连接管理器 (CM) 通常要求将从其节点到请求发起者的反向 PathRecord 嵌入到连接请求中。 然而,当原始端口与 CM 节点不在同一子网上时,它实际上会避免这些字段并使用数据包标头中提供的信息。 这样就不需要反向 PathRecord
将 IP 解析为 GID, 基于 2016 年 5 月版本的 ibacm 缓存。 缓存文件在设置阶段填充并提供给所有集群节点。调用 librdmacm 时,它首先尝试调用 ibacm 来执行解析,然后 ibacm 尝试在其缓存中查找 IP 到 GID 记录
在发送任何 InfiniBand 流量之前,客户端应用程序或内核模块必须获取描述目的地 L2 地址的 PathRecord。 PathRecord 是通过提供源 GID 和目标 GID 从子网管理员 (SA) 获取的。 重要的是,提供的目标 GID 将包括目标的子网前缀及其 GUID。 路由器就绪的 OpenSM 检查连接到目标子网的可能路由器,并可以根据路由器策略文件或 PathRecord 查询中提供的某些标准进一步过滤它们。 例如,提供特定 P_Key 的查询将仅允许通过在两个子网端口上支持该 P_Key 的路由器进行路由。 然后,SM 执行基于目的地的路由,并选择哪个可能的路由器将承载流量,并在返回的 PathRecord 中提供其 LID 作为 DLID。
需要使用正确的可路由 SGID 发送流量,以便路由器另一侧的接收方节点可以执行 PathRecord 并进行回复。 InfiniBand规范为SM提供了配置每个端口的子网前缀的方法。 它还允许 SM 将多个 GUID 关联到一个端口。 但问题是设备如何知道在发送数据包时使用这些 GUID 中的哪一个。 答案是,为了让 librdmacm 和其他内核客户端使用正确的 GUID,我们需要将 IB 端口的 IPoIB 与该特定的可路由 GID 相关联。 此设置在设置阶段执行。
对于单跳路由,路由器本身正在执行用直接从数据包 GRH 中可用的 DGID 中提取的目标 DLID 替换 DLID 的最小任务
参考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
博客: 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
https://cloud.tencent.com/developer/column/101987
技术会友: 欢迎对DPU/智能网卡/卸载/网络,存储加速/安全隔离等技术感兴趣的朋友加入DPU技术交流群
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。