InfiniBand

出自 ArchWiki

本页面解释了如何设置、诊断和基准测试 InfiniBand 网络。

简介

概述

InfiniBand(缩写为 IB)是 Ethernet 和 Fibre Channel 的替代方案。IB 提供高带宽和低延迟。IB 可以将数据从一台机器上的存储设备直接传输到另一台机器上的用户空间,绕过并避免系统调用的开销。与在 CPU 上运行的 Ethernet 网络协议不同,IB 适配器可以处理网络协议。这使得操作系统和 CPU 在进行高带宽传输时保持空闲,这对于 10Gb+ Ethernet 来说可能是一个真正的问题。

IB 硬件由 Mellanox(已与 Voltaire 合并,并得到 Oracle 的大力支持)和 Intel(于 2012 年收购了 QLogic 的 IB 部门)制造。Mellanox 于 2019 年被 Nvidia 收购。IB 最常用于超级计算机、集群和数据中心。IBM、HP 和 Cray 也是 InfiniBand 指导委员会的成员。Facebook、Twitter、eBay、YouTube 和 PayPal 都是 IB 用户的例子。

IB 软件是在 OpenFabrics 开源联盟 下开发的

价格合理的二手设备

由于大型企业从升级到更新版本中获益匪浅,被动 IB 布线的最大长度限制,主动 IB 布线的高成本,以及比 Ethernet 更复杂的技术设置,二手 IB 市场严重饱和,使得二手 IB 设备能够以经济实惠的价格用于家庭或小型企业的内部网络。

带宽

信号传输速率

IB 传输速率最初与 PCI Express(缩写为 PCIe)支持的最大速率相对应,后来,随着 PCIe 进展缓慢,传输速率与其他 I/O 技术相对应,并且每个端口的 PCIe 通道数量反而增加。它最初使用 SDR(单倍数据速率),信号速率为每通道 2.5Gb/s(与 PCI Express v1.0 相对应),并添加了:DDR(双倍数据速率),速率为 5Gb/s(PCI Express v2.0);QDR(四倍数据速率),速率为 10Gb/s(与 PCI Express 3.0 的吞吐量相匹配,改进了 PCIe 3.0 的编码而不是信号速率);以及 FDR(十四倍数据速率),速率为 14.0625Gbps(与 16GFC Fibre Channel 相匹配)。IB 现在提供 EDR(增强数据速率),速率为 25Gb/s(与 25Gb Ethernet 相匹配)。计划在 2017 年左右推出 HDR(高数据速率),速率为 50Gb/s。

有效吞吐量

由于 SDR、DDR 和 QDR 版本使用 8/10 编码(8 位数据占用 10 位信令),因此这些版本的有效吞吐量降低至 80%:SDR 为 2Gb/s/链路;DDR 为 4Gb/s/链路;QDR 为 8Gb/s/链路。从 FDR 开始,IB 使用 64/66 编码,允许更高的有效吞吐量与信令速率比率,达到 96.97%:FDR 为 13.64Gb/s/链路;EDR 为 24.24Gb/s/通道;HDR 为 48.48Gb/s/链路。

IB 设备能够通过多个链路发送数据,尽管商业产品标准化为每个电缆 4 个链路。

当使用常见的 4X 链路设备时,这实际上允许的总有效吞吐量为:SDR 为 8Gb/s;DDR 为 16Gb/s;QDR 为 32Gb/s;FDR 为 54.54Gb/s;EDR 为 96.97Gb/s;HDR 为 193.94Gb/s。

延迟

IB 的延迟非常小:SDR (5us);DDR (2.5us);QDR (1.3us);FDR (0.7us);EDR (0.5us);HDR (< 0.5us)。相比之下,10Gb Ethernet 更像是 7.22us,是 FDR 延迟的十倍多。

向后兼容性

IB 设备几乎总是向后兼容的。连接应以最低的共同标准建立。为 PCI Express 8x 插槽设计的 DDR 适配器应在 PCI Express 4x 插槽中工作(带宽减半)。

线缆

IB 无源铜缆在使用 QDR 时最长可达 7 米,使用 FDR 时最长可达 3 米。

