【教程】检查RDMA网卡状态和测试带宽 | 附测试脚本

转载请注明出处:小锋学长生活大爆炸xfxuezhagn.cn

如果本文帮助到了你,欢迎***点赞、收藏、关注***哦~

目录

检查硬件和驱动状态

测试RDMA通信

报错修复


对于交换机的配置,可以看这篇:

【教程】详解配置多台主机通过交换机实现互联通信_通过交换机链接多台设备-CSDN博客

检查硬件和驱动状态

1、查看是否识别到网卡(PCI 层)

bash 复制代码
lspci | grep -i mellanox

如果输出类似以下内容,说明系统已经识别到了硬件设备。

40:00.0 Ethernet controller: Mellanox Technologies MT27800 Family ConnectX-5

40:00.1 Ethernet controller: Mellanox Technologies MT27800 Family ConnectX-5

2. 查看驱动是否加载成功(内核模块)

bash 复制代码
lsmod | grep mlx5

mlx5_ib 466944 0

ib_uverbs 163840 2 rdma_ucm,mlx5_ib

ib_core 417792 8

mlx5_core 2191360 1 mlx5_ib

mlx_compat 69632 12
上述输出说明:

模块名 说明
mlx5_core Mellanox 网卡核心驱动,控制数据面
mlx5_ib 用于 RDMA(InfiniBand verbs)的支持
ib_uverbs 用户态 Verbs 接口(userspace RDMA 程序会依赖)
ib_core RDMA 核心抽象层(通用 InfiniBand 子系统)
mlx_compat Mellanox 向后兼容层(用于 OFED 内核兼容性)

如果没加载,可尝试手动加载:

bash 复制代码
sudo modprobe mlx5_ib

还可以查看所有与 RDMA 相关模块:

bash 复制代码
lsmod | grep rdma

ib_uverbs

rdma_ucm

mlx5_ib

3. 查看网卡驱动和状态

bash 复制代码
ethtool -i ens1f1np1   # 替换为你的网卡名,ifconfig可查看

driver: mlx5_core

version: 24.10-2.1.8

firmware-version: 16.35.4506 (MT_0000000012)

expansion-rom-version:

bus-info: 0000:1a:00.1

supports-statistics: yes

supports-test: yes

supports-eeprom-access: no

supports-register-dump: no

supports-priv-flags: yes

4. 查看 RDMA 设备信息(核心)

bash 复制代码
ibv_devinfo

hca_id: mlx5_0

transport: InfiniBand (0)

fw_ver: 16.35.4506

node_guid: 043f:7203:00dc:00d4

sys_image_guid: 043f:7203:00dc:00d4

vendor_id: 0x02c9

vendor_part_id: 4119

hw_ver: 0x0

board_id: MT_0000000012

phys_port_cnt: 1

port: 1

state: PORT_ACTIVE (4)

max_mtu: 4096 (5)

active_mtu: 1024 (3)

sm_lid: 0

port_lid: 0

port_lmc: 0x00

link_layer: Ethernet

这表示 RDMA 核心层已经注册并初始化成功。

5. 查看 RDMA 子系统

bash 复制代码
rdma link show

link mlx5_0/1 state ACTIVE physical_state LINK_UP netdev ens1f0np0

link mlx5_1/1 state ACTIVE physical_state LINK_UP netdev ens1f1np1

说明 RDMA 子系统已加载并绑定到对应网卡。

6. 检查 OFED 安装状态

如果你使用 Mellanox OFED(不是内核默认驱动),可以运行:

bash 复制代码
ofed_info -s

MLNX_OFED_LINUX-24.10-2.1.8.0:

确认你装的是 Mellanox 官方驱动栈。

测试RDMA通信

1、在两台服务器上新建以下脚本,命名为:rdma_test.sh 。

bash 复制代码
#!/bin/bash

# ===============================================
# Script: rdma_test.sh
# Author: 小锋学长
# Description:
#   一键运行 RDMA 带宽测试(ib_write_bw)工具,自动完成:
#     - 自动检测 GID index
#     - 切换 CPU governor 为 performance
#     - 支持 server/client 模式
#     - 支持 read / write / send 操作类型(默认 read)
#     - 支持传入设备名、端口号
#     - 测试后自动恢复 CPU governor
#
# Requirements:
#   - ib_write_bw 工具(来自 perftest 包)
#   - Mellanox 驱动已正确加载
#   - RDMA 设备支持 RoCE 并已配置 IP + GID
#
# Usage:
#   Server 模式:
#     bash rdma_test.sh server
#     bash rdma_test.sh server [device] [port] [mode_type]
#
#   Client 模式:
#     bash rdma_test.sh client <server_ip>
#     bash rdma_test.sh client <server_ip> [device] [port] [mode_type]
#
# Examples:
#   bash rdma_test.sh server mlx5_1 1 read
#   bash rdma_test.sh client 192.168.5.228 mlx5_1 1 read
#
# Note:
#   - 默认设备为 mlx5_1,默认物理端口为 1
#   - GID index 会根据本地 IP 自动选择
#   - 支持异常退出自动清理 CPU governor 设置
# ===============================================

