1. 为什么要在普通以太网里折腾 RoCE v2先把结论摆在前面RoCE v2 不是只有大型数据中心才玩得起的东西一台带 Mellanox 网卡的普通服务器、一台支持 PFC/ECN 的交换机再加上 Ubuntu就能把整套链路跑通。我这次做的项目目标很明确——在没有专门无损网络、没有 IB 交换机的普通以太网环境里把 RoCE v2 配起来、测出来验证它到底能带来多少延迟和吞吐收益以及在没有全套无损保障时它会在哪些地方翻车。RoCE v2 全称是 RDMA over Converged Ethernet version 2核心价值在于把 RDMA 的内存直接访问能力搬到以太网上绕开内核协议栈把 CPU 从数据搬运里解放出来。相比传统 TCP它的典型收益是延迟从几十微秒降到个位数微秒、CPU 占用大幅下降、吞吐更接近线速。但它对网络环境比 TCP 挑剔得多丢包、乱序、拥塞都会让性能断崖式下跌这也是很多人“配完能 ping 通但跑不出性能”的根源。这个项目适合谁看一类是想在实验室或小集群里验证 RDMA 收益的运维和开发一类是做分布式存储、高性能计算、AI 训练通信、数据库加速想评估 RoCE v2 是否值得引入的工程师。哪怕你只有两台机器也可以照着这套流程把最小闭环跑起来。我会把选型逻辑、参数计算、实操步骤、踩坑记录全部摊开讲重点放在“普通以太网”这个约束条件下哪些地方必须妥协、哪些地方不能省。需要提前说明的是本文所有设备型号、IP、主机名均为示例代称实际替换成你自己的环境即可。整套方案基于常见实践补全涉及具体参数时我会给出计算过程方便你按自己的硬件换算。2. 整体方案设计与选型考量2.1 为什么选 RoCE v2 而不是 v1 或纯 TCPRoCE 有两个版本v1 直接把 IB 传输层封在以太网帧里依赖二层网络不能跨三层路由v2 把 IB 传输层封进 UDP走标准 IP 路由能跨子网。在普通以太网环境里跨三层是常态所以 v2 是唯一合理选择。至于为什么不直接用 TCP答案在收益结构上TCP 的收发路径要经过内核协议栈、多次内存拷贝、软中断处理单流延迟很难压到 10 微秒以下RoCE v2 用 verbs 接口直接操作注册过的内存区数据路径几乎不经过 CPU延迟和 CPU 占用是两个量级的差别。但选 v2 也意味着你要面对 UDP 封装带来的新问题ECN 标记、PFC 优先级、MTU 一致性、GID 索引选择任何一个配错都会让连接建立失败或者性能异常。这也是为什么很多人第一次配 RoCE v2 会卡在ibv_rc_pingpong连不上或者跑出来延迟比 TCP 还高。2.2 硬件与软件栈的最小组合我把这次的最小组合列成表方便你对照自己的环境组件示例配置关键要求网卡Mellanox ConnectX-4 及以上支持 RoCE v2固件版本较新交换机支持 PFC/ECN 的以太网交换机至少能配优先级流控最好支持 ECN操作系统Ubuntu 20.04 / 22.04 LTS内核自带 MLX5 驱动驱动栈MLNX_OFED 或内核 inbox 驱动建议 OFED 以获得完整工具链测试工具perftest 套件ibv_rc_pingpong、ib_write_bw 等网卡选 ConnectX-4 起步是有原因的更早的 ConnectX-3 对 RoCE v2 的支持有限固件和驱动配合容易出问题ConnectX-4 之后 RoCE v2 是原生支持工具链也成熟。交换机这块是普通以太网环境里最容易被忽视的一环——如果你的交换机完全不支持 PFC 和 ECNRoCE v2 能跑通但在有拥塞时性能会非常难看后面我会专门讲这种“裸奔”场景怎么测、怎么判断瓶颈。2.3 普通以太网约束下的取舍逻辑真正的无损网络要求全网 PFC 配置一致、ECN 阈值调优、缓冲区足够大。普通以太网环境往往做不到全网一致可能只有接入交换机支持核心层不支持。这种情况下我的取舍是优先保证连通性和可测性再逐步加无损保障。具体做法是先不配 PFC用 ECN 做尽力而为的拥塞控制把基线性能测出来然后再在支持 PFC 的链路上开 PFC对比两者差异。这样你能清楚看到无损保障到底值多少性能而不是一上来就追求全套配置结果卡在某一步不知道问题在哪。另一个取舍是 MTU。RoCE v2 对大包敏感MTU 不一致会导致分片和性能下降。普通以太网默认 1500我建议在整条路径上统一开到 4200 或 9000前提是路径上所有设备都支持。如果中间有不支持 jumbo frame 的设备就老老实实保持 1500别为了追求大包把链路搞得不稳定。3. 核心配置细节与实操要点3.1 网卡固件与驱动准备第一步永远是固件和驱动。我见过太多“配置全对但性能不对”的案例最后查出来是固件版本太老。用ethtool -i 网卡名看驱动和固件版本用mlxfwmanager或flint查固件详情。如果用的是 MLNX_OFED安装后会有完整的mlxconfig、mlxstat等工具排查问题方便很多。安装 OFED 时有个细节Ubuntu 自带 inbox 驱动也能跑 RoCE v2但工具链不全ibv_devinfo可能看不到完整信息。我的建议是生产环境用 OFED测试环境可以先用 inbox 驱动快速验证连通性。安装 OFED 前记得卸载冲突的内核模块安装后重启然后用ibv_devices确认设备被识别。# 查看网卡驱动与固件 ethtool -i ens1f0 # 安装 OFED 后确认 RDMA 设备 ibv_devices ibv_devinfo -d mlx5_0ibv_devinfo的输出里重点看两处link_layer应该是 Ethernetactive_mtu要和你的网络 MTU 一致。如果link_layer显示 InfiniBand说明网卡端口模式配错了需要用mlxconfig改端口类型。3.2 GID 索引与 RoCE v2 版本选择这是 RoCE v2 配置里最容易错的一步。每张网卡有多个 GID 索引分别对应不同的 IP 版本和封装格式。RoCE v2 走 IPv4 时GID 索引通常对应RoCE v2类型的条目。用show_gids命令能看到完整映射show_gids输出里会列出每个 GID 索引对应的 IP 和类型。你要找的是类型为v2且 IP 与你业务网段匹配的那一条。测试工具里用-g 索引指定比如ibv_rc_pingpong -g 3。如果索引选错表现是连接超时或者直接报错很多人卡在这里以为是网络不通其实是 GID 选错了。提示GID 索引不是固定的换机器、换驱动版本都可能变。写脚本时不要硬编码用show_gids动态取或者用ibv_devinfo -v里的 GID 表核对。3.3 交换机侧 PFC 与 ECN 配置要点普通以太网环境里交换机配置决定了 RoCE v2 的上限。PFC 的作用是当某个优先级的队列快满时向上游发暂停帧防止丢包ECN 的作用是在拥塞初期给数据包打标记让端侧降速。两者配合才能在不丢包的前提下做拥塞控制。配置 PFC 的关键是优先级映射一致服务器侧把 RoCE 流量打到某个优先级比如 priority 3交换机侧要在这个优先级上开 PFC并且信任服务器发来的 DSCP 或 PCP 标记。常见错误是服务器打了标记但交换机不信任结果 PFC 根本没生效。ECN 则要在交换机上配置 WRED 阈值阈值太低会频繁标记导致降速过度太高则起不到预防作用。普通环境里我一般先用较保守的阈值跑基线再根据实际拥塞情况调。如果交换机不支持 PFC那就只能靠 ECN 加端侧重传兜底性能会有波动但至少能跑。这种情况下测试时要特别关注丢包计数和重传计数它们是判断瓶颈的关键指标。3.4 系统侧参数调优Ubuntu 侧有几个参数必须调。首先是net.core.rmem_max和wmem_maxRDMA 测试工具会申请大块内存默认值可能不够。其次是vm.swappiness调低避免内存被换出影响注册内存区的稳定性。还有net.ipv4.tcp_rmem这类 TCP 参数虽然不直接作用于 RoCE但如果你的测试里混跑 TCP 流量也要一并考虑。# 提高 socket 缓冲区上限 sysctl -w net.core.rmem_max134217728 sysctl -w net.core.wmem_max134217728 # 降低换页倾向 sysctl -w vm.swappiness10另外要确认ulimit -l足够大RDMA 注册内存需要锁定物理页限制太小会导致注册失败。测试环境直接设成 unlimited生产环境按实际需求给。4. 完整实操流程与性能测试4.1 双机直连的最小验证在碰交换机之前我强烈建议先用两台机器直连做最小验证。这样能排除交换机因素确认网卡、驱动、GID 配置本身没问题。两台机器各配一个同网段 IP用 DAC 线或普通网线直连然后跑ibv_rc_pingpong# 服务端 ibv_rc_pingpong -d mlx5_0 -g 3 # 客户端 ibv_rc_pingpong -d mlx5_0 -g 3 服务端IP能跑通说明 RDMA 链路基本没问题。这时候测出来的延迟是理想值通常在个位数微秒。如果这一步就不通别急着上交换机先查 GID 索引、防火墙RoCE v2 走 UDP 4791确认没被拦、以及两端 MTU 是否一致。4.2 带宽与延迟测试的参数选择perftest 套件里常用的几个工具各有侧重ib_write_bw测写带宽ib_read_bw测读带宽ib_write_lat测写延迟。参数上-s指定消息大小-D指定测试时长-F允许大页-q指定队列对数量。消息大小的选择有讲究小消息如 64B、256B测的是延迟和消息速率大消息如 64KB、1MB测的是带宽。我一般会跑一组梯度从 64B 到 1MB看性能曲线拐点在哪。队列对数量影响并发能力单 QP 测的是单流性能多 QP 测的是聚合能力实际业务里往往是多 QP 场景所以两组都要测。# 服务端测写带宽消息大小 65536跑 10 秒 ib_write_bw -d mlx5_0 -g 3 -s 65536 -D 10 # 客户端 ib_write_bw -d mlx5_0 -g 3 -s 65536 -D 10 服务端IP4.3 参数计算MTU 与消息大小的匹配这里补一个容易被忽略的计算。RoCE v2 的报文要装进以太网帧MTU 决定了单个报文能承载的最大 payload。假设 MTU 为 4200减去 IP 头 20 字节、UDP 头 8 字节、IB 传输头若干字节实际可用 payload 会小于 MTU。测试时如果消息大小刚好跨过 MTU 边界会触发分片性能曲线会出现明显台阶。我的经验是测带宽时消息大小选 MTU 的整数倍附近比如 MTU 4200 时选 4096 或 8192避免分片干扰测延迟时用小消息不受 MTU 影响。如果你发现某个消息大小下带宽突然掉一半先怀疑分片和 MTU 不一致。4.4 无损与“裸奔”场景对比测试这是整个项目最有价值的部分。我会在两种配置下各跑一遍完整测试一种是交换机开了 PFC 和 ECN 的无损配置另一种是完全不配流控的普通以太网。对比结果能直接告诉你无损保障值多少性能。测试时除了看带宽和延迟一定要看计数器。用ethtool -S 网卡名看rx_discards、tx_discards、out_of_buffer等计数用mlxstat看更细的拥塞和重传统计。裸奔场景下如果出现大量 discard说明缓冲区被打爆性能下降就是丢包重传导致的。无损场景下 discard 应该接近零但可能出现 PFC 暂停帧计数升高说明拥塞控制在工作。场景预期带宽预期延迟关键观察指标双机直连接近线速个位数微秒无丢包交换机无损接近线速略高于直连PFC 暂停计数交换机裸奔波动明显抖动大discard、重传计数5. 常见问题排查与避坑实录5.1 连接建立失败的三类原因ibv_rc_pingpong连不上是最常见的问题原因基本归为三类。第一类是 GID 索引选错前面讲过用show_gids核对。第二类是防火墙拦了 UDP 4791Ubuntu 默认 ufw 可能是开启的临时关掉或者放行端口验证。第三类是两端 MTU 或 IP 网段不匹配RoCE v2 虽然走 IP但底层还是依赖二层可达跨网段时确认路由和 ARP 正常。排查顺序我一般是从物理层往上先ping通再确认ibv_devinfo状态是 PORT_ACTIVE再看 GID最后看防火墙。这个顺序能避免在高层瞎猜。5.2 能连通但性能异常连通但带宽上不去、延迟偏高问题通常在拥塞控制或参数配置。先看是不是单 QP 测试单 QP 本身受限于单流窗口带宽可能跑不满换多 QP 再测。再看消息大小是否触发分片参考前面的 MTU 计算。还要确认 CPU 亲和性测试进程如果被调度到跨 NUMA 节点内存访问延迟会拉高整体延迟用numactl绑核能改善。另一个隐蔽原因是中断亲和性。RoCE 流量虽然绕开内核协议栈但管理路径和部分事件仍依赖中断中断如果集中在一个核上高负载时可能成为瓶颈。用mlnx_affinity或手动配 IRQ 亲和性能缓解。5.3 常见问题速查表现象可能原因排查动作连接超时GID 索引错、防火墙拦截show_gids 核对、放行 UDP 4791带宽远低于线速单 QP 限制、分片、拥塞多 QP 测试、核对 MTU、看 discard延迟抖动大无 PFC、缓冲区不足开 PFC/ECN、看暂停帧计数注册内存失败ulimit -l 太小调大 locked memory 限制性能随负载下降中断集中、NUMA 跨节点配 IRQ 亲和、numactl 绑核5.4 几个只有踩过才知道的细节第一个细节ibv_devinfo里active_mtu显示的值可能和你ip link配的 MTU 不一致这是因为 RDMA 子系统的 MTU 是独立协商的改完ip link的 MTU 后要确认 RDMA 侧也同步了必要时重启驱动或重新协商。第二个细节普通以太网环境里如果路径上有设备不支持 jumbo frameRoCE v2 的大包会被分片分片后的报文如果丢一片整个消息要重传性能比小包还差。所以 MTU 不是越大越好要整条路径一致。第三个细节测试时尽量用同一批次的网卡和固件混用不同固件版本偶尔会出现兼容性问题表现为间歇性连接失败很难查。6. 我对这套方案的延伸思考这套最小闭环跑通之后我实际用下来的体会是RoCE v2 在普通以太网里“能用”和“好用”之间隔着一整套无损保障。双机直连能让你快速看到 RDMA 的延迟优势但一旦上交换机、有并发流量PFC 和 ECN 的配置质量直接决定性能稳定性。如果你的场景对延迟极其敏感且流量可控普通以太网加 ECN 兜底也能接受如果追求稳定线速交换机侧的无损配置不能省。后续可以扩展的方向有几个一是把测试从两台机器扩到多对多观察交换机缓冲区在多流并发下的表现二是引入实际业务负载比如分布式存储的读写路径看 RoCE v2 在真实 IO 模式下的收益三是做故障注入模拟链路抖动和丢包验证端侧重传和拥塞控制的恢复能力。这些都比单纯跑 perftest 更接近生产实际也是我接下来准备继续折腾的部分。