当前位置: 首页 > news >正文

RDMA性能测试翻车实录:ib_write_bw报错 ‘ethernet_read_keys‘ 的排查与修复

RDMA性能测试实战:从ib_write_bw报错到深度排查的完整指南

那天下午,机房里服务器风扇的嗡鸣声格外刺耳。我正试图在两台配置了Mellanox ConnectX-5网卡的服务器之间进行RDMA带宽测试,却在执行ib_write_bw命令时遇到了一个令人困惑的错误:"ethernet_read_keys: Couldn't read remote address"。这个看似简单的错误信息背后,隐藏着RDMA通信建立过程中QP(Queue Pair)配置不一致的典型问题。本文将带你完整还原这次故障排查的全过程,并深入探讨RDMA连接建立的底层机制。

1. 问题现象与环境准备

测试环境由两台服务器组成,通过100Gbps光纤直连:

  • 服务器A(服务端):

    • IP地址: 192.168.100.1
    • 网卡: Mellanox ConnectX-5 (mlx5_1)
    • 操作系统: Ubuntu 20.04 LTS
    • RDMA驱动版本: MLNX_OFED 5.4
  • 服务器B(客户端):

    • IP地址: 192.168.100.2
    • 网卡: Mellanox ConnectX-5 (mlx5_0)
    • 其他配置与服务器A相同

执行测试时,我分别在两台服务器上运行了以下命令:

# 在服务器A(服务端)执行 ib_write_bw --ib-dev=mlx5_1 # 在服务器B(客户端)执行 ib_write_bw --ib-dev=mlx5_0 192.168.100.1 --qp=10

客户端几乎立即返回了错误信息:

ethernet_read_keys: Couldn't read remote address Unable to read from socket/rdma_cm Failed to exchange data between server and clients

2. 初步排查与错误分析

面对这个错误,我首先检查了网络连通性和RDMA配置的基本情况:

  1. 基础网络检查

    • 确认两台服务器之间的IP连通性(ping测试)
    • 验证RDMA链路状态:ibstat mlx5_0ibstat mlx5_1显示状态正常
    • 检查端口状态:iblinkinfo显示物理链路已建立
  2. 错误信息解读

    • "ethernet_read_keys"表明错误发生在RDMA连接建立阶段
    • "Couldn't read remote address"提示地址交换失败
    • 错误源自rdma_cm(通信管理器)组件
  3. 关键发现

    • 服务端和客户端使用的QP数量不一致
    • 服务端未指定QP数量(默认为1),而客户端指定了--qp=10

3. RDMA连接建立原理深度解析

要理解这个错误的根本原因,我们需要深入RDMA连接建立的机制:

3.1 RDMA通信建立流程

RDMA通信通过rdma_cm建立连接,主要步骤包括:

  1. 创建通信标识(rdma_create_id)
  2. 解析地址(rdma_resolve_addr)
  3. 路由解析(rdma_resolve_route)
  4. 建立连接(rdma_establish)

在这个过程中,客户端和服务端会交换以下关键信息:

  • 本地和远程地址
  • QP属性(包括QP数量)
  • 其他连接参数

3.2 QP(Queue Pair)的作用

QP是RDMA通信的核心概念,具有以下特点:

QP属性描述
发送队列(SQ)存放要发送的工作请求(Work Request)
接收队列(RQ)存放接收工作请求
完成队列(CQ)记录已完成的操作
数量配置客户端和服务端必须配置相同的QP数量才能成功建立连接

3.3 错误根源定位

通过分析rdma_cm的工作流程,可以确定:

  • 客户端尝试建立10个QP的连接
  • 服务端只准备处理1个QP的连接
  • 在地址交换阶段,双方配置不匹配导致连接建立失败

4. 问题解决方案与验证

基于上述分析,解决方案变得清晰:

4.1 修正命令参数

确保服务端和客户端使用相同的QP数量:

# 服务端命令(增加--qp=10参数) ib_write_bw --ib-dev=mlx5_1 --qp=10 # 客户端命令(保持--qp=10不变) ib_write_bw --ib-dev=mlx5_0 192.168.100.1 --qp=10

4.2 验证步骤

  1. 首先在服务端启动ib_write_bw:
# 服务端 ib_write_bw --ib-dev=mlx5_1 --qp=10
  1. 然后在客户端运行测试:
# 客户端 ib_write_bw --ib-dev=mlx5_0 192.168.100.1 --qp=10
  1. 观察输出,成功连接后应看到类似以下带宽测试结果:
--------------------------------------------------------------------------------------- RDMA_Write BW Test Dual-port : OFF Device : mlx5_0 Number of qps : 10 Transport type : IB Connection type : RC Using SRQ : OFF TX depth : 128 CQ Moderation : 1 Mtu : 4096[B] Link type : Ethernet GID index : 3 Max inline data : 0[B] rdma_cm QPs : ON Data ex. method : Ethernet --------------------------------------------------------------------------------------- local address: LID 0000 QPN 0x01b1 PSN 0xf6a5d1 remote address: LID 0000 QPN 0x0195 PSN 0x4a1b1d --------------------------------------------------------------------------------------- #bytes #iterations BW peak[MB/sec] BW average[MB/sec] MsgRate[Mpps] 65536 1000 9132.43 9131.98 0.146

4.3 其他相关参数调优

在实际性能测试中,还可以考虑调整以下参数:

  • 消息大小:通过-s参数指定(如-s 65536)
  • 测试持续时间:通过-t参数控制(如-t 30表示30秒)
  • TX深度:通过-d参数调整(如-d 128)

例如,完整的性能测试命令可能如下:

# 服务端 ib_write_bw --ib-dev=mlx5_1 --qp=10 -s 65536 -d 128 # 客户端 ib_write_bw --ib-dev=mlx5_0 192.168.100.1 --qp=10 -s 65536 -d 128 -t 30

5. RDMA性能测试最佳实践

基于这次排查经验,总结出以下RDMA测试的最佳实践:

  1. 参数一致性检查清单

    • QP数量(--qp)
    • 端口选择(--ib-dev)
    • 消息大小(-s)
    • TX深度(-d)
    • 其他特殊参数
  2. 环境准备步骤

    • 确认网卡固件和驱动版本一致
    • 验证物理链路状态(ibstatus/iblinkinfo)
    • 检查防火墙设置(确保相关端口开放)
  3. 常见问题排查表

错误现象可能原因检查点
Couldn't read remote addressQP数量不匹配对比服务端和客户端--qp参数
Failed to resolve route网络不通或IP错误ping测试,路由表检查
Couldn't set up the connection防火墙阻止或端口冲突防火墙状态,端口占用情况
Unsupported transport type网卡模式配置错误检查网卡工作模式(IB/Ethernet)
  1. 高级调试技巧
    • 使用rdma_cm的调试日志:export RDMAV_DEBUG=1
    • 检查内核日志:dmesg | grep mlx5
    • 使用ibv_devinfo验证设备能力

6. 深入理解ib_write_bw工具

ib_write_bw是RDMA性能测试的核心工具之一,其工作原理值得深入理解:

6.1 工具架构

ib_write_bw的工作流程可以分为几个阶段:

  1. 初始化阶段

    • 创建设备上下文
    • 分配保护域(PD)
    • 创建完成队列(CQ)
  2. 资源准备阶段

    • 注册内存区域(MR)
    • 创建QP(根据--qp参数决定数量)
  3. 连接建立阶段

    • 通过rdma_cm建立连接
    • 交换QP信息
    • 过渡QP到RTR(Ready to Receive)状态
  4. 测试执行阶段

    • 发布工作请求(WR)
    • 等待完成通知
    • 计算带宽和延迟

6.2 关键参数解析

ib_write_bw支持多种参数调优,以下是几个重要参数:

参数描述默认值
--ib-dev指定使用的RDMA设备
--qp设置Queue Pair数量1
-s设置消息大小(字节)65536
-d设置发送队列深度128
-t设置测试持续时间(秒)无限
--report-iter设置报告间隔(迭代次数)

6.3 性能优化建议

根据实际测试经验,提供以下优化建议:

  1. QP数量选择

    • 对于高带宽测试,适当增加QP数量(如8-16)
    • 但需注意过多QP会增加CPU开销
  2. 消息大小选择

    • 大消息(如1MB)适合测量最大带宽
    • 小消息(如4KB)适合测试延迟和消息率
  3. 内存注册优化

    • 使用--mem-reg-type选择合适的内存注册方式
    • 对于大数据传输,考虑使用MR_DMA类型