# CONFIGURATION (默认值)
MODE=""           # 第一个参数为运行模式,server 或 client
PEER_IP=""        # 第二个参数作为 Server IP(仅 client 模式使用)
DEVICE="mlx5_1"   # 第三个参数为设备名,默认值为 mlx5_1
PORT=1            # 第四个参数为物理端口,默认 1
MODE_TYPE="read"  # 第五个参数为传输模式,read/write/send(默认 read)
GID_INDEX=-1      # 自动检测

# 解析参数
ARGS=$(getopt -o m:i:d:p:t: \
  -l mode:,peer_ip:,device:,port:,mode_type: \
  -n "$0" -- "$@")
if [ $? -ne 0 ]; then
  echo "❌ 参数解析失败"
  exit 1
fi
eval set -- "$ARGS"
while true; do
  case "$1" in
    -m|--mode) MODE="$2"; shift 2 ;;
    -i|--peer_ip) PEER_IP="$2"; shift 2 ;;
    -d|--device) DEVICE="$2"; shift 2 ;;
    -p|--port) PORT="$2"; shift 2 ;;
    -t|--mode_type) MODE_TYPE="$2"; shift 2 ;;
    --) shift; break ;;
    *) echo "❌ 未知参数: $1" >&2; exit 1 ;;
  esac
done


# 确定实际运行的测试工具
case "$MODE_TYPE" in
  write) TEST_TOOL="ib_write_bw" ;;
  send)  TEST_TOOL="ib_send_bw" ;;
  *)     TEST_TOOL="ib_read_bw" ;;
esac
echo "==== RDMA 快速检查和测试工具 ===="
echo "运行模式   : $MODE"
echo "操作类型   : $TEST_TOOL"
echo "网卡设备   : $DEVICE"
echo "物理端口   : $PORT"
[[ "$MODE" == "client" ]] && echo "目标Server: $PEER_IP"


# === 1. 检查 Mellanox 驱动加载状态 ===
echo "[1] 检查驱动模块加载状态"
lsmod | grep mlx5 || echo "❌ 未加载 Mellanox 驱动模块"


# === 2. 查看设备状态 ===
echo -e "\n[2] 查看设备列表与状态"
ibv_devinfo -d "$DEVICE" || { echo "❌ RDMA 设备不可用"; exit 1; }


# === 3. 自动识别 GID index ===
echo -e "\n[3] 显示端口 $PORT 的 GID 表:"
for i in {0..15}; do
  GID=$(cat /sys/class/infiniband/${DEVICE}/ports/${PORT}/gids/$i)
  echo "GID[$i] = $GID"
  if [[ "$GID" =~ .*c0a8.* ]]; then  # 检查是否含有192.168.5.x对应十六进制段
    GID_INDEX=$i
  fi
done
if [[ "$GID_INDEX" -eq "-1" ]]; then
  echo "❌ 未能自动识别出 GID index,请手动设置 GID_INDEX"
  exit 1
else
  echo "✅ 使用 GID index: $GID_INDEX"
fi


# === 3.5 临时将 CPU governor 切换为 performance,并注册恢复 ===
echo -e "\n[3.5] 临时切换 CPU governor 为 performance"
declare -A ORIGINAL_GOVERNORS
for cpu in /sys/devices/system/cpu/cpu[0-9]*; do
  gov_file="$cpu/cpufreq/scaling_governor"
  cpu_name=$(basename "$cpu")
  ORIGINAL_GOVERNORS[$cpu_name]=$(cat "$gov_file")
  echo performance | sudo tee "$gov_file" > /dev/null
done
sleep 1

restore_governors() {
  echo -e "\n[清理] 恢复原有 CPU governor 设置..."
  for cpu in "${!ORIGINAL_GOVERNORS[@]}"; do
    echo "${ORIGINAL_GOVERNORS[$cpu]}" | sudo tee /sys/devices/system/cpu/$cpu/cpufreq/scaling_governor > /dev/null
  done
}
trap restore_governors EXIT