IB 有源光纤(光学)线缆在使用 FDR 时最长可达 300 米(在 FDR10 上仅为 100 米)。

Mellanox MetroX 设备存在,允许长达 80 公里的连接。延迟每公里增加约 5us。

IB 电缆可用于直接连接两台计算机,而无需交换机;IB 交叉电缆不存在。

术语

硬件

适配器、交换机、路由器和网桥/网关必须专门为 IB 制造。

HCA(主机通道适配器)
类似于 Ethernet NIC(网络接口卡)。将 IB 电缆连接到 PCI Express 总线,如果使用适当世代的 HCA,则以总线的全速连接。IB 网络上的终端节点,执行传输级功能,并支持 IB verbs 接口。
交换机
类似于 Ethernet NIC。在同一 IB 子网上将数据包从一个链路移动到另一个链路。
路由器
类似于 Ethernet 路由器。在不同的 IB 子网之间移动数据包。
网桥/网关
独立的硬件设备,或执行此功能的计算机。桥接 IB 和 Ethernet 网络。

GUID

类似于 Ethernet MAC 地址,但一个设备有多个 GUID。由硬件制造商分配,并在重启后保持不变。64 位地址(24 位制造商前缀和 40 位设备标识符)。赋予适配器、交换机、路由器和网桥/网关。

节点 GUID
标识 HCA、交换机或路由器
端口 GUID
标识 HCA、交换机或路由器上的端口(即使 HCA 通常有多个端口)
系统 GUID
允许将多个 GUID 视为一个实体
LID(本地标识符)
16 位地址,由子网管理器在被子网管理器拾取时分配。用于路由数据包。重启后不持久。

网络管理

SM(子网管理器)
主动管理 IB 子网。可以作为连接到 IB 网络的计算机上的软件程序实现,内置于 IB 交换机中,或作为专门的 IB 设备实现。初始化和配置子网上的一切,包括分配 LID(本地标识符)。建立通过子网的流量路径。隔离故障。防止未经授权的子网管理器。您可以在一个子网上拥有多个交换机,都在一个子网管理器下。您可以在一个子网上拥有冗余子网管理器,但一次只能有一个处于活动状态。
MAD(管理数据报)
子网管理器与 IB 设备通信的标准消息格式,由 UD(不可靠数据报)承载。
UD(不可靠数据报)

安装

首先安装 rdma-core,其中包含所有核心库和守护程序。

升级固件

运行最新的固件可以显著提高性能,并修复连接问题。

警告: 请小心操作,否则设备可能会变砖!

适用于 Mellanox

  • 安装 mstflintAUR
  • 确定您的适配器的 PCI 设备 ID(在本例中,“05:00.0”是适配器的 PCI 设备 ID)
$ lspci | grep Mellanox
05:00.0 InfiniBand: Mellanox Technologies MT25418 [ConnectX VPI PCIe 2.0 2.5GT/s - IB DDR / 10GigE] (rev a0)
  • 确定您的适配器具有的固件版本,以及适配器的 PSID(比仅型号更具体 - 特定于兼容的修订集)
# mstflint -d <adapter PCI device ID> query
...
FW Version:      2.7.1000
...
PSID:            MT_04A0110002
  • 检查最新的固件版本
    • 访问 Mellanox 的固件下载页面(本指南结合了此链接的“固件烧录说明”,使用其 mstflint 选项)
    • 选择您拥有的设备类别
    • 在他们的列表中找到您设备的 PSID,mstflint 给了您
    • 检查固件映像文件名,看看它是否比您的适配器的 FW 版本更新,例如 fw-25408-2_9_1000-MHGH28-XTC_A1.bin.zip,版本为 2.9.1000
  • 如果有更新的版本,请下载新固件并将其烧录到您的适配器
$ unzip <firmware .bin.zip file name>
# mstflint -d <adapter PCI device ID> -i <firmware .bin file name> burn

适用于 Intel/QLogic

Intel 下载中心 搜索型号(或子字符串),并按照说明操作。下载的软件可能需要在 RHEL/CentOS 或 SUSE/OpenSUSE 上运行。

内核模块

