RDMA性能测试翻车实录:ib_write_bw报错 ‘ethernet_read_keys‘ 的排查与修复 RDMA性能测试实战从ib_write_bw报错到深度排查的完整指南那天下午机房里服务器风扇的嗡鸣声格外刺耳。我正试图在两台配置了Mellanox ConnectX-5网卡的服务器之间进行RDMA带宽测试却在执行ib_write_bw命令时遇到了一个令人困惑的错误ethernet_read_keys: Couldnt read remote address。这个看似简单的错误信息背后隐藏着RDMA通信建立过程中QP(Queue Pair)配置不一致的典型问题。本文将带你完整还原这次故障排查的全过程并深入探讨RDMA连接建立的底层机制。1. 问题现象与环境准备测试环境由两台服务器组成通过100Gbps光纤直连服务器A(服务端):IP地址: 192.168.100.1网卡: Mellanox ConnectX-5 (mlx5_1)操作系统: Ubuntu 20.04 LTSRDMA驱动版本: MLNX_OFED 5.4服务器B(客户端):IP地址: 192.168.100.2网卡: Mellanox ConnectX-5 (mlx5_0)其他配置与服务器A相同执行测试时我分别在两台服务器上运行了以下命令# 在服务器A(服务端)执行 ib_write_bw --ib-devmlx5_1 # 在服务器B(客户端)执行 ib_write_bw --ib-devmlx5_0 192.168.100.1 --qp10客户端几乎立即返回了错误信息ethernet_read_keys: Couldnt read remote address Unable to read from socket/rdma_cm Failed to exchange data between server and clients2. 初步排查与错误分析面对这个错误我首先检查了网络连通性和RDMA配置的基本情况基础网络检查确认两台服务器之间的IP连通性(ping测试)验证RDMA链路状态ibstat mlx5_0和ibstat mlx5_1显示状态正常检查端口状态iblinkinfo显示物理链路已建立错误信息解读ethernet_read_keys表明错误发生在RDMA连接建立阶段Couldnt read remote address提示地址交换失败错误源自rdma_cm(通信管理器)组件关键发现服务端和客户端使用的QP数量不一致服务端未指定QP数量(默认为1)而客户端指定了--qp103. RDMA连接建立原理深度解析要理解这个错误的根本原因我们需要深入RDMA连接建立的机制3.1 RDMA通信建立流程RDMA通信通过rdma_cm建立连接主要步骤包括创建通信标识(rdma_create_id)解析地址(rdma_resolve_addr)路由解析(rdma_resolve_route)建立连接(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数量# 服务端命令(增加--qp10参数) ib_write_bw --ib-devmlx5_1 --qp10 # 客户端命令(保持--qp10不变) ib_write_bw --ib-devmlx5_0 192.168.100.1 --qp104.2 验证步骤首先在服务端启动ib_write_bw# 服务端 ib_write_bw --ib-devmlx5_1 --qp10然后在客户端运行测试# 客户端 ib_write_bw --ib-devmlx5_0 192.168.100.1 --qp10观察输出成功连接后应看到类似以下带宽测试结果--------------------------------------------------------------------------------------- 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.1464.3 其他相关参数调优在实际性能测试中还可以考虑调整以下参数消息大小通过-s参数指定(如-s 65536)测试持续时间通过-t参数控制(如-t 30表示30秒)TX深度通过-d参数调整(如-d 128)例如完整的性能测试命令可能如下# 服务端 ib_write_bw --ib-devmlx5_1 --qp10 -s 65536 -d 128 # 客户端 ib_write_bw --ib-devmlx5_0 192.168.100.1 --qp10 -s 65536 -d 128 -t 305. RDMA性能测试最佳实践基于这次排查经验总结出以下RDMA测试的最佳实践参数一致性检查清单QP数量(--qp)端口选择(--ib-dev)消息大小(-s)TX深度(-d)其他特殊参数环境准备步骤确认网卡固件和驱动版本一致验证物理链路状态(ibstatus/iblinkinfo)检查防火墙设置(确保相关端口开放)常见问题排查表错误现象可能原因检查点Couldnt read remote addressQP数量不匹配对比服务端和客户端--qp参数Failed to resolve route网络不通或IP错误ping测试,路由表检查Couldnt set up the connection防火墙阻止或端口冲突防火墙状态,端口占用情况Unsupported transport type网卡模式配置错误检查网卡工作模式(IB/Ethernet)高级调试技巧使用rdma_cm的调试日志export RDMAV_DEBUG1检查内核日志dmesg | grep mlx5使用ibv_devinfo验证设备能力6. 深入理解ib_write_bw工具ib_write_bw是RDMA性能测试的核心工具之一其工作原理值得深入理解6.1 工具架构ib_write_bw的工作流程可以分为几个阶段初始化阶段创建设备上下文分配保护域(PD)创建完成队列(CQ)资源准备阶段注册内存区域(MR)创建QP(根据--qp参数决定数量)连接建立阶段通过rdma_cm建立连接交换QP信息过渡QP到RTR(Ready to Receive)状态测试执行阶段发布工作请求(WR)等待完成通知计算带宽和延迟6.2 关键参数解析ib_write_bw支持多种参数调优以下是几个重要参数参数描述默认值--ib-dev指定使用的RDMA设备无--qp设置Queue Pair数量1-s设置消息大小(字节)65536-d设置发送队列深度128-t设置测试持续时间(秒)无限--report-iter设置报告间隔(迭代次数)无6.3 性能优化建议根据实际测试经验提供以下优化建议QP数量选择对于高带宽测试适当增加QP数量(如8-16)但需注意过多QP会增加CPU开销消息大小选择大消息(如1MB)适合测量最大带宽小消息(如4KB)适合测试延迟和消息率内存注册优化使用--mem-reg-type选择合适的内存注册方式对于大数据传输考虑使用MR_DMA类型# 示例使用DMA内存注册进行大块传输测试 ib_write_bw --ib-devmlx5_0 --mem-reg-typeDMA 192.168.100.17. 扩展应用自动化测试脚本开发为了简化重复测试过程可以开发自动化测试脚本。以下是一个简单的bash脚本示例#!/bin/bash # RDMA自动化测试脚本 SERVER_IP192.168.100.1 IB_DEVmlx5_0 QP_LIST1 2 4 8 16 MSG_SIZES4096 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-devmlx5_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性能回归测试系统能够自动收集结果并生成可视化报告。