Mellanox IB 网卡驱动安装
介绍
    
     
    
    
- InfiniBand (IB) 是一种用于高性能计算的计算机网络通信标准,具有极高的吞吐量和极低的延迟
- 2019 年 3 月 11 日 NVIDIA 以 69 亿美元收购 Mellanox
- 因此,Mellanox 网卡的驱动是在 NVIDIA 的官网下载的
 
- OFED(OpenFabrics Enterprise Distribution)是用于 RDMA 和内核绕过(kernel bypass)的开源软件应用(参考)
检查是否安装
$ lspci -v | grep Mellanox
安装
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
- 下载驱动网页:https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/
- 收购前的地址 http://www.mellanox.com -> Software->InfiniBand Drivers|LEARN MORE->NVIDIA MLNX_OFED->Download-> 依次选择 CentOS7.9 x86_64 获取下载链接
 
- 下载驱动并安装(参考)
# 下载与解压
wget https://content.mellanox.com/ofed/MLNX_OFED-5.5-1.0.3.2/MLNX_OFED_LINUX-5.5-1.0.3.2-rhel7.9-x86_64.tgz
tar -zxvf MLNX_OFED_LINUX-5.5-1.0.3.2-rhel7.9-x86_64.tgz
cd MLNX_OFED_LINUX-5.5-1.0.3.2-rhel7.9-x86_64
# 查看支持的内核版本
cat .supported_kernels
# 依赖安装
yum install libusbx lsof tcl tcsh tk
# 安装
./mlnxofedinstall
# 若 kernel 不支持,添加新编译
./mlnxofedinstall --add-kernel-support
# 重启驱动
/etc/init.d/openibd restart
./uninstall.sh
openibd
- openibd是网卡需要的 daemon 程序,并且会给内核加载需要的- mod- 
- 每个机器都需要运行
- 查看加载的 rdma 内核模块 lsmod | grep rdma
 
