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

news2025/4/21 15:48:23

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

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

目录

检查硬件和驱动状态

测试RDMA通信

报错修复


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

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

检查硬件和驱动状态

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

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. 查看驱动是否加载成功(内核模块)

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_coreMellanox 网卡核心驱动,控制数据面
mlx5_ib用于 RDMA(InfiniBand verbs)的支持
ib_uverbs用户态 Verbs 接口(userspace RDMA 程序会依赖)
ib_coreRDMA 核心抽象层(通用 InfiniBand 子系统)
mlx_compatMellanox 向后兼容层(用于 OFED 内核兼容性)

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

sudo modprobe mlx5_ib

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

lsmod | grep rdma

ib_uverbs
rdma_ucm
mlx5_ib

3. 查看网卡驱动和状态

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 设备信息(核心)

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 子系统

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(不是内核默认驱动),可以运行:

ofed_info -s

MLNX_OFED_LINUX-24.10-2.1.8.0:

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

测试RDMA通信

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

#!/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 rdma_test.sh -m server -t read

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

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 模式长期运行稳定性更好

示例命令:

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

把防火墙都关了。

sudo systemctl stop firewalld    # 重启会恢复
sudo systemctl disable firewalld # 禁用后重启也不会恢复
sudo ufw disable
sudo iptables -F

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2338813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(二)Trae 配置C++ 编译