# === 4. 启动 RDMA 测试 ===
echo -e "\n[4] 启动 ib_write_bw 测试"
COMMON_ARGS="-d $DEVICE -i $PORT -x $GID_INDEX -s 65536 -q 8 -n 500000 --noPeak --report_gbits"

if [[ "$MODE" == "server" ]]; then
  echo "🟢 正在启动 server(设备=$DEVICE, 端口=$PORT, GID=$GID_INDEX, 模式=$TEST_TOOL)"
  # send 模式提示 + 参数处理
  if [[ "$MODE_TYPE" == "send" ]]; then
    echo -e "\n📢 注意:当前为 send 模式,client需要主动发送数据"
    if [[ "$MODE" == "server" ]]; then
      COMMON_ARGS="$COMMON_ARGS --run_infinitely"
    fi
  fi
  echo "🔧 实际执行命令:sudo $TEST_TOOL $COMMON_ARGS"
  while true; do
    echo -e "\n🟢 等待 client 连接..."
    sudo $TEST_TOOL $COMMON_ARGS
    echo -e "\n✅ 当前 client 测试完成,等待下一个连接...\n"
    sleep 1
  done
elif [[ "$MODE" == "client" ]]; then
  if [[ -z "$PEER_IP" ]]; then
    echo "❌ 错误:client 模式需要指定 server IP"
    echo "用法:$0 client <server_ip> [device] [port] [mode_type]"
    exit 1
  fi
  echo "🚀 正在连接到 server $PEER_IP(设备=$DEVICE, 端口=$PORT, GID=$GID_INDEX, 模式=$TEST_TOOL)"
  echo "🔧 实际执行命令:sudo $TEST_TOOL $COMMON_ARGS $PEER_IP"
  sudo $TEST_TOOL $COMMON_ARGS "$PEER_IP"
else
  echo "❌ 错误:必须指定模式参数 server 或 client"
  echo "用法:$0 server [device] [port] [mode_type] 或 $0 client <server_ip> [device] [port] [mode_type]"
  exit 1
fi

2、在服务端运行(根据你的情况修改):

bash 复制代码
bash rdma_test.sh -m server -t read

3、在客户端运行(根据你的情况修改):

bash 复制代码
bash test_rdma.sh -m client -i 192.168.5.228 -d mlx5_1 -p 1 -t read

4、测试结果:

字段解释:

字段名 含义
#bytes 每个 RDMA 消息的 payload 大小(本例为 64 KiB)
#iterations 总共发送了多少条消息(5000 次)
BW peak [MiB/sec] 测试过程中的瞬时最大带宽(本例为 10313.62 MiB/s)
BW average [MiB/sec] 平均带宽(本例为 10313.14 MiB/s)
MsgRate [Mpps] 平均消息发送速率(每秒多少条消息,单位:百万条) (本例为 0.165 Mpps,也就是 165,010 条/秒)

5、结果解析:

平均带宽换算为 Gbps(千兆位每秒):

1 MiB = 2²⁰ 字节 = 8.388608 Mbit

所以实际达到了 86.5 Gbps 的有效吞吐量

10313.14 MiB/sec × 8.388608 = ≈ 86520.2 Mbit/sec ≈ 86.5 Gbps

由于是mlx5 RoCE 网卡(ConnectX-4 或以上),active_speed = 25 Gbps × 4x,因此理论带宽为:25 × 4 = 100 Gbps(最大可用)。

  • 实测:86.5 Gbps

  • 达标率:≈ 86.5%

在真实环境下由于 PCIe 延迟、内存访问、系统 jitter、未调优参数等因素,能达到 80~90% 的理论带宽就已经非常理想。

6、进一步提升性能:

方法 效果
增加 -q(Queue Pairs 数) 提高并发度
增加 -s 消息大小(如 128KB) 增加吞吐上限
使用 -F 跳过 CPU 频率校验
使用 --report_gbits 直接用 Gbps 输出,避免换算
绑定 NUMA 节点 降低内存访问延迟
使用 --duration 模式长期运行 稳定性更好

示例命令:

bash 复制代码
sudo ib_write_bw -d mlx5_1 -i 1 -x 5 -s 65536 -q 8 -F -n 1000000 --report_gbits

报错修复

1、Unable to init the socket connection

把防火墙都关了。

bash 复制代码
sudo systemctl stop firewalld    # 重启会恢复
sudo systemctl disable firewalld # 禁用后重启也不会恢复
sudo ufw disable
sudo iptables -F
相关推荐
SelectDB14 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
zzzzzz3102 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz6 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
网络研究院6 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展