英语

基于 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 字节)。 例如,在具有 2K MTU 的典型 IB 结构中,IPoIB MTU 将为 2048 - 4 = 2044 字节。

在连接模式下,使用 IB RC(可靠连接)传输。 连接模式利用了 IB 传输的连接特性,并允许最大 IP 数据包大小高达 64K 的 MTU,这减少了处理大型 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 调节。

调试信息

通过使用设置为“y”的 CONFIG_INFINIBAND_IPOIB_DEBUG 编译 IPoIB 驱动程序,跟踪消息将被编译到驱动程序中。 通过将模块参数 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 的 IP (IPoIB) 的传输 (RFC 4391)

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

基于 InfiniBand 的 IP (IPoIB) 架构 (RFC 4392)

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

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

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