编辑 /etc/rdma/modules/rdma.conf/etc/rdma/modules/infiniband.conf 以符合您的喜好。然后加载这些文件中编写的内核模块,例如 ib_ipoib,或者只需重启系统。(虽然应该没有必要这样做,但如果内核模块未正确加载,请启动启用 rdma-load-modules@rdma.servicerdma-load-modules@infiniband.service。重启系统即可)。

注意: 由于内核堆栈的处理方式,对 /etc/rdma/modules/rdma.conf 的更改仅在每次启动时生效一次,即首次启动 rdma-load-modules@*.service 时。重启 rdma-load-modules@*.service 无效。

子网管理器

每个 IB 网络至少需要一个子网管理器。没有子网管理器,设备可能会显示有链路,但永远不会从 Initializing 状态更改为 Active 状态。子网管理器通常(通常每 5 或 30 秒)检查网络中是否有新的适配器,并将它们添加到路由表中。如果您有带有嵌入式子网管理器的 IB 交换机,则可以使用它,也可以禁用它并使用软件子网管理器代替。也存在专用的 IB 子网管理器设备。

启用端口

如果端口处于物理状态 Sleep(可以使用 ibstat 验证),则首先需要运行 ibportstate --Direct 0 1 enable 来唤醒它。如果链路两端的端口都处于休眠状态,则可能需要在启动时自动执行此操作。

软件子网管理器

在一个系统上

  • 安装 opensmAUR
  • 更正 systemd 文件 /usr/lib/systemd/system/opensm.service,如下所示。
  • 启动启用 opensm.service

当前 opensm 的 opensm 配置与 RDMA 的 systemd 配置不兼容。也就是说,编辑 /usr/lib/systemd/system/opensm.service 中的 2 行,如下所示(注释掉的是原始内容)。

# /usr/lib/systemd/system/opensm.service
Requires=rdma-load-modules@rdma.service # Requires=rdma.service
After=rdma-load-modules@rdma.service # After=rdma.service

现在,您所有连接的 IB 端口都应处于 Active 端口状态和 LinkUp 物理状态。您可以通过运行 ibstat 来检查这一点。

$ ibstat
... (look at the ports shown you expect to be connected)
State: Active
Physical state: LinkUp
...

或通过检查 /sys 文件系统

$ cat /sys/class/infiniband/kernel_module/ports/port_number/phys_state
5: LinkUp
$ cat /sys/class/infiniband/kernel_module/ports/port_number/state
4: ACTIVE

TCP/IP (IPoIB)

您可以创建一个在 HCA 上运行的虚拟 Ethernet 适配器。这旨在使设计为与 TCP/IP 而不是 IB 一起工作的程序可以(间接地)使用 IB 网络。由于所有流量都通过正常的 TCP 堆栈发送,性能会受到负面影响;需要系统调用、内存复制和网络协议在 CPU 而不是 HCA 上运行。

当加载模块 ib_ipoib 时,IB 接口将出现。使其出现的简单配置是在 /etc/rdma/modules/infiniband.conf 中添加行 ib_ipoib,然后重启系统。在加载模块 ib_ipoib 的系统启动后,应使用命令 ip link 确认名称类似于 ibp16s0 的链路。

可以对 IB 接口进行详细配置(例如,将其命名为 ib0 并分配 IP 地址,就像传统的 Ethernet 适配器一样)。

连接模式

IPoIB 可以在数据报(默认)或连接模式下运行。连接模式允许您设置更高的 MTU,但对于短消息,TCP 延迟比数据报模式增加约 5%。

要查看当前使用的模式

$ cat /sys/class/net/interface/mode

注意: ConnectX-6(或更新版本)Mellanox 卡不再支持连接模式。

MTU

在数据报模式下,使用 UD(不可靠数据报)传输,这通常强制 MTU 为 2044 字节。从技术上讲,对于 IB L2 MTU - IPoIB 封装标头为 4 字节,通常为 2044 字节。

在连接模式下,使用 RC(可靠连接)传输,这允许 MTU 高达最大 IP 数据包大小 65520 字节。

要查看您的 MTU

$ ip link show interface

微调连接模式和 MTU

如果您想更改默认连接模式和/或 MTU,则只需要 ipoibmodemtu

