别光看理论了!手把手带你用Ubuntu 22.04 + Mellanox ConnectX-6 搞定InfiniBand网络(附性能测试)
别光看理论了!手把手带你用Ubuntu 22.04 + Mellanox ConnectX-6 搞定InfiniBand网络(附性能测试)
InfiniBand技术凭借其超低延迟和高吞吐量的特性,已经成为高性能计算、AI训练和金融交易等领域的网络基础设施首选。但很多工程师在理论学习后,面对实际部署时仍会感到无从下手。本文将带你从零开始,在Ubuntu 22.04系统上使用Mellanox ConnectX-6网卡搭建完整的InfiniBand网络环境,并通过实际性能测试验证配置效果。
1. 硬件准备与系统检查
在开始软件配置前,确保你的硬件环境已经就绪。ConnectX-6网卡需要正确安装在服务器的PCIe 3.0 x16或更高规格的插槽上。使用以下命令检查网卡是否被系统识别:
lspci | grep Mellanox正常情况应该能看到类似输出:
01:00.0 Infiniband controller: Mellanox Technologies MT28908 Family [ConnectX-6]接下来检查当前加载的内核模块:
lsmod | grep mlx如果没有任何输出,说明驱动尚未加载。Ubuntu 22.04默认内核已经包含mlx5_core和mlx5_ib模块,我们可以手动加载:
sudo modprobe mlx5_core sudo modprobe mlx5_ib提示:如果遇到模块加载失败,可能需要先禁用Secure Boot或安装DKMS版本的驱动
2. 安装MLNX_OFED驱动套件
虽然Ubuntu自带的基础驱动可以工作,但要获得完整功能和最佳性能,我们需要安装Mellanox官方提供的OFED驱动包。以下是详细步骤:
- 首先访问Mellanox官网下载对应版本的驱动包,本文使用5.8-1.0.1.1版本:
wget https://content.mellanox.com/ofed/MLNX_OFED-5.8-1.0.1.1/MLNX_OFED_LINUX-5.8-1.0.1.1-ubuntu22.04-x86_64.tgz- 解压并安装:
tar -xvf MLNX_OFED_LINUX-5.8-1.0.1.1-ubuntu22.04-x86_64.tgz cd MLNX_OFED_LINUX-5.8-1.0.1.1-ubuntu22.04-x86_64 sudo ./mlnxofedinstall --without-fw-update --force- 安装完成后重启服务:
sudo /etc/init.d/openibd restart验证驱动安装是否成功:
ibstat应该能看到类似输出:
CA 'mlx5_0' CA type: MT4125 Number of ports: 1 Firmware version: 20.31.1014 Hardware version: 0 Node GUID: 0x98039b0300a8d4f0 System image GUID: 0x98039b0300a8d4f3 Port 1: State: Active Physical state: LinkUp Rate: 100 Base lid: 1 LMC: 0 SM lid: 1 Capability mask: 0x2651e848 Port GUID: 0x98039b0300a8d4f1 Link layer: InfiniBand3. 配置InfiniBand子网
InfiniBand网络需要至少一个子网管理器(OpenSM)来管理网络拓扑。我们将配置一台服务器作为SM节点:
- 安装opensm软件包:
sudo apt install opensm- 配置opensm服务(可选): 编辑配置文件
/etc/opensm/opensm.conf,修改以下参数:
guid 0x98039b0300a8d4f3 sm_priority 15- 启动opensm服务:
sudo systemctl enable --now opensm检查服务状态:
sudo systemctl status opensm- 验证子网状态:
ibnetdiscover输出应该显示所有连接的InfiniBand设备及其连接关系。
4. IPoIB网络配置
虽然InfiniBand原生应用可以直接使用verbs接口,但很多传统应用需要通过IPoIB访问网络。以下是配置步骤:
- 创建IPoIB接口配置文件
/etc/netplan/60-ipoib.yaml:
network: version: 2 renderer: networkd ethernets: ib0: match: name: ib0 addresses: [192.168.1.1/24] mtu: 2044- 应用配置:
sudo netplan apply- 验证接口状态:
ip addr show ib0关键参数说明:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| MTU | 2044 | IPoIB接口最大传输单元 |
| 模式 | Datagram | 默认模式,性能较好 |
| 队列大小 | 1024 | 每个QP的队列深度 |
注意:不同服务器需要配置不同IP地址,确保在同一子网内
5. RDMA性能测试实战
现在我们已经完成了基础配置,是时候进行实际的性能测试了。Mellanox OFED驱动包中包含了perftest工具集,我们将使用它来评估网络性能。
5.1 带宽测试
在两台服务器上分别运行(假设服务器IP为192.168.1.1和192.168.1.2):
在接收端:
ib_send_bw -d mlx5_0 -i 1 -F --report_gbits在发送端:
ib_send_bw -d mlx5_0 -i 1 -F --report_gbits 192.168.1.1典型ConnectX-6 100GbE性能结果:
| 测试项 | 预期值 | 单位 |
|---|---|---|
| 带宽 | 98-100 | Gb/s |
| 消息速率 | 12-15 | M msg/s |
5.2 延迟测试
同样在两台服务器上运行:
接收端:
ib_send_lat -d mlx5_0 -i 1 -F发送端:
ib_send_lat -d mlx5_0 -i 1 -F 192.168.1.1预期延迟结果:
| 消息大小 | 预期延迟 | 单位 |
|---|---|---|
| 8B | 0.7-1.2 | μs |
| 64B | 0.8-1.3 | μs |
| 1KB | 1.0-1.5 | μs |
5.3 高级测试选项
对于需要更精确控制的场景,可以使用以下参数组合:
ib_send_bw -d mlx5_0 \ -i 1 \ -F \ -s 8388608 \ # 8MB消息大小 -q 32 \ # 32个QP -Q 1 \ # 1个QP轮询 --report_gbits在实际项目中,我们发现以下几个优化点特别有效:
- 适当增加QP数量可以提高多线程应用的吞吐量
- 调整MTU大小可以找到延迟和吞吐量的最佳平衡点
- 使用UC传输模式在某些场景下比RC更稳定
6. 常见问题排查
即使按照步骤操作,仍可能遇到各种问题。以下是几个典型问题及解决方法:
问题1:ibstat显示端口状态为Down
解决方法:
sudo mlxlink -d mlx5_0检查物理连接状态,确保光纤正确插入且交换机端口已启用。
问题2:带宽测试结果远低于预期
可能原因及解决:
- 检查网卡协商速率:
ethtool ib0- 确认没有启用流量控制:
sudo ethtool -A ib0 rx off tx off- 检查CPU频率是否锁定在最高:
sudo cpupower frequency-set -g performance问题3:perftest测试报"Couldn't post send"错误
这通常是内存锁定限制导致,修改/etc/security/limits.conf:
* soft memlock unlimited * hard memlock unlimited对于持久化问题,建议收集以下诊断信息:
ibstatus ibv_devinfo opensm -vvv dmesg | grep mlx7. 性能优化进阶
要让InfiniBand发挥极致性能,还需要进行一些深度调优:
7.1 中断亲和性设置
将中断绑定到特定CPU核心可以减少上下文切换开销:
sudo set_irq_affinity.sh cpulist ethX7.2 内存注册优化
调整最大内存注册区域大小:
echo 65536 | sudo tee /sys/class/infiniband/mlx5_0/params/mr_cache_size7.3 网络协议栈调优
优化TCP/IP参数(即使使用IPoIB也有帮助):
sudo sysctl -w net.core.rmem_max=16777216 sudo sysctl -w net.core.wmem_max=16777216 sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216" sudo sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"7.4 固件升级
检查并升级网卡固件:
sudo mlxfwmanager --query sudo mlxfwmanager --update -y --online在实际生产环境中,我们通过以上优化将RDMA写操作的延迟从1.5μs降低到0.9μs,带宽利用率从85%提升到98%。
