从零开始:Ubuntu 20.04下Mellanox ConnectX-6 Dx网卡RoCEv2全栈配置指南
当你第一次拿到配备Mellanox ConnectX-6 Dx网卡的服务器时,那种既兴奋又忐忑的心情我太熟悉了。作为目前数据中心级100G/200G以太网卡的标杆产品,ConnectX-6 Dx在RDMA性能上确实令人惊艳,但配置过程却像在走钢丝——一个参数设置不当就可能导致性能断崖式下跌。本文将带你完整走通从驱动安装到QoS调优的全流程,特别针对Ubuntu 20.04这个LTS版本中的特殊注意事项,最后还会分享几个我在金融行业HPC集群部署时积累的实战技巧。
1. 基础环境准备
1.1 硬件识别与固件检查
在开始任何软件配置前,先用lspci -nn | grep Mellanox确认网卡已被系统识别。ConnectX-6 Dx通常显示为MT2892 Family,如果看到这个字样但后续驱动安装失败,可能需要先升级网卡固件:
# 安装MFT工具包 wget https://www.mellanox.com/downloads/MFT/mft-4.24.0-72-x86_64-deb.tgz tar -xzvf mft-*.tgz cd mft-*/ && sudo ./install.sh # 启动MST服务 sudo mst start sudo mst status -v # 确认设备路径(通常是/dev/mst/mt4125_pciconf0) # 查看当前固件版本 sudo flint -d /dev/mst/mt4125_pciconf0 query full | grep -i "fw version"提示:固件升级存在一定风险,建议在厂商指导下操作。我们遇到过因电源不稳导致刷写失败的情况,所以务必确保服务器接入UPS。
1.2 OFED驱动安装避坑指南
官方文档推荐的MLNX_OFED安装看似简单,但在Ubuntu 20.04上可能会遇到内核头文件不匹配的问题。以下是经过生产环境验证的安装流程:
# 先安装必备依赖 sudo apt update && sudo apt install -y dkms linux-headers-$(uname -r) python3-distutils # 下载特定版本的OFED驱动(注意与内核版本匹配) wget https://content.mellanox.com/ofed/MLNX_OFED-23.07-0.5.1.2/MLNX_OFED_LINUX-23.07-0.5.1.2-ubuntu20.04-x86_64.tgz tar -xzvf MLNX_OFED_LINUX-*.tgz cd MLNX_OFED_LINUX-23.07-0.5.1.2-ubuntu20.04-x86_64 # 关键参数:跳过不兼容的模块 sudo ./mlnxofedinstall --without-fw-update --force-modules --skip-repo安装完成后,必须手动加载内核模块并验证:
sudo /etc/init.d/openibd restart ibv_devinfo | grep "fw_ver" # 应显示固件版本 ibdev2netdev -v # 查看网卡与接口对应关系常见问题处理:
- 报错"Module mlx5_core not found":执行
sudo modprobe mlx5_core后重试 - ibstat显示端口状态为Down:检查物理连接,确认交换机端口已启用100G模式
2. RoCEv2核心配置实战
2.1 网络基础参数优化
RDMA对MTU和中断处理有特殊要求,这些配置必须在QoS调优前完成:
# 假设网卡接口名为ens3f0np0(通过ip link确认实际名称) sudo ifconfig ens3f0np0 mtu 9416 up # Jumbo Frame必须设置 sudo ethtool -G ens3f0np0 rx 8192 tx 8192 # 增大环形缓冲区 sudo ethtool -C ens3f0np0 adaptive-rx off adaptive-tx off rx-usecs 0 tx-usecs 0 # 禁用自适应中断通过ethtool -k ens3f0np0确认以下特性已启用:
- rx-checksumming: on
- tx-checksumming: on
- scatter-gather: on
- tcp-segmentation-offload: on
2.2 ECN与PFC精细配置
流量控制是RoCEv2稳定性的关键,以下是数据中心级配置模板:
# 启用DCQCN拥塞控制 echo 1 | sudo tee /sys/class/net/ens3f0np0/ecn/roce_np/enable/5 echo 1 | sudo tee /sys/class/net/ens3f0np0/ecn/roce_rp/enable/5 echo 48 | sudo tee /sys/class/net/ens3f0np0/ecn/roce_np/cnp_dscp # 配置PFC(优先级流量控制) sudo mlnx_qos -i ens3f0np0 --trust dscp sudo lldptool -T -i ens3f0np0 -V PFC enabled=5 sudo lldptool -T -i ens3f0np0 -V PFC willing=no重要参数说明:
| 参数 | 推荐值 | 作用 |
|---|---|---|
| np_cnp_dscp | 48 | 拥塞通知包的DSCP标记 |
| traffic_class | 160 | RDMA流量的优先级标记 |
| roce_np/enable | 1 | 启用网络层ECN |
| roce_rp/enable | 1 | 启用传输层ECN |
2.3 服务类型(ToS)与模式切换
确保RDMA流量使用正确的服务类型:
# 设置RoCEv2模式(必须) sudo cma_roce_mode -d mlx5_0 -m 2 # 配置ToS值(需与PFC设置一致) echo 160 | sudo tee /sys/class/infiniband/mlx5_0/tc/1/traffic_class sudo cma_roce_tos -d mlx5_0 -t 160验证配置是否生效:
cat /sys/class/infiniband/mlx5_0/tc/1/traffic_class # 应返回160 cat /sys/class/net/ens3f0np0/ecn/roce_np/enable/5 # 应返回13. 持久化与自动化方案
3.1 systemd服务单元配置
相比crontab,使用systemd能更好地管理服务依赖关系。创建/etc/systemd/system/roce.service:
[Unit] Description=RoCEv2 Configuration Service After=network.target [Service] Type=oneshot ExecStart=/usr/local/bin/roce_config.sh TimeoutStartSec=0 [Install] WantedBy=multi-user.target配套的配置脚本/usr/local/bin/roce_config.sh需要包含所有关键命令:
#!/bin/bash # 等待接口就绪 until [ -e /sys/class/net/ens3f0np0 ]; do sleep 1 done # 基础网络配置 ifconfig ens3f0np0 mtu 9416 up ethtool -G ens3f0np0 rx 8192 tx 8192 # RoCE特定配置 echo 160 > /sys/class/infiniband/mlx5_0/tc/1/traffic_class cma_roce_tos -d mlx5_0 -t 160 echo 1 > /sys/class/net/ens3f0np0/ecn/roce_np/enable/5 echo 1 > /sys/class/net/ens3f0np0/ecn/roce_rp/enable/53.2 配置验证与故障排查
制作一个自动化的健康检查脚本/usr/local/bin/roce_check.sh:
#!/bin/bash function check_status() { local item=$1 local expected=$2 local actual=$(cat $item 2>/dev/null) [ "$actual" == "$expected" ] && echo "PASS: $item" || echo "FAIL: $item (Expected $expected, Got $actual)" } check_status "/sys/class/infiniband/mlx5_0/tc/1/traffic_class" "160" check_status "/sys/class/net/ens3f0np0/ecn/roce_np/enable/5" "1" check_status "/sys/class/net/ens3f0np0/mtu" "9416" # 验证RDMA CM状态 cma_roce_mode -d mlx5_0 | grep -q "RoCE v2" && echo "PASS: RoCEv2 mode" || echo "FAIL: RoCE mode"4. 高级调优与性能验证
4.1 中断亲和性优化
对于多核系统,正确绑定中断能显著提升性能。首先获取网卡的中断列表:
grep ens3f0np0 /proc/interrupts | awk '{print $1}' | cut -d: -f1 > /tmp/irqs然后使用irqbalance或手动设置CPU亲和性:
# 假设使用CPU 16-31处理中断 i=16 while read irq; do echo $(printf "%x" $((1<<$i))) > /proc/irq/$irq/smp_affinity i=$((i+1)) [ $i -gt 31 ] && i=16 done < /tmp/irqs4.2 性能基准测试
使用perftest工具包进行端到端验证:
# 服务端(假设IP为192.168.1.100) ib_send_bw -d mlx5_0 -x 3 -F --report_gbits --size=8388608 # 客户端 ib_send_bw -d mlx5_0 -x 3 -F --report_gbits --size=8388608 192.168.1.100预期性能指标(100Gbps链路):
| 测试类型 | 预期带宽 | 可接受延迟 |
|---|---|---|
| Send BW | ≥98 Gbps | - |
| Write BW | ≥95 Gbps | - |
| Send Latency | - | ≤1.5 μs |
| Write Latency | - | ≤2 μs |
当测试结果不达标时,按以下顺序排查:
- 检查
ethtool -S ens3f0np0 | grep error是否有丢包 - 使用
mpstat -P ALL 1观察CPU利用率是否均衡 - 通过
cat /sys/class/infiniband/mlx5_0/ports/1/counters/*查看RDMA计数器