- 所有机器需要启动 openibd,service openibd start
OpenSM
# CentOS
yum install opensm
# Ubuntu
apt install opensm
- 配置 /etc/rdma/opensm.conf
- 若子网中有多个子网管理器,可以设置 PRIORITY参数设置优先级
- 分区使管理员能够在- InfiniBand上创建与以太网- VLAN类似的子网- 
- 如果使用特定速度(如 40 Gbps)定义分区,该分区中的所有主机必须至少支持这个速度。如果主机没有满足速度要求,就无法加入该分区
- linux 在 /etc/rdma/partitions.conf中配置分区
 
 
- 启动
systemctl enable --now opensmd
常见命令
apt install infiniband-diags
# 其他相关的库
dpkg -l perftest ibverbs-providers libibumad3 libibverbs1 libnl-3-200 libnl-route-3-200 librdmacm1
mst start
mst status
ibvdev2netdev
ibvdev2netdev 显示 device 和网口的对应关系
iblinkinfo
iblinkinfo 查看 IB 交换模块的所有端口的连接状态。此命令会将集群内所有的 IB 交换模块都进行列举
    
     
    
    
说明
- 图片转载自
- ① 表示这台交换机的 GUID 号,唯一区分交换机的标识
- ② LID 号,集群创建时 SM 分配的唯一便于管理的 lid 号
- ③ 表示 1-20 号口为 IB 交换模块与网卡连接的内部端口,其中 11-12、17-18 为预留口
- ④ 表示 21-40 为 IB 交换模块外部连接口
- ⑤ 表示 41 号口为虚拟机口,为集群跑压力的自由路由端口
- ⑥ 表示当前端口的连接速率:4X*25.78125=100Gpbs(EDR)
- ⑦ 表示网卡端口的 lid 号及所对应的服务器
- ⑧ 表示 IB 交换模块外部连接口的 lid 号、端口序列号、对端连接设备的名称
show_gids
show_gids 显示 GID,RoCEv2 对应的 gid 编号为 3
$ show_gids
DEV     PORT    INDEX   GID                                     IPv4            VER     DEV
---     ----    -----   ---                                     ------------    ---     ---
...
mlx5_2  1       0       fe80:0000:0000:0000:2817:20ff:fe98:c781                 v1      ens10f1v0
mlx5_2  1       1       fe80:0000:0000:0000:2817:20ff:fe98:c781                 v2      ens10f1v0
mlx5_2  1       2       0000:0000:0000:0000:0000:ffff:c0a8:0204 192.168.2.4     v1      ens10f1v0
mlx5_2  1       3       0000:0000:0000:0000:0000:ffff:c0a8:0204 192.168.2.4     v2      ens10f1v0
...
- gid value 查询 /sys/class/infiniband/{device}/ports/{port}/gids/{index}
- gid type /sys/class/infiniband/{device}/ports/{port}/gid_attrs/types/{index}
- GID net_device- /sys/class/infiniband/{device}/ports/{port}/gid_attrs/ndevs/{index}
ibdev2netdev
- ibdev2netdev 查看当前系统下网卡名称与系统下 ib 端口名称的对应关系及状态
$ ibdev2netdev
mlx5_bond_0 port 1 ==> eno1 (Up)
$ ibdev2netdev -v
...
ibhosts
- ibhosts 将集群中所有的 IB 网卡设备进行罗列
ibv_devinfo
- ibv_devinfo 查看网卡端口的详细信息,与 ibstat 功能类似,多了 PSID(board_id)信息
ibv_devinfo
# 显示device信息(详细)
ibv_devinfo -v
# 输出指定设备的主要信息
ibv_devinfo -d mlx5_0
# 输出指定设备的详细信息
$ ibv_devinfo -d mlx5_0 -v
hca_id: mlx5_0
     transport:                  InfiniBand (0)
     fw_ver:                     2.30.8000
     node_guid:                  f452:1403:007b:cba0
     sys_image_guid:             f452:1403:007b:cba3
     vendor_id:                  0x02c9
     vendor_part_id:             4099
     hw_ver:                     0x0
     board_id:                   MT_1090120019
     phys_port_cnt:              2
          port:   1
                state:              PORT_ACTIVE (4)
                max_mtu:            4096 (5)
                active_mtu:         2048 (4)
                sm_lid:             2
                port_lid:           2
                port_lmc:           0x01
                link_layer:         InfiniBand
          port:   2
                state:              PORT_ACTIVE (4)
                max_mtu:            4096 (5)
                active_mtu:         4096 (5)
                sm_lid:             0
                port_lid:           0
                port_lmc:           0x00
                link_layer:         Ethernet
ibv_devices
ibv_devices 列出 device
ibv_devices
sminfo
- sminfo 查询当前集群下 SM 的 GUID 号,表明当前 SM 设备已经被指定
ibdump
- ibdump 转储(dump)来自 Mellanox 适配器卡的 InfiniBand 流量,并提供与以太网网络上的 tcpdump 工具类似的功能
参数说明
$ ibdump -h
   ibdump-dump Mellanox Technologies ConnectX
  -d,--ib-dev = <dev>使用IB设备<dev>(找到默认的第一个设备)
  -i, --ib-port = <端口>使用IB设备的端口<端口>(默认1)
  -w,-write = <文件>  结果保存到文件(默认为“ sniffer.pcap”)
                         “-”代表标准输出-启用管道传输到tcpdump或tshark。
  -o,--output = <文件>是-w选项的别名。不使用-为了向后兼容
  -b,--max-burst = <log2突发> log2的最大突发大小
                               捕获而没有数据包丢失。
                               每个条目占用〜MTU字节的内存(默认12-4096个条目)
  -s,-silent不打印进度指示。
  -T,--conti使用连续页面。
  -M,--mem-mode <大小>(指定时),仅在抓包动作停止后才将包写入文件,它比默认模式快(丢包更少)
                         ,但占用更多内存。在这种模式下,ibdump在捕获<size>个字节后停止
  -p,--writer-thread <大小>使用特定线程将数据写入磁盘。为了使用此功能,您必须指定
                               两个临时缓冲区的大小,用于保存数据给线程写入磁盘
  --decap  解封装端口镜像的headers。用于捕获RSPAN流量时需要启用。
  -h,--help显示此帮助屏幕。
  -v,--version打印版本信息。