不同的设置将看到不同的结果。有些人通过使用 connected 模式和 MTU 65520 看到巨大的(双倍以上)速度提升,而少数人看到的速度几乎相同甚至更差。使用 qperfiperf 来微调您的系统。

使用本文中给出的 qperf 示例,以下是来自具有各种微调的 SDR 网络(理论上为 8 Gb/s)的示例结果

模式 MTU MB/s us 延迟
数据报 2044 707 19.4
已连接 2044 353 18.9
已连接 65520 726 19.6
提示: 对整个子网使用相同的连接和 MTU 设置。混合和匹配无法获得最佳效果。

Soft RoCE (RXE)

Soft ROCE 是 RoCE 的软件实现,允许在任何 ethernet 适配器上使用 Infiniband。

  • 安装 iproute2
  • 运行 rdma link add rxe_eth0 type rxe netdev ethN 以在 ethernet 设备 ethN 上配置 RXE 实例。

您现在应该有一个 rxe0 设备

# rdma link
link rxe_eth0/1 state ACTIVE physical_state LINK_UP netdev enp1s0

远程数据存储

您可以使用 iSCSI、带有 iSER 的 iSCSI 或 SRP,通过 IB 网络将物理或虚拟设备从目标(主机/服务器)共享到启动器(访客/客户端)系统。这些方法与传统文件共享(即 SambaNFS)不同,因为启动器系统将共享设备视为其自己的块级设备,而不是传统挂载的网络共享文件夹。即 fdisk /dev/block_device_id, mkfs.btrfs /dev/block_device_id_with_partition_number

缺点是每次只能有一个系统使用每个共享设备;尝试在目标系统或其他启动器系统上挂载共享设备将失败(启动器系统当然可以在其上运行传统的文件共享)。

优点是更快的带宽、更多的控制,甚至可以让启动器的根文件系统物理上位于远程(远程启动)。

targetcli

targetcli 的作用类似于 shell,它将其复杂的(不值得手动创建的)/etc/target/saveconfig.json 表示为伪文件系统。

安装和使用

在目标系统上

targetcli

  • 在任何伪目录中,您可以运行 help 以查看该伪目录中可用的命令,或运行 help command(如 help create)以获得更详细的帮助
  • 制表符补全也适用于许多命令
  • 运行 ls 以查看当前伪目录及其下方的整个伪文件系统

创建后端存储

进入配置 shell

# targetcli