Trae配置c编译 零 CMake 编译C0.1 下载安装0.2 安装设置0.3 三种编译方式(见 下文 一 二 三)0.4 调试 (见 下文四) 一 使用MSVC方式编译1.1 安装编译环境1.2安装插件1.3 设置文件 二 使用GCC方式2.1 安装编译环境2.1.1下载:[MinGw](https://gcc-mcf.lhmouse.com/)2.1.2安装:(以…

日本公司如何实现B2B商城订货系统的自动化和个性化?

在日本构建具备前后台日文本地化、业务员代客下单、一客一价、智能拆单发货的B2B电商系统&#xff0c;需结合日本商业习惯与技术实现。以下是关键模块的落地方案&#xff1a; 一、系统架构设计 1. 前端本地化 语言与UI适配 采用全日语界面&#xff0c;包含敬语体系&#xff08…

用魔法打败魔法——获取软件安装路径

用魔法打败魔法——获取软件安装路径 &#x1f31f;嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 背景普通方法用魔法一句话 1.首先新建‘PC自动化应…

【排队论】Probabilistic Forecasts of Bike-Sharing Systems for Journey Planning

Probabilistic Forecasts of Bike-Sharing Systems forJourney Planning abstract 我们研究了对共享单车系统&#xff08;BSS&#xff09;车站未来自行车可用性进行预测的问题。这是相关的&#xff0c;以便提出建议&#xff0c;保证用户能够进行旅行的概率足够高。为此&#x…

高精度算法(加、减、乘、除、阶乘和)​

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 唯有主动付出&#xff0c;才有丰富的果…

实战设计模式之备忘录模式

概述 与解释器模式、迭代器模式一样&#xff0c;备忘录模式也是一种行为设计模式。备忘录模式允许我们保存一个对象的状态&#xff0c;并在稍后恢复到这个状态。该模式非常适合于需要回滚、撤销或历史记录等功能的应用场景。通过使用备忘录模式&#xff0c;开发者可以轻松添加诸…

吉尔吉斯斯坦工商会代表团赴齐河德瑞新能源汽车考察

德州齐河&#xff0c;2025年4月15日电 时中美贸易突变之际&#xff0c;乘国家一带一路之风。 展中国新能源之宏图&#xff0c;塑国贸体系之新方向。 今日上午&#xff0c;吉尔吉斯斯坦共和国工商会代表团一行三人受邀抵达济南&#xff0c;开启对德瑞新能源科技有限公司&…

无人机在农业中的应用与挑战!

一、无人机在农业中的作用 1. 提升作业效率与降低成本 无人机在喷洒农药、播种、施肥、吊运等环节显著提升效率。例如&#xff0c;湖北秭归县使用大疆T100无人机吊运脐橙&#xff0c;单次85公斤的运输任务仅需2分钟&#xff0c;而人工需1小时&#xff0c;综合成本降低250元…

QT网络拓扑图绘制实验

前言 在网络通讯中&#xff0c;我qt常用的是TCP或者UDP协议&#xff0c;就比方说TCP吧&#xff0c;一台服务器有时可能会和多台客户端相连接&#xff0c;我之前都是处理单链接情况&#xff0c;最近研究图结构的时候&#xff0c;突然就想到了这个问题。那么如何解决这个问题呢&…

支持中文对齐的命令行表格打印python库——tableprint

文章目录 快速入门 还在为表格中含有中文&#xff0c;命令行打印无法对齐而苦恼吗&#xff1f; 还在为冗长的数据添加代码而抓狂吗&#xff1f; tableprint来了&#xff01;&#xff01;&#xff01;&#xff0c;它完美的解决了上述两个问题&#xff0c;快来试试吧&#xff01;…

从《周游记3》演绎歌剧版《菊花台》,周杰伦婚礼曲目意大利文版惊喜亮相

今天&#xff08;4月19日&#xff09;22:00&#xff0c;由魔胴西西里咖啡冠名的户外实境互动综艺《周游记3》第四期即将播出。本期节目中&#xff0c;“J式之旅”发起人周杰伦和林暐恒、杜国璋、陈冠霖、陈冠廷&#xff0c;将继续意大利之旅&#xff0c;从那不勒斯的百年老店到…

生物化学笔记:医学免疫学原理23 免疫检查点分子与肿瘤免疫治疗(PD-1抑制剂黑色素瘤)

免疫检查点分子与肿瘤免疫治疗 免疫检查点分子与肿瘤免疫治疗-2

CasualLanguage Model和Seq2Seq模型的区别

**问题1&#xff1a;**Causal Language Modeling 和 Conditional Generation 、Sequence Classification 的区别是什么&#xff1f; 因果语言模型(Causal Language Model)&#xff1a; 预测给定文本序列中的下一个字符&#xff0c;一般用于文本生成、补全句子等&#xff0c;模型…

verilog float mult

module pipe_float_mul(input wire clk ,// 时钟信号input wire en ,// 使能信号input wire rst_n ,// 复位信号input wire round_cfg ,// 决…

微信小程序调用yolo目标检测模型

目录 后端 前端微信小程序 完整代码 后端 利用Flask&#xff0c;调用目标检测模型&#xff0c;后端代码如下。 # flask_yolo.py from flask import Flask, request, jsonify from ultralytics import YOLO from PIL import Imageapp Flask(__name__) model_path best.p…

Flink框架十大应用场景

Flink框架适合应用的场景 1. 流式数据处理 Flink框架最常用的应用场景是流式数据处理。流式数据处理是指对实时数据进行处理,以便及时地做出决策。例如,一个电商网站需要对用户的行为进行实时分析,以便根据用户的兴趣和行为推荐商品。Flink框架可以帮助电商网站实时地处理数…

【android telecom 框架分析 01】【基本介绍 2】【BluetoothPhoneService为何没有源码实现】

1. 背景 我们会在很多资料上看到 BluetoothPhoneService 类&#xff0c;但是我们在实际 aosp 中确找不到具体的实现&#xff0c; 这是为何&#xff1f; 这是一个很好的问题&#xff01;虽然在车载蓝牙电话场景中我们经常提到类似 BluetoothPhoneService 的概念&#xff0c;但…

【Harmony】文本公共接口EditMenuOptions的使用

文章目录 一、EditMenuOptions介绍二、相关接口介绍2.1、editMenuOptions2.2、EditMenuOptionsonCreateMenu函数说明onMenuItemClick函数说明 2.3、TextRange对象说明2.4、TextMenuItem对象说明2.5、TextMenuItemId属性ofequals 三、简单案例 一、EditMenuOptions介绍 EditMen…

《软件设计师》复习笔记(14.1)——面向对象基本概念、分析设计测试

目录 一、面向对象基本概念 对象&#xff08;Object&#xff09; 类&#xff08;Class&#xff09; 抽象&#xff08;Abstraction&#xff09; 封装&#xff08;Encapsulation&#xff09; 继承&#xff08;Inheritance&#xff09; 多态&#xff08;Polymorphism&#…

JS中实现类似sleep、wait、delay的延时功能

前言 编写代码时很多时候需要进行流程化的操作&#xff0c;各个流程间通常需要等待一定时间&#xff0c;这在很多语言中通常可以使用 sleep 、 wait 、 delay 等函数来实现。JavaScript原生并没有类似的功能&#xff0c;想要延时通常就是使用 setTimeout(functionRef, delay) …