基于 InfiniBand 的 IP
IP over IB (IPoIB) ULP 驱动程序是一个基于 InfiniBand 的网络接口实现。IPoIB 通过 InfiniBand 数据报传输服务封装 IP 数据报。IPoIB 驱动程序 ib_ipoib 利用以下功能
通过子接口在 InfiniBand 网络上模拟 VLAN
通过绑定实现高可用性 (HA)
不同的 MTU 值
在数据报模式下高达 4k
使用任何 ConnectX® IB 端口(一个或两个)
在传出数据包上插入 IP/UDP/TCP 校验和
计算接收数据包上的校验和
支持通过 ConnectX® LSO 功能的网络设备 TSO,以将大型数据报分片为 MTU 量子。
IPoIB 还支持以下基于软件的增强功能
巨型接收卸载
NAPI
Ethtool 支持
增强型 IPoIB 功能可以将 ULP 基本功能卸载到较低的厂商特定驱动程序,以优化 IPoIB 数据路径。这将允许 IPoIB 支持多个无状态卸载,例如 RSS/TSS,并更好地利用支持的功能,从而使 IPoIB 数据报在带宽和延迟方面均达到峰值性能。
增强型 IPoIB 支持/执行以下操作
无状态卸载 (RSS, TSS)
多队列
中断节流
多分区优化
共享发送/接收工作队列
厂商特定优化
仅 UD 模式
物理端口 MTU(指示端口能力)默认值为 4k,而 IPoIB 端口 MTU(“逻辑” MTU)默认值为 2k,因为它由 OpenSM 设置。
要将 IPoIB MTU 更改为 4k,请在 IPoIB 设置部分编辑 OpenSM 分区文件,如下所示
Default=0xffff
, ipoib, mtu=5
: ALL=full;
其中
mtu=5
表示 Fabric 中的所有 IPoIB 端口均使用 4k MTU,(mtu=4
表示 2k MTU)
除非您已使用标志“-n”运行安装脚本 mlnxofedinstall,否则 IPoIB 尚未由安装程序配置。IPoIB 的配置需要为每个 HCA 端口分配一个 IP 地址和一个子网掩码,就像任何其他网络适配器卡一样(即,您需要为每个端口准备一个名为 ifcfg-ib<n> 的文件)。主机中第一个 HCA 上的第一个端口称为接口 ib0,第二个端口称为 ib1,依此类推。
IPoIB 配置可以基于 DHCP 或您需要提供的静态配置(见下文)。您还可以应用手动配置,该配置仅在下次重启或驱动程序重启之前持续有效(见下文)。
基于 DHCP 的 IPoIB 配置
基于 DHCP 设置 IPoIB 接口配置的方式与配置以太网接口类似。换句话说,您需要确保 IPoIB 配置文件包含以下行
对于 RedHat
BOOTPROTO=dhcp
对于 SLES
BOOTPROTO=
'dchp'
注意如果包含 IPoIB 配置文件,则
ifcfg-ib<n>
文件将安装在/etc/sysconfig/network-scripts/
(RedHat 机器上)/etc/sysconfig/network/
(SuSE 机器上)。
注意可能需要 DHCP 补丁才能支持 IPoIB。有关更多信息,请参阅
docs/dhcp/
目录下的 REAME 文件。注意红帽企业 Linux 7 支持为 InfiniBand IPoIB 接口分配静态 IP 地址。但是,由于这些接口没有正常的硬件以太网地址,因此必须使用不同的方法为 IPoIB 接口指定唯一标识符。标准是使用选项 dhcp-client-identifier= 构造来指定 IPoIB 接口的 dhcp-client-identifier 字段。DHCP 服务器主机构造最多支持每个主机节一个硬件以太网和一个 dhcp-client-identifier 条目。但是,可能存在多个固定地址条目,并且 DHCP 服务器将自动响应适合接收 DHCP 请求的网络的地址。
保存 MAC 地址的标准 DHCP 字段不够大,无法包含 IPoIB 硬件地址。为了克服这个问题,基于 InfiniBand 消息的 DHCP 传递了一个客户端标识符字段,用于标识 DHCP 会话。此客户端标识符字段可用于将 IP 地址与客户端标识符值关联,以便 DHCP 服务器将向任何传递此客户端标识符的客户端授予相同的 IP 地址。
客户端标识符字段的长度在规范中不是固定的。对于 NVIDIA OFED for Linux 软件包,建议 IPoIB 使用与 FlexBoot 用于此客户端标识符相同的格式。
DHCP 服务器
为了使 DHCP 服务器为客户端提供配置记录,需要创建一个合适的配置文件。默认情况下,DHCP 服务器在 /etc
下查找名为 dhcpd.conf
的配置文件。您可以编辑此文件或创建一个新文件,并使用 -cf 标志向 DHCP 服务器提供其完整路径(请参阅 docs/dhcpd.conf 中的文件示例)。
DHCP 服务器必须在已加载 IPoIB 模块的计算机上运行。要从命令行运行 DHCP 服务器,请输入
dhcpd <IB network interface
name> -d
示例
host1# dhcpd ib0 -d
DHCP 客户端 (可选)
如果您需要准备具有 IB 驱动程序的无盘机器,则可以使用 DHCP 客户端。
为了使用 DHCP 客户端标识符,您需要首先创建一个配置文件,该文件定义 DHCP 客户端标识符。
然后使用以下命令和此文件运行 DHCP 客户端
dhclient –cf <client conf file> <IB network interface
name>
ConnectX(PCI 设备 ID 26428)的配置文件示例,名为 dhclient.conf
The value indicates a hexadecimal number interface
"ib1"
{
send dhcp-client-identifier
ff:00
:00
:00
:00
:00
:02
:00
:00
:02
:c9:00
:00
:02
:c9:03
:00
:00
:10
:39
;
}
InfiniHost III Ex(PCI 设备 ID 25218)的配置文件示例,名为 dhclient.conf
The value indicates a hexadecimal number interface
"ib1"
{
send dhcp-client-identifier
20
:00
:55
:04
:01
:fe:80
:00
:00
:00
:00
:00
:00
:00
:02
:c9:02
:00
:23
:13
:92
;
}
host1# dhclient –cf dhclient.conf ib1
静态 IPoIB 配置
如果您希望使用不基于 DHCP 的 IPoIB 配置,则需要向安装脚本提供包含完整 IP 配置的配置文件(使用“-n”选项)。IPoIB 配置文件可以为 IPoIB 接口指定以下数据中的一项或两项
静态 IPoIB 配置
基于以太网配置的 IPoIB 配置
有关配置 IP 地址的其他信息,请参阅您的 Linux 发行版文档。
以下代码行是从示例 IPoIB 配置文件中摘录的
# Static settings; all values provided by this
file
IPADDR_ib0=10.4
.3.175
NETMASK_ib0=255.255
.0.0
NETWORK_ib0=10.4
.0.0
BROADCAST_ib0=10.4
.255.255
ONBOOT_ib0=1
# Based on eth0; each '*'
will be replaced with a corresponding octet
# from eth0.
LAN_INTERFACE_ib0=eth0
IPADDR_ib0=10.4
.'*'
.'*'
NETMASK_ib0=255.255
.0.0
NETWORK_ib0=10.4
.0.0
BROADCAST_ib0=10.4
.255.255
ONBOOT_ib0=1
# Based on the first eth<n> interface
that is found (for
n=0
,1
,...);
# each '*'
will be replaced with a corresponding octet from eth<n>.
LAN_INTERFACE_ib0=
IPADDR_ib0=10.4
.'*'
.'*'
NETMASK_ib0=255.255
.0.0
NETWORK_ib0=10.4
.0.0
BROADCAST_ib0=10.4
.255.255
ONBOOT_ib0=1
手动配置 IPoIB
此手动配置仅在下次重启或驱动程序重启之前持续有效。
要为默认 IB 分区 (VLAN) 手动配置 IPoIB,请执行以下步骤
通过输入带有以下项的 ifconfig 命令来配置接口
- 适当的 IB 接口(ib0、ib1 等)
- 您要分配给接口的 IP 地址
- netmask 关键字
- 您要分配给接口的子网掩码
以下示例显示了如何配置 IB 接口
host1$ ifconfig ib0
10.4
.3.175
netmask255.255
.0.0
(可选)通过输入带有适当接口标识符
ib#
参数的 ifconfig 命令来验证配置。以下示例显示了如何验证配置
host1$ ifconfig ib0 b0 Link encap:UNSPEC HWaddr
80
-00
-04
-04
-FE-80
-00
-00
-00
-00
-00
-00
-00
-00
-00
-00
inet addr:10.4
.3.175
Bcast:10.4
.255.255
Mask:255.255
.0.0
UP BROADCAST MULTICAST MTU:65520
Metric:1
RX packets:0
errors:0
dropped:0
overruns:0
frame:0
TX packets:0
errors:0
dropped:0
overruns:0
carrier:0
collisions:0
txqueuelen:128
RX bytes:0
(0.0
b) TX bytes:0
(0.0
b)在其余接口上重复前两个步骤。
您可以为主 IPoIB 接口创建子接口,以提供流量隔离。每个此类子接口(也称为子接口)都具有与主(父)接口不同的 IP 和网络地址。默认分区键 (PKey) ff:ff 应用于主(父)接口。
本节介绍如何
创建子接口
移除子接口
创建子接口
在以下过程中,ib0 用作 IB 子接口的示例。
要创建子接口(子接口),请按照此过程操作
确定要在子网中使用的 PKey(有效值可以是 0 或任何 16 位无符号值)。实际使用的 PKey 是一个 16 位数字,其中最高有效位已设置。例如,值 1 将给出值为 0x8001 的 PKey。
通过运行以下命令创建子接口
host1$ echo <PKey> > /sys/
class
/net/<IB subinterface>/create_child示例
host1$ echo
1
> /sys/class
/net/ib0/create_child这将创建接口 ib0.8001。
通过运行以下命令验证此接口的配置
host1$ ifconfig <subinterface>.<subinterface PKey>
使用上一步的示例
host1$ ifconfig ib0.
8001
ib0.8001
Link encap:UNSPEC HWaddr80
-00
-00
-4A-FE-80
-00
-00
-00
-00
-00
-00
-00
-00
-00
-00
BROADCAST MULTICAST MTU:2044
Metric:1
RX packets:0
errors:0
dropped:0
overruns:0
frame:0
TX packets:0
errors:0
dropped:0
overruns:0
carrier:0
collisions:0
txqueuelen:128
RX bytes:0
(0.0
b) TX bytes:0
(0.0
b)可以看出,该接口没有 IP 或网络地址。要配置这些地址,您应遵循上面“手动配置 IPoIB”部分中描述的手动配置过程。
为了能够使用此接口,需要配置子网管理器,以便识别所选的 PKey(它定义广播地址)。
移除子接口
要移除子接口(子接口),请运行
echo <subinterface PKey> /sys/class
/net/<ib_interface>/delete_child
使用上一章中第二步的示例
echo 0x8001
> /sys/class
/net/ib0/delete_child
请注意,删除接口时,您必须使用最高有效位已设置的 PKey 值(例如,上述示例中的 0x8000)。
要验证您的配置和 IPoIB 功能是否成功,请执行以下步骤
通过使用
ifconfig
命令验证 IPoIB 功能。以下示例显示了如何使用两个 IB 节点来验证 IPoIB 功能。在以下示例中,IB 节点 1 的地址为 10.4.3.175,IB 节点 2 的地址为 10.4.3.176
host1# ifconfig ib0
10.4
.3.175
netmask255.255
.0.0
host2# ifconfig ib010.4
.3.176
netmask255.255
.0.0
从 10.4.3.175 向 10.4.3.176 输入 ping 命令。
以下示例显示了如何输入 ping 命令
host1# ping -c
5
10.4
.3.176
PING10.4
.3.176
(10.4
.3.176
)56
(84
) bytes of data.64
bytes from10.4
.3.176
: icmp_seq=0
ttl=64
time=0.079
ms64
bytes from10.4
.3.176
: icmp_seq=1
ttl=64
time=0.044
ms64
bytes from10.4
.3.176
: icmp_seq=2
ttl=64
time=0.055
ms64
bytes from10.4
.3.176
: icmp_seq=3
ttl=64
time=0.049
ms64
bytes from10.4
.3.176
: icmp_seq=4
ttl=64
time=0.065
ms ---10.4
.3.176
ping statistics ---5
packets transmitted,5
received,0
% packet loss, time 3999ms rtt min/avg/max/mdev =0.044
/0.058
/0.079
/0.014
ms, pipe2
要为 ibX 和 bondX 接口创建接口配置文件脚本,您应使用标准语法(取决于您的操作系统)。
IPoIB 接口的绑定与以太网接口的绑定方式相同:通过 Linux 绑定驱动程序。
IPoIB 从接口的网络脚本文件以 IPoIB 接口命名(例如:ifcfg- ib0)
IPoIB 中唯一有意义的绑定策略是 HA(绑定模式编号 1 或主备模式)
绑定参数“fail_over_mac”在 IPoIB 接口中没有意义,因此,唯一支持的值是默认值:0
对于持久性绑定 IPoIB 网络配置,请使用相同的 Linux 网络脚本语义,但有以下例外/添加
在绑定主配置文件(例如:ifcfg-bond0)中,除了 Linux 绑定语义之外,还使用以下参数:MTU=65520
注意对于 IPoIB 从接口,请使用 MTU=2044。如果您未设置正确的 MTU 或根本未设置 MTU,则接口的性能可能会降低。
在绑定从配置文件(例如:ifcfg-ib0)中,使用相同的 Linux 网络脚本语义。特别是:DEVICE=ib0
在绑定从配置文件(例如:ifcfg-ib0.8003)中,当使用通过分区 (
p_key
) 配置的设备的绑定时,TYPE=InfiniBand 行是必需的对于 RHEL,请在
/etc/modprobe.b/bond.conf
中添加以下行alias bond0 bonding
对于 SLES 用户
有必要使用 IPoIB 从设备(例如 ib0、ib1 等)的名称更新
/etc/sysconfig/network/config
中的MANDATORY_DEVICES
环境变量。否则,绑定主接口可能会在启动时在 IPoIB 从接口之前创建。可以有多个 IPoIB 绑定主接口以及 IPoIB 绑定主接口和以太网绑定主接口的混合。但是,不可能在同一绑定主接口下混合以太网和 IPoIB 从接口。
重启 openibd 不会通过网络脚本保留绑定配置。您必须重启网络服务才能启动绑定主接口。保存配置后,通过运行 /etc/init.d/network restart 来重启网络服务。
动态 PKey 更改意味着可以在 SM 数据库中更改(添加/移除)PKey,并且附加到该 PKey 的接口会立即更新,而无需重启驱动程序。
如果 PKey 已由 SM 在端口中配置,则可以立即使用子接口。否则,仅当 SM 在创建子接口后将相关的 PKey 值添加到端口时,该接口才能使用。创建子接口后,无需其他配置。
此功能允许分布式实体之间通过网络进行精确同步。同步基于主设备和从设备之间的对称往返时间 (RTT)。
此功能默认启用,并且也支持通过 PKey 接口。
有关 PTP 功能的更多信息,请参阅 Running Linux PTP with ConnectX-4/ConnectX-5/ConnectX-6 社区帖子。
1PPS 是一种时间同步功能,允许适配器能够使用 SMA 连接器(SubMiniature A 型)在适配器卡上的专用引脚上发送或接收每秒 1 个脉冲。仅支持一个引脚,并且可以配置为 1PPS 输入或 1PPS 输出。