9.6. 配置 IPoIB

9.6.1. 了解 IPoIB 角色

第 1.2 节 “IP 网络 vs 非 IP 网络” 所述,大多数网络都是 IP 网络。IPoIB 的角色是在 InfiniBand RDMA 网络顶层提供 IP 网络模拟层。这样就可以让现有应用程序无需修改即可在 InfiniBand 网络中运行。但那些应用程序的性能相比原本使用 RDMA 通讯编写的应用程序要低。因此大多数 InfiniBand 网络中有一些应用程序集合必须使用其全部网络性能,而对另一些应用程序来说,如果不需要修改为使用 RDMA 通讯,则性能降级是可以接受的。IPoIB 可让那些不那么主要的应用程序在网络中以其原有形式运行。
因为 iWARP 和 RoCE/IBoE 网络实际上是在其 IP 链接层顶层附带 RDMA 层的 IP 网络,他们不需要 IPoIB。因此,内核会拒绝在 iWARP 或 RoCE/IBoE 设备中创建任何 IPoIB 设备。

9.6.2. 了解 IPoIB 通讯方式

可将 IPoIB 设备配置为以数据报或连接模式运行。不同之处在于 IPoIB 层尝试在通讯另一端机器中打开的队列对类型。在数据报模式中会打开不可靠、断开连接的队列对;而在连接模式中会打开可靠且连接的队列对。
使用数据报模式时,不可靠、断开的队列对不允许大于 InfiniBand 链接层 MTU 的数据包通过。IPoIB 层会在要传输的 IP 数据包顶部添加一个 4 字节的 IPoIB 标头。因此,IPoIB MTU 必须比 InfiniBand 链接层小 4 字节。因为在 InfiniBand 链接层 MTU 一般为 2048 字节,则数据报模式中的 IPoIB 设备则通常为 2044 字节。
使用连接模式时,可靠且连接的队列对类型允许大于 InfiniBand 链接层 MTU 的信息通过,同时在两端均采用主机适配器处理数据包片段并将其组合。这样使用连接模式时不会对通过 InfiniBand 适配器发送的 IPoIB 信息有大小限制,但 IP 数据包只有 16 个字节字段,因此最大字节数只能为 65535。最大允许的 MTU 实际较小,因为我们必须确定不同 TCP/IP 标头也适合这个大小限制。因此,连接模式中获得 IPoIB MTU 最大为 65520,这样可保证为所有需要的 TCP 标头提供足够的空间。
连接模式选项通常有较高性能,但也会消耗更多的内核内存。因为大多数系统考虑的是性能而不是用内存消耗,因此连接模式是最常用的用户模式。
但如果将系统配置为连接模式,它必须可以使用数据报模式发送多播流量(InfiniBand 交换机及结构无法使用连接模式传递多播流量),且可以在与未配置连接模式的主机通讯时返回数据报模式。管理员应意识到如果他们要运行发送多播数据的程序,且那些程序要以接口中的最大 MTU 发送多播数据,则需要将该接口配置为数据报操作,或者使用将多播程序配置为将其发送数据包大小限制在数据报允许的数据包范围内的其他方法。

9.6.3. 了解 IPoIB 硬件地址

IPoIB 设备有 20 字节的硬件地址。已弃用程序 ifconfig 无法读取全部 20 字节,因此不应再用来尝试并查找 IPoIB 设备的正确硬件地址。iproute 软件包中的 ip 程序可正常工作。
IPoIB 硬件地址的前四个字节是标签及队列对号码。接下来的八个字节是子网前缀。首次创建 IPoIB 后,会使用默认的子网前缀 0xfe:80:00:00:00:00:00:00。该设备在建立与子网管理器之间的联系前都会使用这个默认子网前缀(0xfe80000000000000)。建立联系后,它会重新设置子网前缀使其与子网管理器为其配置的前缀匹配。最后八位字节是 IPoIB 设备所连接 IPoIB 端口的 GUID 地址。因为前四个字节及随后的八位字节会随时更改,因此在为 IPoIB 接口指定硬件地址时不会使用这些字节进行匹配。第 9.3.3 节 “70-persistent-ipoib.rules 用法” 一节中论述了如何导出该地址,即在 udev 规则文件的 ATTR{address} 字段中不使用前 12 位字节以便设备映射会可靠。配置 IPoIB 接口时,该配置文件的 HWADDR 字段可包含所有 20 位字节,但只使用最后 8 位映射并查找配置文件指定的硬件。但如果在设备配置文件中的 TYPE=InfiniBand 条目拼写有误,且 ifup-ib 不是用来实际启动 IPoIB 接口的脚本,则系统会给出出错信息,说明该系统无法找到该配置指定的硬件。在 IPoIB 接口中,配置文件的 TYPE= 字段只能是 InfiniBand 或者 infiniband(该条目区分大小写,但该脚本不区分)。

9.6.4. 了解 InfiniBand P_Key 子网

使用不同 P_Key 子网可将 InfiniBand 结构采用逻辑分段的方式分为虚拟子网。这与在以太网接口中使用 VLAN 极其相似。所有交换机及主机均必须是默认 P_Key 子网中的成员,但管理员可以创建附加子网,并将该子网成员限制为该结构中主机或交换机的子网。主机可使用 P_Key 子网前必须使用子网管理器定义该子网。有关使用 opensm 子网管理器定义 P_Key 子网的详情,请查看 第 9.4.4 节 “创建 P_Key 定义” 一节。在 IPoIB 接口中,创建 P_Key 子网后,可为 P_Key 子网创建特殊的 IPoIB 配置文件。与在以太网设备中使用 VLAN 接口一样,每个 IPoIB 接口的行为都好像其处于与其他 IPoIB 接口完全不共的结构,他们共享同一链接,但使用不同的 P_Key 值。
对 IPoIB P_Key 的名称有特殊要求。所有 IPoIB P_Key 必须在 0x00000x7fff 的范围内,在高端字节中,0x8000 表示 P_Key 中的成员关系为完全成员,而不是部分成员。Linux 内核的 IPoIB 驱动程序只支持 P_Key 子网中的完全成员,因此在 Linux 无法连接的子网中总是要设置 P_Key 号的高端字节。就是说如果使用 Linux 系统的计算机加入 P_Key 0x0002,加入后,它的实际 P_Key 号码将会变为 0x8002,表示它是 P_Key 0x0002 的完全成员。因此,如 第 9.4.4 节 “创建 P_Key 定义”, 一节所述在 opensm partitions.conf 文件中创建 P_Key 定义时,要求制定不包含 0x8000P_Key 值,但在定义 Linux 客户端中的 P_Key IPoIB 接口时,则需要在 P_Key 指中添加 0x8000 值。