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
使用案例