普通以太网跑通RoCE v2:Mellanox网卡配置与验证实战
发布时间:2026/10/23 5:40:35 锦皓数字建站

RDMA 这个词这几年在存储、AI 训练集群、高性能计算圈子里被提得越来越多但真正动手在普通以太网环境里把 RoCE v2 跑通的人其实没那么多。大部分人卡在两个地方一是以为 RoCE 必须配一套昂贵的专用网络二是照着文档配完发现带宽上不去、延迟下不来甚至压根连不通。这篇内容就是把我自己在普通以太网交换机加 Mellanox 网卡、Ubuntu 系统上反复折腾 RoCE v2 的完整过程摊开讲清楚——从硬件和系统前提、驱动与固件准备、网卡侧配置、交换机侧要点到怎么用工具验证它真的在跑 RDMA 而不是悄悄退化成了 TCP。适合已经有一台带 Mellanox 网卡的机器、想低成本验证 RoCE v2 到底能带来多少收益的运维和开发同学也适合刚接触 RDMA、需要一份能照着抄的落地清单的入门者。1. 先搞清楚 RoCE v2 在普通以太网上到底靠什么成立很多人对 RoCE 的第一印象是要无损网络、要 PFC、要 DCB普通交换机玩不了。这个印象不算错但也不全对。要判断自己手上的普通以太网环境能不能跑 RoCE v2得先弄明白它依赖的几块基石分别是什么哪些是硬性门槛哪些是可以妥协的。1.1 RoCE v2 相比 v1 改了什么为什么这决定了它能走三层RoCE v1 是二层协议报文直接封在以太网帧里靠 EtherType 区分这意味着它只能在同一个二层广播域内通信跨网段就废了。RoCE v2 把 RDMA 的传输层封进了 UDP端口号固定 4791于是它变成了一个可以路由的三层协议。这个改动看起来只是套了层 UDP但实际影响很大你可以在三层网络里规划 RDMA 流量可以用普通的 IP 路由交换机不需要认识什么特殊的 EtherType。代价是 v2 对网络的要求从二层不能有环、不能丢包变成了三层路径上尽量不丢包。因为 RDMA 的可靠传输是靠网卡硬件做的一旦中间交换机把包丢了重传逻辑在网卡里恢复代价比 TCP 大得多。所以普通以太网能跑 RoCE v2但能跑和跑得好是两回事这一点后面会反复提到。1.2 无损网络是不是硬性前提区分能通和跑满这是最容易劝退人的一个认知误区。实测下来在一个完全没有配置 PFC 的普通交换机环境里RoCE v2 是可以建立连接、可以传数据的ibv_rc_pingpong这类小报文测试能跑通。但只要一开始打大流量比如ib_write_bw拉满带宽丢包就会导致性能断崖式下跌甚至出现连接重置。所以我的判断标准是这样的如果你只是做功能验证、跑跑小规模 RDMA 应用、延迟敏感但流量不大普通以太网不配 PFC 也能凑合如果你要跑满 100G 甚至 200G 带宽、要做存储后端或者分布式训练的参数同步那 PFC 和合理的 QoS 规划基本是绕不开的。这篇文章会两条路都讲先让你在普通环境里把功能跑通再告诉你往生产走要补哪些课。1.3 硬件与系统的最低门槛清单在动手之前先把下面这张表对照一遍缺哪项先补哪项能省掉后面大量无效排查。项目最低要求建议说明网卡Mellanox ConnectX-4 及以上ConnectX-5/6CX-3 对 RoCE v2 支持有限不建议交换机支持流控的千兆/万兆/25G 交换机支持 PFC 的数据中心级交换机普通交换机可跑功能跑满需 PFC系统Ubuntu 20.04/22.0422.04 LTS内核自带 mlx5 驱动固件与驱动匹配的版本用 mlnxup 统一管理固件驱动不匹配是常见坑内存8G 以上16G 以上大页内存测试需要预留网卡这块要特别说一句ConnectX-3 虽然便宜但它对 RoCE v2 的支持在较新驱动里已经比较勉强很多新特性拿不到建议直接从 CX-4 起步。另外确认网卡是单口还是双口双口卡做 RoCE 测试时要注意两口不要配到同一个子网里造成路由混乱。2. 驱动、固件与系统参数的准备顺序不能乱这一节是我踩坑最多的地方。很多人上来就apt install一堆包结果驱动版本和固件对不上ibv_devinfo能看到设备但状态不对排查半天发现是固件太老。正确的顺序应该是先确认系统自带驱动能不能用再决定要不要装官方驱动包最后统一固件。2.1 先看系统自带驱动是否够用Ubuntu 22.04 的内核已经内置了mlx5_core驱动绝大多数 ConnectX-4/5/6 网卡插上去就能被识别。先跑这两条命令确认lspci | grep -i mellanox lsmod | grep mlx5第一条能看到网卡的 PCI 地址和型号第二条能看到mlx5_core、mlx5_ib这些模块是否加载。如果mlx5_ib没加载手动modprobe mlx5_ib一下。系统自带驱动的好处是稳定、和内核绑定紧密坏处是版本可能偏旧某些新网卡的新特性拿不到。我的建议是如果只是做 RoCE v2 基础功能验证系统自带驱动完全够用别急着装官方 OFED 包。官方驱动包现在叫 DOCA-OFED 或 MLNX_OFED适合需要特定版本、需要高级特性、或者系统驱动确实不认网卡的场景。装官方包之前一定要确认它支持你当前的内核版本否则装完可能连网卡都起不来。2.2 固件版本与驱动的匹配关系固件这块有个很实在的经验固件不是越新越好而是要和驱动匹配。Mellanox 网卡的固件更新用mlxfwmanager或者官方的mlnxup工具。先查当前固件sudo mlxfwmanager --query输出里会显示 PSID 和当前固件版本。判断要不要升级的标准是看官方驱动包 release notes 里推荐的固件版本区间。如果固件比驱动要求的低太多会出现ibv_devinfo里fw_ver正常但 RDMA 功能异常的情况这种问题极难排查因为表面看一切正常。升级固件前务必确认网卡型号和 PSID 完全对应刷错固件会把网卡刷砖。升级命令大致是sudo mlxfwmanager -i fw-xxxx.bin -d 0000:xx:00.0 -u -y刷完重启再用mlxfwmanager --query确认版本。这一步不要图快刷之前把机器上跑的业务停掉。2.3 大页内存与 ulimit 的预配置RDMA 应用注册内存时对页大小敏感用大页能显著降低注册开销。配置大页# 临时生效 echo 2048 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages # 永久生效编辑 /etc/sysctl.conf 加入 vm.nr_hugepages 20482048 个 2M 大页就是 4G够大多数测试用。同时把ulimit -l锁定内存调大RDMA 注册内存需要锁定物理页默认值往往不够# /etc/security/limits.conf 加入 * soft memlock unlimited * hard memlock unlimited改完重新登录生效。这一步不做的话后面跑ib_write_bw大消息测试时可能报内存注册失败报错信息还不直观容易误判成网卡问题。3. 网卡侧配置IP、MTU 与 RoCE 模式的取舍网卡配置这一节的核心矛盾是你要让 RDMA 流量和普通 IP 流量共存于同一张网卡还是给 RDMA 单独规划在普通以太网环境里通常是共存那就得把 IP 规划、MTU、RoCE 模式这几件事想清楚。3.1 给 RDMA 用的接口配 IP 的正确姿势假设两台机器各有一张双口 Mellanox 网卡我们只用其中一口做 RoCE 测试。先确认接口名ip link showMellanox 网卡的接口名通常是enp开头或者ens开头具体看 PCI 槽位。给测试口配一个独立子网的 IP比如192.168.100.1/24和192.168.100.2/24。这里有个细节不要把这个口配成默认路由出口否则 RDMA 测试流量可能被路由到别的网卡上去。用ip route确认一下路由表确保192.168.100.0/24走的是正确的接口。配 IP 用netplan或者直接ip addr add临时配都行测试阶段我倾向临时配避免改配置文件改出问题sudo ip addr add 192.168.100.1/24 dev enp3s0f0 sudo ip link set enp3s0f0 up两台机器都配好之后先ping通确认二层三层都正常再往下走。ping 不通就别急着测 RDMA先把基础网络打通。3.2 MTU 设置9000 不是随便设的RoCE v2 对 MTU 敏感因为大 MTU 能减少报文数量、降低交换机处理压力、提升有效带宽。但 MTU 必须端到端一致中间任何一跳小了都会出问题。普通交换机很多默认只支持 1500设 9000 之前先确认交换机端口 MTU 配置。网卡侧设 MTUsudo ip link set enp3s0f0 mtu 9000设完两端都ping -M do -s 8972 192.168.100.2验证-M do禁止分片-s 8972是 9000 减去 IP 头和 ICMP 头。能通说明路径 MTU 支持 9000不通就退回 1500 或者去查交换机。提示MTU 不一致是 RoCE 性能问题的头号嫌疑。表现是能连上、小包正常、大包卡顿或超时。遇到这种症状第一件事就是两端和交换机逐跳确认 MTU。3.3 RoCE 模式选择v1 还是 v2以及 GID 索引的坑Mellanox 网卡支持通过cma_roce_mode切换 RoCE v1/v2但更现代的方式是直接用 GID 索引来选。ibv_devinfo里会列出多个 GID每个 GID 对应不同的 RoCE 版本和 IP 类型。查看 GID 表show_gids这个脚本装了 OFED 或 mlnx 工具后自带会列出每个 GID 索引对应的 RoCE 版本、IP 地址、VLAN 等信息。RoCE v2 的 GID 通常是 IPv4 或 IPv6 对应的那几个。测试时用-g参数指定 GID 索引比如ib_write_bw -g 3。这里有个非常隐蔽的坑默认 GID 索引可能指向 RoCE v1。如果你不指定-g工具可能用默认索引结果跑的是 v1在跨网段场景下直接不通或者在同网段能通但你以为在测 v2。所以每次测试都显式指定 GID 索引并且用show_gids确认那个索引确实是 v2。4. 交换机侧普通交换机要关注哪几个点普通以太网交换机跑 RoCE v2不需要它认识 RDMA但有几个点必须确认否则前面网卡配得再好也白搭。4.1 流控与 PFC普通交换机能不能开大部分企业级交换机都支持 802.3x 流控pause frame部分支持 PFC优先级流控。普通交换机如果只支持 802.3x那只能做整口流控粒度粗容易造成 Head-of-Line 阻塞效果不如 PFC。但即便如此开 802.3x 也比完全不开强至少能减少丢包。如果交换机支持 PFC配置思路是给 RDMA 流量打一个独立的 DSCP/优先级在这个优先级上开 PFC其他优先级不开。这样 RDMA 流量拥塞时触发 pause普通流量不受影响。具体命令各家交换机不同核心是三步定义 traffic class、映射 DSCP 到 class、在 class 上开 PFC。4.2 端口 MTU 与缓冲区交换机端口 MTU 要和网卡一致前面说了。另外关注交换机的缓冲区buffer配置RoCE 大流量突发时对缓冲区压力大缓冲区小的交换机容易出现瞬时丢包。普通接入交换机缓冲区通常不大这也是为什么普通环境跑不满带宽的原因之一。4.3 一个容易被忽略的点ARP 与邻居表RoCE v2 走 UDP/IP依赖 ARP 解析。测试前确认两端 ARP 表里有对方条目ip neigh show看一眼。如果 ARP 没解析RDMA 连接建立会失败报错信息往往指向 GID 或连接问题容易误导排查方向。手动ping一次触发 ARP 解析再测 RDMA能排除这类干扰。5. 用工具验证怎么确认它真的在跑 RDMA配完之后最关键的一步是验证。很多人跑了个ib_write_bw看到数字就以为成了其实可能跑的根本不是 RDMA 路径或者跑的是 v1。这一节讲怎么用工具把这件事确认死。5.1 基础工具链的安装与设备识别先装perftest和ibverbs-utilssudo apt install perftest ibverbs-utils然后确认设备ibv_devices ibv_devinfoibv_devices列出所有 RDMA 设备ibv_devinfo看详细状态重点看state是不是PORT_ACTIVElink_layer是不是EthernetRoCE 就是 EthernetInfiniBand 才是 InfiniBand。如果state是PORT_DOWN回去查网卡链路和 IP 配置。5.2 用 ib_write_bw 做带宽基线测试服务端先起ib_write_bw -d mlx5_0 -g 3 -F --report_gbits客户端连ib_write_bw -d mlx5_0 -g 3 -F --report_gbits 192.168.100.1参数解释-d指定设备-g指定 GID 索引前面强调过必须显式指定-F允许大消息--report_gbits用 Gbps 显示带宽更直观。跑出来的数字对照网卡理论带宽25G 网卡跑到 20Gbps 以上算正常100G 网卡在普通交换机上可能只能跑到 60-70Gbps这就是无损网络缺失的代价。5.3 延迟测试与结果解读延迟用ib_write_lat# 服务端 ib_write_lat -d mlx5_0 -g 3 -F # 客户端 ib_write_lat -d mlx5_0 -g 3 -F 192.168.100.1看输出里的t_avg单位微秒。同机房两台机器直连或者过一台交换机正常应该在个位数微秒。如果看到几十甚至上百微秒先查是不是走了 v1 或者路径上有问题。5.4 怎么确认没退化回 TCP这是最容易被忽略的验证点。ib_write_bw跑通不代表走的是 RDMA有可能工具 fallback 到了 TCP。确认方法跑测试的同时在另一端tcpdump抓 4791 端口sudo tcpdump -i enp3s0f0 udp port 4791 -c 10如果抓到 UDP 4791 的包说明确实是 RoCE v2 在跑。抓不到但测试有数字那就要怀疑是不是走了别的路径。这个验证动作花不了两分钟但能避免你拿着一个假结果去汇报。6. 常见故障的排查链路这一节把我在实际环境里遇到过的几类典型问题按排查顺序列出来遇到问题可以照着走。6.1 连接建立失败从 GID 到 ARP 逐层查ib_write_bw客户端报连接超时或者Couldnt connect to 192.168.100.1:18515排查顺序是先ping确认 IP 通再show_gids确认两端 GID 索引对应的 IP 正确再ip neigh show确认 ARP 解析最后确认两端ib_write_bw的-g参数一致。这四步能覆盖 90% 的连接失败。6.2 带宽远低于预期MTU、PFC、PCIe 三个方向带宽上不去先查 MTU 是否端到端 9000再查交换机是否开了流控最后查网卡插的 PCIe 槽位带宽。用lspci -vv -s 0000:xx:00.0 | grep LnkSta看链路速率和宽度如果显示Width x4而不是x16那带宽瓶颈在 PCIe 上跟网络无关。这个坑很隐蔽因为网卡本身没问题是插槽的问题。6.3 大消息测试崩溃内存注册与 ulimit跑大消息时进程崩溃或者报Failed to register memory回去查ulimit -l是不是 unlimited大页配了没有。另外确认测试用的消息大小没有超过网卡和驱动支持的上限ib_write_bw默认最大消息是 8M 左右超过要加参数。6.4 一个反直觉的现象单口正常双口异常双口网卡做 RoCE 测试时如果两个口配在同一子网可能出现路由选择混乱表现为时通时不通。解决办法是给两个口配不同子网或者测试时明确绑定接口。这个现象我第一次遇到时排查了很久因为单口测一切正常双口就出问题最后发现是路由表里两条等价路由在打架。7. 从功能验证走向生产要补的课在普通以太网上把 RoCE v2 功能跑通只是第一步真要上生产还有几件事要做。7.1 PFC 与 QoS 的完整规划生产环境要规划独立的 RDMA VLAN 或者优先级配置 PFC 死锁检测设置合理的 pause 帧阈值。这部分各家交换机差异大核心原则是 RDMA 流量和普通流量隔离避免互相影响。7.2 监控与告警RoCE 的丢包、PFC pause 计数、重传计数都要纳入监控。Mellanox 网卡可以用ethtool -S看硬件计数器重点关注rx_pause、tx_pause、out_of_sequence这些指标。这些数字异常往往先于业务感知到问题。7.3 应用侧的适配不是所有应用都能直接吃 RDMA 红利需要应用支持 RDMA 接口比如通过libibverbs或者rdma_cm。存储场景常见的是 NVMe-oF over RDMA分布式训练常见的是 NCCL 走 RDMA。应用不改网络配得再好也用不上。我个人在实际操作中的体会是RoCE v2 在普通以太网上的门槛比想象中低功能验证一两天就能跑通但性能调优和稳定性保障是个长期活。先把ib_write_bw和tcpdump这两个工具用熟能解决大部分到底通没通、跑没跑对的疑问。另外每次改完配置别急着跑大流量先用小消息 pingpong 确认连接再逐步加大这样出问题容易定位。最后提醒一句固件和驱动的版本组合一定要记下来换机器或者重装系统时照着来能省掉大量重复踩坑的时间。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。