从围城哥哥那里领养代替购买了一套闲置的HP 544+ FLR网卡(就是ConnectX-3 Pro),在家折腾RDMA网卡玩(涛哥有云:班没上够,回家还搞?)。在经历了发现一张卡凉凉,又50块捡了一张,以及又花了50块捡了56G的IB线缆之后,两张卡终于插到了同一台机器里并用IB直连达到了满意的速度(图个啥

网上冲浪了一阵发现坑还是很多的,资料也比较零散,所以我也整理一下自己的踩坑经验,供后来的垃圾佬参考。垃圾怎么捡我就不教学了,毕竟基本白嫖,经验不丰富,我这里只关注软件部分。

确认设备存活

先确认网卡都认出来了。

 lspci |grep Mellanox

我的机器装的PVE 8.3,基于Debian 12。但是接下来的所有操作都是直接pve系统进行的,不涉及到虚拟机。

装各种包

官方的OFED就不用想着装了,早就不维护,新点的系统都装不上。kernel里应该是内置了mlx4 ethernet的driver,如果只用ethernet看起来不需要特意去装,直接就能识别出来。但如果要搞ib,还是需要装一些其它的包。

apt-get install rdma-core ibverbs-providers infiniband-diags ibutils ibverbs-utils rdmacm-utils perftest

再装下kernel header,这步可能需要配置pve-no-subscription的源,没有的话在这里找 https://mirrors.ustc.edu.cn/help/proxmox.html

apt-get install proxmox-headers-6.8.12-8-pve

这些都干完之后就可以装mst,只能装这个4.25,再新的版本就不支持这个垃圾卡了,从这里下载
https://www.mellanox.com/downloads/MFT/mft-4.25.1-11-x86_64-deb.tgz

解压完运行里面的install.sh

都装完了看看mst是否能用

mst start
mst status

刷固件

如果你的速率显示不是40G(eth模式)或56G(ib模式),那么可能需要刷下固件才能把速率跑上去,固件从这里下载https://pan.baidu.com/s/1uiebg1P-tTL1WIuxMgLblQ?pwd=tfgi

我下的是HP_1380110017_powerlevel_50g_56kr4.bin这个

# 看下刷固件的设备路径在哪,一般是pci_cr0这种
mst status

# 注意命令最后还有个b
flint -d /dev/mst/mt4103_pci_cr0 -i ./HP_1380110017_powerlevel_50g_56kr4.bin b

# 刷完重启
reboot

# 查看网卡状态是否正常
ibstat

IB直连,配置OpenSM

不走交换机,ib直连的话需要启用opensm,不然它state会一直卡在Initializing,走不到Active,如果你恰巧财力雄厚拥有有ib交换机,则可以跳过这步,因为ib交换机帮你sm了(不是

systemctl start opensm

然后再用ibstat看状态应该就正常了

切换网卡模式

mlx网卡可以工作在两种模式,Infiniband或者Ethernet其中一种,日常家用的话还是Ethernet就好了。

另外需要两个口一起切了,应该是没法两种模式同时支持

mst start

# 看一下pciconf的设备路径,在后续命令中使用
mst status

# 配置两个口的设备,1是IB,2是ETH
mlxconfig -d /dev/mst/mt4103_pciconf0 set LINK_TYPE_P1=1
mlxconfig -d /dev/mst/mt4103_pciconf0 set LINK_TYPE_P2=1

# 重启生效
reboot

常用命令

如果是ethernet模式

# 看状态
ethtool enp98s0

# 设速率
ethtool -s enp98s0 autoneg off speed 40000 duplex full

# 启用网卡和ip设置
ip link set enp98s0 up
ip addr add 192.168.5.150/24 dev enp98s0

# 测速
# 服务端 
iperf3 -s
# 客户端
iperf3 -c 192.168.5.150

如果是infiniband模式

# 查看设备状态
ibstat
ibstatus
ibv_devinfo
iblinkinfo

# 测速,还有ib_write_bw之类的命令,参数类似。ib通信并不会走eth网络栈,这里ip填对端能通的ip即可,它只是用于在初始化阶段交换一些配置信息,实际通信会走IB的链路。参数-i是端口号,和ibstat里的对应上就行
# 服务端
ib_send_bw -d ibp1s0 -i 2
# 客户端
ib_send_bw -d ibp98s0 -i 2 192.168.2.1

好了,现在你也可以光速传输小电影了。

参考