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

转载请注明出处:小锋学长生活大爆炸[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 ]; thenecho "❌ 参数解析失败"exit 1
fi
eval set -- "$ARGS"
while true; docase "$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" inwrite) 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}; doGID=$(cat /sys/class/infiniband/${DEVICE}/ports/${PORT}/gids/$i)echo "GID[$i] = $GID"if [[ "$GID" =~ .*c0a8.* ]]; then  # 检查是否含有192.168.5.x对应十六进制段GID_INDEX=$ifi
done
if [[ "$GID_INDEX" -eq "-1" ]]; thenecho "❌ 未能自动识别出 GID index,请手动设置 GID_INDEX"exit 1
elseecho "✅ 使用 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]*; dogov_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 1restore_governors() {echo -e "\n[清理] 恢复原有 CPU governor 设置..."for cpu in "${!ORIGINAL_GOVERNORS[@]}"; doecho "${ORIGINAL_GOVERNORS[$cpu]}" | sudo tee /sys/devices/system/cpu/$cpu/cpufreq/scaling_governor > /dev/nulldone
}
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" ]]; thenecho "🟢 正在启动 server(设备=$DEVICE, 端口=$PORT, GID=$GID_INDEX, 模式=$TEST_TOOL)"# send 模式提示 + 参数处理if [[ "$MODE_TYPE" == "send" ]]; thenecho -e "\n📢 注意:当前为 send 模式,client需要主动发送数据"if [[ "$MODE" == "server" ]]; thenCOMMON_ARGS="$COMMON_ARGS --run_infinitely"fifiecho "🔧 实际执行命令:sudo $TEST_TOOL $COMMON_ARGS"while true; doecho -e "\n🟢 等待 client 连接..."sudo $TEST_TOOL $COMMON_ARGSecho -e "\n✅ 当前 client 测试完成,等待下一个连接...\n"sleep 1done
elif [[ "$MODE" == "client" ]]; thenif [[ -z "$PEER_IP" ]]; thenecho "❌ 错误:client 模式需要指定 server IP"echo "用法:$0 client <server_ip> [device] [port] [mode_type]"exit 1fiecho "🚀 正在连接到 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"
elseecho "❌ 错误:必须指定模式参数 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.mzph.cn/bicheng/77118.shtml

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

相关文章

计算机网络 - TCP协议

通过一些问题来讨论 TCP 协议 什么是 TCP &#xff1f;举几个应用了 TCP 协议的例子TCP协议如何保证可靠性&#xff1f;tcp如何保证不会接受重复的报文&#xff1f;Tcp粘包拆包问题了解吗&#xff1f;介绍一下&#xff0c;如何解决&#xff1f;TCP拥塞控制与流量控制区别&…

Fiddler 进行断点测试:调试网络请求

目录 一、什么是断点测试&#xff1f; 二、Fiddler 的断点功能 三、如何在 Fiddler 中设置断点&#xff1f; 步骤 1&#xff1a;启动 Fiddler 步骤 2&#xff1a;启用断点 步骤 3&#xff1a;捕获请求 步骤 4&#xff1a;修改请求或响应 四、案例&#xff1a;模拟登录失…

OpenCv高阶(三)——图像的直方图、图像直方图的均衡化

目录 一、直方图 1、计算并显示直方图 2、使用matplotlib方法绘制直方图&#xff08;不划分小的子区间&#xff09; 3、使用opencv的方法绘制直方图 &#xff08;划分16个小的子亮度区间&#xff09; 4、绘制彩色图像的直方图&#xff0c;将各个通道的直方图值都画出来 二、…

Flutter 与原生通信

Flutter 与原生之间的通信主要基于通道机制&#xff0c;包括 MethodChannel、EventChannel 和 BasicMessageChannel。 MethodChannel&#xff1a;用于 Flutter 与原生之间的方法调用&#xff0c;实现双向通信&#xff0c;适合一次性的方法调用并获取返回值&#xff0c;如 Flut…

前端面试-Vue篇

核心概念 Vue 3的响应式原理与Vue 2有何本质区别&#xff1f;Vue中虚拟DOM的diff算法优化策略有哪些&#xff1f;Vue组件间通信方式有哪些&#xff1f;适用场景分别是什么&#xff1f;Vue的生命周期钩子在Composition API中如何替代&#xff1f;Vue的模板编译过程是怎样的&…

光刻机研发与市场现状分析报告

1. 引言 光刻机&#xff08;Lithography Machine&#xff09;是半导体制造的核心设备&#xff0c;其技术水平和市场供应能力直接影响全球芯片产业的发展。随着人工智能&#xff08;AI&#xff09;、5G、高性能计算&#xff08;HPC&#xff09;和自动驾驶等技术的兴起&#xff0…

Missashe考研日记-day21

Missashe考研日记-day21 1 专业课408 学习时间&#xff1a;4h学习内容&#xff1a; 今天先把昨天学的内容的课后习题做了&#xff0c;整整75道啊&#xff0c;然后学了OS第二章关于CPU调度部分的内容&#xff0c;这第二章太重要了&#xff0c;以至于每一小节的内容都比较多&am…

