英文

InfiniBand 上的 IP

ib_ipoib 驱动程序是 IETF ipoib 工作组发布的 RFC 4391 和 4392 中规定的 InfiniBand 协议上的 IP 的实现。它是一个“原生”实现,将接口类型设置为 ARPHRD_INFINIBAND,硬件地址长度设置为 20 (早期的专有实现伪装成内核的以太网接口)。

分区和 P_Key

加载 IPoIB 驱动程序时,它会使用索引 0 处的 P_Key 为每个端口创建一个接口。要使用不同的 P_Key 创建接口,请将所需的 P_Key 写入主接口的 /sys/class/net/<intf name>/create_child 文件。例如

echo 0x8001 > /sys/class/net/ib0/create_child

这将创建一个名为 ib0.8001 的接口,其 P_Key 为 0x8001。要删除子接口,请使用“delete_child”文件

echo 0x8001 > /sys/class/net/ib0/delete_child

任何接口的 P_Key 都由“pkey”文件给出,子接口的主接口在“parent”中。

也可以使用 IPoIB 的 rtnl_link_ops 完成子接口的创建/删除,其中使用任何一种方式创建的子接口的行为都相同。

数据报模式与连接模式

IPoIB 驱动程序支持两种操作模式:数据报模式和连接模式。该模式通过接口的 /sys/class/net/<intf name>/mode 文件设置和读取。

在数据报模式下,使用 IB UD(不可靠数据报)传输,因此接口 MTU 等于 IB L2 MTU 减去 IPoIB 封装头(4 个字节)。例如,在典型的 MTU 为 2K 的 IB 结构中,IPoIB MTU 将为 2048 - 4 = 2044 字节。

在连接模式下,使用 IB RC(可靠连接)传输。连接模式利用 IB 传输的连接特性,并允许最大 MTU 达到 64K 的最大 IP 数据包大小,这减少了处理大型 UDP 数据报、TCP 段等所需的 IP 数据包数量,并提高了大型消息的性能。

在连接模式下,接口的 UD QP 仍然用于多播和与不支持连接模式的对等方的通信。在这种情况下,使用 ICMP PMTU 数据包的 RX 模拟,使网络堆栈为这些邻居使用较小的 UD MTU。

无状态卸载

如果 IB HW 支持 IPoIB 无状态卸载,IPoIB 会向网络堆栈通告 TCP/IP 校验和和/或大型发送 (LSO) 卸载功能。

还实现了大型接收 (LRO) 卸载,可以使用 ethtool 调用打开/关闭。目前,LRO 仅支持具有校验和卸载功能的设备。

无状态卸载仅在数据报模式下受支持。

中断缓和

如果底层 IB 设备支持 CQ 事件缓和,则可以使用 ethtool 设置中断缓解参数,从而减少处理中断产生的开销。 IPoIB 的主代码路径不使用事件进行 TX 完成信号,因此仅支持 RX 缓和。

调试信息

通过将 IPoIB 驱动程序与 CONFIG_INFINIBAND_IPOIB_DEBUG 设置为“y”进行编译,跟踪消息将被编译到驱动程序中。 通过将模块参数 debug_level 和 mcast_debug_level 设置为 1 来启用它们。这些参数可以在运行时通过 /sys/module/ib_ipoib/ 中的文件进行控制。

CONFIG_INFINIBAND_IPOIB_DEBUG 还在 debugfs 虚拟文件系统中启用文件。 通过挂载此文件系统,例如使用

mount -t debugfs none /sys/kernel/debug

可以从 /sys/kernel/debug/ipoib/ib0_mcg 等文件获取有关多播组的统计信息。

此选项的性能影响可以忽略不计,因此可以安全地启用此选项,并将 debug_level 设置为 0 以进行正常操作。

当 data_debug_level 设置为 1 时,CONFIG_INFINIBAND_IPOIB_DEBUG_DATA 在数据路径中启用更多的调试输出。但是,即使禁用了输出,启用此配置选项也会影响性能,因为它会向快速路径添加测试。

参考文献

InfiniBand (IPoIB) 上的 IP 传输 (RFC 4391)

http://ietf.org/rfc/rfc4391.txt

InfiniBand (IPoIB) 架构上的 IP (RFC 4392)

http://ietf.org/rfc/rfc4392.txt

InfiniBand 上的 IP:连接模式 (RFC 4755)

http://ietf.org/rfc/rfc4755.txt