# 示例:使用DMA内存注册进行大块传输测试 ib_write_bw --ib-dev=mlx5_0 --mem-reg-type=DMA 192.168.100.1

7. 扩展应用:自动化测试脚本开发

为了简化重复测试过程,可以开发自动化测试脚本。以下是一个简单的bash脚本示例:

#!/bin/bash # RDMA自动化测试脚本 SERVER_IP="192.168.100.1" IB_DEV="mlx5_0" QP_LIST="1 2 4 8 16" MSG_SIZES="4096 16384 65536 131072 1048576" echo "Starting RDMA benchmark tests..." for qp in $QP_LIST; do for size in $MSG_SIZES; do echo "Testing with QP=$qp, MSG_SIZE=$size" # 启动服务器端 ssh $SERVER_IP "ib_write_bw --ib-dev=mlx5_1 --qp=$qp -s $size -d 128" & sleep 2 # 运行客户端测试 ib_write_bw --ib-dev=$IB_DEV $SERVER_IP --qp=$qp -s $size -d 128 -t 10 sleep 5 # 等待连接清理 done done echo "All tests completed."

这个脚本可以:

  • 自动遍历不同的QP数量和消息大小组合
  • 在服务端和客户端自动执行匹配的命令
  • 每次测试后留有清理时间

在实际项目中,我们基于类似的脚本框架扩展出了完整的RDMA性能回归测试系统,能够自动收集结果并生成可视化报告。

http://www.zskr.cn/news/1538259.html

相关文章:

  • 广东信誉良好商标设计公司排行:合规与落地能力实测对比 - 起跑123
  • 避开Android录音的坑:AudioRecord参数配置详解与常见问题排查(附Log分析)
  • 2026年水族店进货选灯具品牌:周转快售后好的品牌对比与推荐 - 观域传媒
  • Agent运行时层的标准化:Session、Harness与Sandbox解耦实践
  • 面经经验分享|对自己的项目“心中有数”
  • iOS开发调试神器!2026免费音频转CAF在线保姆级教程(无限制+秒速) - 时时资讯
  • 单体架构演进SOA的实战路径与组织适配
  • Windows PE加载机制深度解析:SizeOfImage与内存映射原理
  • 2026一年过的真快啊
  • Windows 11精简终极指南:5步打造轻量级定制系统
  • 2026年6月份国内防静电无尘布头部厂家综合实力排行盘点 - 资讯快报
  • AI秒出答案的时代,别让快速回复废掉你的深度思考
  • 2026免费音频合并全攻略:多段录音一键成曲,顺序随心调 - 时时资讯
  • 性价比高的openclaw哪个更好
  • P1350 车的放置 【洛谷算法习题】
  • 避坑指南:TCA9548A切换I2C通道时,STM32 HAL库这些细节不注意就白忙活了
  • RTOS多任务下的I2C通信:用FreeRTOS信号量实战解决温湿度传感器与光照传感器的总线竞争
  • 国内防静电无尘布厂家综合实力排行及核心能力解析 - 资讯快报
  • 在Windows上找回Apple触控板原生体验:mac-precision-touchpad驱动完全指南
  • Webots仿真避坑实录:从URDF到PROTO,我遇到的5个典型错误及解决方法
  • Kinetis SDK 2.0.0架构解析与嵌入式开发实战指南
  • MPC8360E PCI控制器寄存器配置与错误管理实战解析
  • SpringBoot项目整合OpenAI API实战:从代理配置到解决429错误的完整避坑指南
  • 关于自动卷线器厂家排名,4大问题一文说清 - 资讯快报
  • Python新手必看:用with open()读文件总报错?这5个检查步骤帮你搞定FileNotFoundError
  • 终极键盘防抖解决方案:如何彻底解决机械键盘连击问题
  • fdisk与parted分区限制详解:彻底弄懂MBR 2TB限制与GPT无限制差异
  • 嵌入式调试实战:通过debugfs访问QorIQ硬件寄存器
  • ICMP协议实战指南:从ping原理到企业级策略配置
  • 2026 郑州一楼卫生间地下返渗水根治维修?实测 5 家本地正规口碑防水企业 - 防水资讯