【玩转全栈】—— Django+vue3+讯飞星火API 实现前端页面实时AI答复

技术栈&#xff1a;vue3 element-plus axios pinia router Django5 websocket 讯飞星火API 本文将实现一个 AI 聊天对话功能&#xff0c;将前端用户输入问题以及之前对话发送给后端&#xff0c;通过 api 访问大模型&#xff0c;返回前端实时对话数据。 调用 讯飞星火API…

广东广州一家IPO资产重组疑点重重,信息披露真实性存疑

作者&#xff1a;Eric 来源&#xff1a;IPO魔女 4月18日&#xff0c;广州瑞立科密汽车电子股份有限公司&#xff08;简称“瑞立科密”&#xff09;将接受深交所主板IPO上会审核。公司保荐机构为中信证券&#xff0c;拟募集资金为15.2162亿元。 瑞立科密过往资产重组疑点重重&a…

银河麒麟(Kylin) - V10 SP1桌面操作系统ARM64编译QT-5.15.12版本

银河麒麟(Kylin) - V10 SP1桌面操作系统ARM64编译QT-5.15.12版本 原因 测试Kylin-Desktop-V10-SP1-General-Release-2303-arm64系统下&#xff0c;编译QT-5.15.12版本已做测试。 测试环境 测试板配置 型号&#xff1a;LM-D2000-NONE-1w-V01-pc_A2150 CPU&#xff1a;飞腾D20…

查看前端项目依赖树型结构关系图的详细方法,涵盖 命令行工具 和 可视化工

以下是查看前端项目依赖树型结构关系图的详细方法&#xff0c;涵盖 命令行工具 和 可视化工具&#xff1a; 一、命令行工具生成依赖树 1. npm # 查看项目依赖树&#xff08;文本形式&#xff09; npm ls# 查看指定包的依赖树 npm ls <package-name># 生成JSON格式的依…

Ollama高并发测试

本文主要来测试一下ollama的高并发能力。 具体配置如下&#xff1a; 一、Ollama默认参数执行 我们打开4个窗口&#xff0c;然后分别让DeepSeek “给我讲一个笑话” &#xff0c;看下不同窗口的答题顺序。 通过答题顺序可以看到&#xff0c;在不进行参数设置时&#xff0c;模…

资源管理与HPA:让Kubernetes应用自动伸缩

引言&#xff1a;从“手动挡”到“自动驾驶” 想象我们驾驶一辆汽车&#xff0c;手动调节油门和换挡不仅费力&#xff0c;还难以应对突发状况。我们的应用服务也一样&#xff0c;在面对突然的流量增长&#xff0c;内存使用暴涨该如何应对。HPA&#xff08;Horizontal Pod Auto…

Windows 下 MongoDB ZIP 版本安装指南

在开发和生产环境中&#xff0c;MongoDB 是一种非常流行的 NoSQL 数据库&#xff0c;以其灵活性和高性能而受到开发者的青睐。对于 Windows 用户来说&#xff0c;MongoDB 提供了多种安装方式&#xff0c;其中 ZIP 版本因其灵活性和轻量级的特点&#xff0c;成为很多开发者的首选…

【Linux网络与网络编程】11.数据链路层mac帧协议ARP协议

前面在介绍网络层时我们提出来过一个问题&#xff1a;主机是怎么把数据交给路由器的&#xff1f;那里我们说这是由数据链路层来做的。 网络上的报文在物理结构上是以mac帧的形式流动的&#xff0c;但在逻辑上是以IP流动的&#xff0c;IP的流动是需要mac帧支持的。 数据链路层解…

多模态思维链AI医疗编程:从计算可持续性到开放域推理的系统性解决方案

多模态思维链AI医疗编程:从计算可持续性到开放域推理的系统性解决方案 医疗AI领域的多模态思维链技术正在重塑临床决策支持、医学影像分析和医疗流程优化的范式。本指南从计算可持续性、错误传播控制、伦理安全防护和通用性扩展四大维度,系统解析医疗大模型落地落地的关键要…

代理模式深度解析

目录 一 静态代理 1.1 优点 1.2 缺点 1.3 适用场景 二 JDK动态代理 1 JDK动态代理的工作原理 1.1 创建代理类 1.2 加载代理类 1.3 实现方法调用 2. Proxy.newProxyInstance() 的核心工作流程 方法签名 工作步骤 3. 代理类的生成与加载 3.1 代理类生成的关键方法 …

Spring Cache与Redis集成原理

一、核心架构图解 #mermaid-svg-aiWGQLhmWx7kOfLz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-icon{fill:#552222;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-text{fill:#552222;stroke:#5…

编程技能:调试02,设置断点与删除断点

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;调试01&#xff0c;调试介绍 回到目录 下…

flink写doris时的优化

1.概念 doris并不擅长高频、小量数据的导入&#xff1b; 因为doris每一次数据导入都会在be节点上生成数据文件&#xff1b;如果高频导入小量数据&#xff0c;就会在存储层产生大量的小文件&#xff08;必然会影响到后续的查询效率&#xff0c;也会对系统产生更多的compaction…