targetcli 中,为每个要共享的设备或虚拟设备设置一个后端存储

  • 要共享实际的块设备,请运行:cd /backstores/block;和 create name dev
  • 要共享文件作为虚拟块设备,请运行:cd /backstores/fileio;和 create name file
  • 要共享物理 SCSI 设备作为直通,请运行:cd /backstores/pscsi;和 create name dev
  • 要共享 RAM 磁盘,请运行:cd /backstores/ramdisk;和 create name size
  • 其中 name 是后端存储的名称
  • 其中 dev 是要共享的块设备(即 /dev/sda/dev/sda4/dev/disk/by-id/XXX 或 LVM 逻辑卷 /dev/vg0/lv1
  • 其中 file 是要共享的文件(即 /path/to/file
  • 其中 size 是要创建的 RAM 磁盘的大小(即 512MB、20GB)

iSCSI

iSCSI 允许通过网络使用存储设备和虚拟存储设备。对于 IB 网络,存储可以通过 IPoIB 或 iSER 工作。

iSCSI TargetiSCSI InitiatoriSCSI Boot 文章有很多重叠之处,但由于很多内容需要针对通过 IB 的使用进行自定义,因此将讨论必要性。

通过 IPoIB

首先执行目标系统说明,这将指导您何时临时切换到启动器系统说明。

  • 在目标系统上,对于您要共享的每个设备或虚拟设备,在 targetcli
    • 创建一个后端存储
    • 对于每个后端存储,创建一个 IQN(iSCSI Qualified Name)(其他系统的配置将存储视为的名称)
      • 运行:cd /iscsi;和 create。它将为您提供一个随机生成的目标名称,例如 iqn.2003-01.org.linux-iscsi.hostname.x8664:sn.3d74b8d4020a
      • 设置 TPG(目标门户组),在上一步中自动创建为 tpg1
        • 创建一个 lun(逻辑单元号)
          • 运行:cd randomly_generated_target_name/tpg1/luns;和 create storage_object。其中 storage_object 是现有存储对象的完整路径,例如 /backstores/block/name
        • 创建一个 acl(访问控制列表)
          • 运行:cd ../acls;和 create wwn,其中 wwn 是启动器系统的 IQN(iSCSI Qualified Name),也称为其(World Wide Name)
            • 通过在启动器系统上运行(不是此目标系统):(在其上安装 open-iscsi 后)cat /etc/iscsi/initiatorname.iscsi 来获取 wwn
    • 通过运行以下命令保存并退出:cd /saveconfig;和 exit
  • 在启动器系统上
    • 安装 open-iscsi
    • 此时,您可以获取此启动器系统的 IQN(iSCSI Qualified Name),也称为其 wwn(World Wide Name),用于设置目标系统的 luns
      • pacman 应显示 >>> Setting Initiatorname wwn
      • 否则,运行:cat /etc/iscsi/initiatorname.iscsi 以查看 InitiatorName=wwn
    • 启动启用 iscsid.service
    • 要自动登录到启动时发现的目标,在发现目标之前,编辑 /etc/iscsi/iscsid.conf 以设置 node.startup = automatic
    • 发现在线目标。以 root 身份运行 iscsiadm -m discovery -t sendtargets -p portal,其中 portal 是 IP(v4 或 v6)地址或主机名
      • 如果使用主机名,请确保它路由到 IB IP 地址而不是 Ethernet - 仅使用 IB IP 地址可能更有益
    • 要自动登录到启动时发现的目标,启动启用 iscsi.service
    • 要手动登录到发现的目标,以 root 身份运行 iscsiadm -m node -L all
    • 查看为每个登录的目标分配的块设备 ID。以 root 身份运行 iscsiadm -m session -P 3 | grep Attached。块设备 ID 将是每个目标的树中的最后一行(-P 是打印命令,其选项是详细级别,只有级别 3 列出块设备 ID)

通过 iSER

iSER(用于 RDMA 的 iSCSI 扩展)利用 IB 的 RDMA 协议,而不是使用 TCP/IP。它消除了 TCP/IP 开销,并提供更高的带宽、零复制时间、更低的延迟和更低的 CPU 利用率。

按照 通过 IPoIB 的 iSCSI 说明进行操作,并进行以下更改

  • 如果您愿意,除了安装 IPoIB,您还可以只安装 RDMA 以加载内核模块
  • 在目标系统上,在完成所有其他设置后,仍在 targetcli 中,在目标上启用 iSER
    • 对于每个您希望使用 iSER 而不是 IPoIB 的 iqn,运行 cd /iscsi/iqn/tpg1/portals/0.0.0.0:3260
      • 其中 iqn 是随机生成的目标名称,例如 iqn.2003-01.org.linux-iscsi.hostname.x8664:sn.3d74b8d4020a
    • 运行 enable_iser true
    • 通过运行以下命令保存并退出:cd /saveconfig;和 exit
  • 在启动器系统上,当运行 iscsiadm 来发现在线目标时,使用附加参数 -I iser,当您登录它们时,您应该看到:Logging in to [iface: iser...

添加到 /etc/fstab

上次发现目标时,必须已启用自动登录。

将您的挂载条目添加到 /etc/fstab,就像它是本地块设备一样,除了添加 _netdev 选项以避免在网络初始化之前尝试挂载它。

网络分段

本文或章节需要扩充。

原因: 更详细地解释,并提供示例(在 Talk:InfiniBand 中讨论)

IB 子网可以为不同的客户或应用程序进行分区,从而提供安全性和服务质量保证。每个分区都由 PKEY(分区键)标识。

SDP(Sockets Direct Protocol)

使用 librdmacm(rsockets 和 libspd 的后继者)和 LD_PRELOAD 来拦截非 IB 程序的套接字调用,并透明地(对程序而言)通过 RDMA 在 IB 上发送它们。大大加快了为 TCP/IP 构建的程序的速度,远远超过使用 IPoIB 所能达到的速度。它避免了更改程序源代码以与 IB 一起工作的需要,甚至可以用于闭源程序。它不适用于静态链接套接字库的程序。

诊断和基准测试

所有 IB 特定工具都包含在 rdma-coreibutilsAUR 中。

ibstat - 查看计算机的 IB GUID

ibstat 将显示您在其上运行的计算机中每个 IB 适配器的详细信息,包括:型号;端口数;固件和硬件版本;节点、系统映像和端口 GUID;以及端口状态、物理状态、速率、基本 lid、lmc、SM lid、功能掩码和链路层。

$ ibstat
CA 'mlx4_0'
        CA type: MT25418
        Number of ports: 2
        Firmware version: 2.9.1000
        Hardware version: a0
        Node GUID: 0x0002c90300002f78
        System image GUID: 0x0002c90300002f7b
        Port 1:
                State: Active
                Physical state: LinkUp
                Rate: 20
                Base lid: 3
                LMC: 0
                SM lid: 3
                Capability mask: 0x0251086a
                Port GUID: 0x0002c90300002f79
                Link layer: InfiniBand
        Port 2:
                State: Down
                Physical state: Polling
                Rate: 10
                Base lid: 0
                LMC: 0
                SM lid: 0
                Capability mask: 0x02510868
                Port GUID: 0x0002c90300002f7a
                Link layer: InfiniBand

此示例显示 Mellanox Technologies (MT) 适配器。它报告了 PCI 设备 ID (25418),而不是型号或部件号。它显示状态为“Active”,这意味着它已正确连接到子网管理器。它显示物理状态为“LinkUp”,这意味着它通过电缆具有电气连接,但不一定正确连接到子网管理器。它显示总速率为 20 Gb/s(对于此卡,这来自 5.0 Gb/s 信令速率和 4 个虚拟通道)。它显示子网管理器为端口分配了 lid 3。

ibhosts - 查看 IB 网络上的所有主机

ibhosts 将显示 IB 网络上每个主机的节点 GUID、端口数和设备名称。

# ibhosts
Ca      : 0x0002c90300002778 ports 2 "MT25408 ConnectX Mellanox Technologies"
Ca      : 0x0002c90300002f78 ports 2 "hostname mlx4_0"

ibswitches - 查看 IB 网络上的所有交换机

ibswitches 将显示 IB 网络上每个交换机的节点 GUID、端口数和设备名称。如果您仅使用直接连接运行,它将不显示任何内容。

# ibswitches

iblinkinfo - 查看 IB 网络上的链路信息

iblinkinfo 将显示设备名称、端口 GUID、虚拟通道数、信号传输速率、状态、物理状态以及它连接到的内容。

# iblinkinfo
CA: MT25408 ConnectX Mellanox Technologies:
      0x0002c90300002779      4    1[  ] ==( 4X           5.0 Gbps Active/  LinkUp)==>       3    1[  ] "kvm mlx4_0" ( )
CA: hostname mlx4_0:
      0x0002c90300002f79      3    1[  ] ==( 4X           5.0 Gbps Active/  LinkUp)==>       4    1[  ] "MT25408 ConnectX Mellanox Technologies" ( )

此示例显示两个适配器直接连接而没有交换机,使用 5.0 Gb/s 信号传输速率 和 4 个虚拟通道 (4X)。

ibping - Ping 另一个 IB 设备

ibping 将尝试 ping 另一个 IB GUID。ibping 必须在一台计算机上以服务器模式运行,在另一台计算机上以客户端模式运行。

ibping 必须在一台计算机上以服务器模式运行。

# ibping -S

并在另一台计算机上以客户端模式运行。它正在 ping 特定端口,因此它不能接受 CA 名称,或节点或系统 GUID。它需要带有端口 GUID 的 -G 或带有 Lid 的 -L

# ibping -G 0x0002c90300002779
-or-
# ibping -L 1
Pong from hostname.(none) (Lid 1): time 0.053 ms
Pong from hostname.(none) (Lid 1): time 0.074 ms
^C
--- hostname.(none) (Lid 4) ibping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1630 ms
rtt min/avg/max = 0.053/0.063/0.074 ms

如果您正在运行 IPoIB,则可以使用常规 ping,它通过 TCP/IP 堆栈进行 ping。ibping 使用 IB 接口,并且不使用 TCP/IP 堆栈。

ibdiagnet - 显示整个子网的诊断信息

ibdiagnet 将显示您子网上可能存在的问题。您可以不带选项运行它。-lw <1x|4x|12x> 指定计算机适配器预期的链路宽度(虚拟通道数),以便它可以检查是否按预期运行。-ls <2.5|5|10> 指定计算机适配器预期的链路速度(信令速率),以便它可以检查是否按预期运行,但它尚不支持 FDR+ 设备的快于 10 的选项。-c <count> 覆盖要发送的默认数据包数 10。

# ibdiagnet -lw 4x -ls 5 -c 1000
Loading IBDIAGNET from: /usr/lib/ibdiagnet1.5.7
-W- Topology file is not specified.
    Reports regarding cluster links will use direct routes.
Loading IBDM from: /usr/lib/ibdm1.5.7
-I- Using port 1 as the local port.
-I- Discovering ... 2 nodes (0 Switches & 2 CA-s) discovered.

-I---------------------------------------------------
-I- Bad Guids/LIDs Info
-I---------------------------------------------------
-I- No bad Guids were found

-I---------------------------------------------------
-I- Links With Logical State = INIT
-I---------------------------------------------------
-I- No bad Links (with logical state = INIT) were found

-I---------------------------------------------------
-I- General Device Info
-I---------------------------------------------------

-I---------------------------------------------------
-I- PM Counters Info
-I---------------------------------------------------
-I- No illegal PM counters values were found

-I---------------------------------------------------
-I- Links With links width != 4x (as set by -lw option)
-I---------------------------------------------------
-I- No unmatched Links (with width != 4x) were found

-I---------------------------------------------------
-I- Links With links speed != 5 (as set by -ls option)
-I---------------------------------------------------
-I- No unmatched Links (with speed != 5) were found

-I---------------------------------------------------
-I- Fabric Partitions Report (see ibdiagnet.pkey for a full hosts list)
-I---------------------------------------------------
-I-    PKey:0x7fff Hosts:2 full:2 limited:0

-I---------------------------------------------------
-I- IPoIB Subnets Check
-I---------------------------------------------------
-I- Subnet: IPv4 PKey:0x7fff QKey:0x00000b1b MTU:2048Byte rate:10Gbps SL:0x00
-W- Suboptimal rate for group. Lowest member rate:20Gbps > group-rate:10Gbps

-I---------------------------------------------------
-I- Bad Links Info
-I- No bad link were found
-I---------------------------------------------------
----------------------------------------------------------------
-I- Stages Status Report:
    STAGE                                    Errors Warnings
    Bad GUIDs/LIDs Check                     0      0     
    Link State Active Check                  0      0     
    General Devices Info Report              0      0     
    Performance Counters Report              0      0     
    Specific Link Width Check                0      0     
    Specific Link Speed Check                0      0     
    Partitions Check                         0      0     
    IPoIB Subnets Check                      0      1     

Please see /tmp/ibdiagnet.log for complete log
----------------------------------------------------------------
 
-I- Done. Run time was 0 seconds.

qperf - 测量 RDMA 或 TCP/IP 性能

qperf 可以测量 RDMA(SDP、UDP、UD 和 UC)或 TCP/IP(包括 IPoIB)的带宽和延迟

qperf 必须在一台计算机上以服务器模式运行。

$ qperf

并在另一台计算机上以客户端模式运行。SERVERNODE 可以是主机名,或者对于 IPoIB,可以是 TCP/IP 地址。有很多测试。下面是一些最有用的测试。

$ qperf SERVERNODE [OPTIONS] TESTS

IPoIB 上的 TCP/IP

$ qperf 192.168.2.2 tcp_bw tcp_lat
tcp_bw:
    bw  =  701 MB/sec
tcp_lat:
    latency  =  19.8 us

iperf - 测量 TCP/IP 性能

iperf 不是一个 IB 感知的程序,旨在测试 TCP/IP 或 UDP。即使 qperf 可以使用 IPoIB 测试您的 IB TCP/IP 性能,iperf 仍然是您可以使用的另一个程序。

iperf 必须在一台计算机上以服务器模式运行。

$ iperf3 -s

并在另一台计算机上以客户端模式运行。

$ iperf3 -c 192.168.2.2
[  4] local 192.168.2.1 port 20139 connected to 192.168.2.2 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec   639 MBytes  5.36 Gbits/sec                  
...
[  4]   9.00-10.00  sec   638 MBytes  5.35 Gbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.00  sec  6.23 GBytes  5.35 Gbits/sec                  sender
[  4]   0.00-10.00  sec  6.23 GBytes  5.35 Gbits/sec                  receiver

iperf Done.

iperf 以 10 为底的 GB 为单位显示传输量,以 2 为底的 GB 为单位显示带宽。所以,这个例子显示 10 秒内传输了 6.23GB(以 10 为底)。即 10 秒内传输了 6.69GB(以 2 为底)。(6.23 * 2^30 / 10^9) 这是 5.35 Gb/s(以 2 为底),如 iperf 所示。(6.23 * 2^30 / 10^9 * 8 / 10) 这是 685 MB/s(以 2 为底),这大致是 qperf 报告的速度。(6.23 * 2^30 / 10^9 * 8 / 10 * 1024 / 8)

常见问题 / FAQ

连接问题

链接、物理状态和端口状态

  • 查看系统是否识别 IB 硬件模块。如果您有 Intel 适配器,您将必须在此处使用 Intel,并在有其他 Intel 硬件的情况下浏览几行
# dmesg | grep -Ei "Mellanox|InfiniBand|QLogic|Voltaire"
[    6.287556] mlx4_core: Mellanox ConnectX core driver v2.2-1 (Feb, 2014)
[    8.686257] <mlx4_ib> mlx4_ib_add: mlx4_ib: Mellanox ConnectX InfiniBand driver v2.2-1 (Feb 2014)
$ ls -l /sys/class/infiniband
mlx4_0 -> ../../devices/pci0000:00/0000:00:03.0/0000:05:00.0/infiniband/mlx4_0

如果未显示任何内容,则您的内核无法识别您的适配器。此示例大致显示了如果您有 Mellanox ConnectX 适配器(使用 mlx4_0 内核模块)将看到的内容。

  • 检查端口和物理状态。运行 ibstat 或检查 /sys
$ ibstat
(look at the port shown that you expect to be connected)

$ cat /sys/class/infiniband/<kernel module>/ports/<port number>/phys_state
 5: LinkUp
$ cat /sys/class/infiniband/<kernel module>/ports/<port number>/state
 4: ACTIVE

物理状态应为“LinkUp”。如果不是,则您的电缆可能未插入、未连接到另一端的任何设备或已损坏。(端口)状态应为“Active”。如果它是“Initializing”或“INIT”,则您的 子网管理器 不存在、未运行或未将端口添加到网络的路由表中。

  • 您是否可以成功 ibping(直接使用 IB,而不是 IPoIB)?如果您正在运行 IPoIB,您是否可以成功 ping

getaddrinfo failed: Name or service not known

  • 运行 ibhosts 以查看每行末尾引号中的 CA 名称。

速度问题

  • 首先仔细检查您的期望。

您是如何确定您有速度问题的?您是否正在使用 qperfiperf,它们都将数据传输到内存和从内存传输,而不是硬盘驱动器。或者,您是否正在基准测试实际的文件传输,这依赖于您的硬盘驱动器?除非您使用 RAID 来提高速度,否则即使在 2015 年中期可用的最快的 SSD,单个硬盘驱动器(甚至有时是多个硬盘驱动器)也会成为您 IB 传输速度的瓶颈。您正在使用 RDMA 还是通过 IPoIB 的 TCP/IP?如果是这样,使用 IPoIB 而不是 RDMA 会有性能损失

$ ibstat
(look at the Rate shown on the port you are using)

# iblinkinfo
(look at the middle part formatted like "4X     5.0 Gbps")

$ cat /sys/class/infiniband/<kernel module>/ports/<port number>/rate
20 Gb/sec (4X DDR)

这是否与您预期的 带宽和虚拟通道数 相符?

# ibdiagnet -lw <expected number of virtual lanes -ls <expected signaling rate> -c 1000