# 抓包
ibdump -d mlx5_0 -i 1 -w sniffer.pcap
ibstat
ibstatus 查看核更改网卡工作模式:Ethernet 或 infiniband 模式
ibstat 或 ibsysstat 查询 InfiniBand 设备状态或 IB 地址上的系统状态
$ ibstat mlx5_bond_0
CA 'mlx5_bond_0'
	CA type: MT4117
	Number of ports: 1
	Firmware version: 14.27.6122
	Hardware version: 0
	Node GUID: 0x0c42a10300757828
	System image GUID: 0x0c42a10300757828
	Port 1:
		State: Active
		Physical state: LinkUp
		Rate: 25
		Base lid: 0
		LMC: 0
		SM lid: 0
		Capability mask: 0x00010000
		Port GUID: 0x0e42a1fffe757828
		Link layer: Ethernet
说明:
- CA 'mlx5_bond_0':网卡端口名称,用于指定端口打流时多带的参数
- Firmware version:当前网卡的固件版本
- State:逻辑层网卡连接状态
- Physical state:物理层网卡连接状态
- Rate:速率
- Base lid:SM 分配的 LID 号
- SM lid:当前 SM 的 LID 号
- Port GUID:网卡每个端口的 GUID 号,可用来指定 SM
ibroute
# dump all non empty mlids  of  switch  with lid 4
ibroute -M 4
ibnodes
ibswitches
- ibswitches 查看当前集群的 IB 交换模块,此命令会将集群中所有的设备一一列举
ibdiagnet
- ibdiagnet检测当前集群下物理链路的健康情况,利用快速查看环境下链路状态
ibnetdiscover
# 扫描网络并显示每个端口的 LID、GUID、机器名和端口号等信息
$ ibnetdiscover -p
Switch  36 "S-xxx"         # "MF0;sw02:MSB7700/U1" enhanced port 0 lid 1 lmc 0
[1]     "H-xxx"[2](xxx)          # "MT25408 ConnectX Mellanox Technologies" lid 50 4xQDR
[2]     "H-xxx"[2](xxx)          # "MT25408 ConnectX Mellanox Technologies" lid 48 4xQDR
...
ofed_info
- ofed_info 显示当前设备安装的 OFED 包的信息:驱动、工具等
cma_roce_mode
# 查看 mlx RoCE mode
$ cma_roce_mode -d mlx5_bond_0 -p 1
RoCE v2
$ cma_roce_mode -d mlx5_bond_1 -p 1
RoCE v2
# 设置 mlx RoCE mode
cma_roce_mode -d <dev> -p <port> -m <1|2>
rdma
# 显示 RDMA 链接
rdma link show
ibping
ibping 测试 RDMA 网络的连通性
# -S 服务端,-C 指定网卡
ibping -S -C mlx5_1 -P 1
# 客户端,-L 是 ibstat 查看到的 Base lid(本地标识符)
ibping -c 50 -C mlx5_0 -P 1 -L 2
其他
show_drop 查看端口包丢弃情况
ibchecknet, ibchecknode, 或 ibcheckport 验证 IB 子网、节点或端口并报告错误
ibtracert 跟踪 IB 路径
smpquery 或 smpdump 查询或转储 IB 子网管理属性
ibchecknet, ibchecknode, 或 ibcheckport 验证 IB 子网、节点或端口并报告错误
ibcheckportstate, ibcheckportwidth, ibcheckstate, or ibcheckwidth 验证已链接但不活动的 IB 端口、面向 1x (2.0 Gbps) 链路带宽的端口、IB 子网中已链接但不活动的端口或 IB 子网中的 lx 链路
ibclearcounters or ibclearerrors 对 IB 子网中的端口计数器或错误计数器进行清零
ibdatacounters or ibdatacounts 查询 IB 子网中的数据计数器或 IB 端口数据计数器
IPoIB
- 参考
- IP over InfiniBand(IPoIB)是在 InfiniBand 远程直接访问(RDMA)网络之上提供的 IP 网络模拟层- 
- 通过 IPoIB ULP(Upper Layer Protocol)驱动,允许现有未经修改适配 RDMA 的应用通过 InfiniBand 网络发送数据。但是和原生 RDMA 支持的应用相比性能会偏低
- IPoIB是在 InfiniBand 协议上提供 IP 协议进行数据传输的能力
 
- IPoIB 设备可在 Datagram 或 Connected 模式中配置
- 支持修改 MTU 值
- Datagram mode 最大支持 4K
- Connected mode 最大支持 64K
 
 
- IPoIB 驱动模块 ib_ipoib
- IPoIB 还提供了基于以下软件的增强功能:
- Giant Receive offload(GRO)
- NAPI
- Ethtool 支持
 
netplan 配置 IP 地址
$ ibdev2netdev
mlx5_0 port 1 ==> ibp4s0 (Up)
$ cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  version: 2
  renderer: networkd
  ethernets:
    ibp4s0:
      dhcp4: false
      addresses:
        - 10.10.10.111/24
# 配置生效
netplan apply
ifconfig 临时配置 IP 地址
ifconfig ib0 11.11.11.10 netmask 255.255.255.0
nmcli 配置 IP 地址
nmcli connection add type infiniband con-name mlx4_ib0 ifname mlx4_ib0 transport-mode Connected mtu 65520
nmcli connection modify mlx4_ib0 infiniband.p-key 0x8002
nmcli connection modify mlx4_ib0 ipv4.addresses 192.0.2.1/24
nmcli connection modify mlx4_ib0 ipv4.gateway 192.0.2.254
nmcli connection modify mlx4_ib0 ipv4.dns 192.0.2.253
nmcli connection modify mlx4_ib0 ipv4.method manual
F&Q
网卡一直处于初始化状态 State:Initializing
$ ibstat
CA 'mlx5_0'
    CA type: MT4123
    Number of ports: 1
    Firmware version: 20.37.1014
    Hardware version: 0
    ...
    Port 1:
        State: Initializing
        ...
- 原因:IB 子网中,子网管理器(SM)没有开启,开启 SM 常见的 2 种方式:
交换器开启示例:
ibswitch [standalone: master] > enable
ibswitch [standalone: master] # configure terminal
ibswitch [standalone: master] (config) # ib smnode ibswitch enable
ibswitch [standalone: master] (config) # show ib sm
enable
ibswitch [standalone: master] (config) # write memory
服务器开启示例:
/etc/init.d/opensmd start
PS:RoCE 不需要打开子网管理器
扩展
ib 流量监控
采用 prometheus/node_exporter 采集机器指标,默认支持 infiniband 流量采集(更多采集指标参考),参考
metrics 指标如下
node_infiniband_rate_bytes_per_second{device="mlx5_0",port="1"} 1.25e+10
node_infiniband_rate_bytes_per_second{device="mlx5_1",port="1"} 1.25e+09
# 上行流量
# 查询语句
rate(node_infiniband_port_data_transmitted_bytes_total[$__rate_interval])
# Legend(建议)
node_infiniband_port_data_transmitted_rate.{{device}}.{{port}}
# 下行流量
# 查询语句
rate(node_infiniband_port_data_received_bytes_total[$__rate_interval])
# Legend(建议)
node_infiniband_port_data_received_rate.{{device}}.{{port}}
其他 exporter
使用案例