ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零搭建Soft-RoCE环境:用软件模拟RDMA网卡,攻克RoCE学习门槛

从零搭建Soft-RoCE环境:用软件模拟RDMA网卡,攻克RoCE学习门槛 做网络的人尤其是搞存储和HPC的应该都听过RoCE的大名。RDMA技术能把数据从网卡直接拷进应用内存省掉内核协议栈的开销延迟能压到微秒级。但话又说回来RoCE的“学习门槛”其实不在协议本身而在硬件——要真机实验你得有支持RDMA的网卡还得配套交换机做无损网络这套设备下来没几万块搞不定。很多朋友就是卡在第一步命令都没见过环境先把我劝退了。Soft-RoCE就是用来解决这个问题的。它在内核层面用软件模拟了RDMA网卡让你在普通机器、普通网卡上就能跑完整的RDMA命令。我最早接触Soft-RoCE是因为要给一个存储项目做性能预研但机房只有千兆网卡没办法只能用软件方案先把手上的代码逻辑理一遍。用下来的感受是真实RoCE的很多坑它不一定踩得到但RDMA的基本操作、编程接口、排查思路它全都能练。这篇文章就把我从零搭建Soft-RoCE环境的完整过程写出来包括原理、步骤、还有我踩过的那些坑希望能帮你省点试错时间。1. RDMA与Soft-RoCE的核心原理拆解1.1 为什么需要软件模拟环境RoCE全称是RDMA over Converged Ethernet它分两个版本。RoCEv1跑在以太网的二层走的是以太网类型号0x8915要求收发两端在同一个二层网络里不能跨VLAN和子网。RoCEv2把UDP头加进来了用UDP端口4791目的IP和目的端口都正常走三层路由这样就能跨子网通信但随之而来的是对网络丢包的容忍度更低需要DCQCN或者ETS这类拥塞控制机制来配合。无论哪个版本底层都依赖网卡硬件来执行DMA操作、解析报文、管理QP状态机。Soft-RoCE也叫SoftRoCE、RXE是Linux内核里的一个软件驱动它在驱动层实现了RoCE的软件模拟。大概思路是内核把RDMA操作转化为普通的内核网络包收发再通过以太网驱动把数据发出去。对应用层来说它看到的就是一个完整的RoCE网卡支持ibv_query_device、ibv_create_qp等verbs接口也支持ibv_devinfo、rxe_cfg这些管理工具。只是这些操作最终不是由专用硬件完成而是由CPU来模拟。这层模拟的意义在于它把RDMA的“软件栈”和“硬件依赖”解耦了。你在用Soft-RoCE的时候操作的是完整的verbs API调用的是真实的libibverbs库体验和真机几乎一致。区别在于性能Soft-RoCE的带宽受限于CPU和普通网卡的能力延迟也远高于真实RoCE。但对于学习RDMA编程、调通RDMA CM连接、验证业务逻辑这些场景它完全能胜任。1.2 Soft-RoCE在内核中的工作机制理解Soft-RoCE的工作机制其实对排查问题特别有帮助。我拆成几个层面来讲。驱动层驱动代码在drivers/infiniband/hw/rxe/下注册成一个IB设备。这个设备本身不依赖任何专用硬件它绑定一个现有的以太网设备比如eth0或者ens3。绑定后内核里就能看到rxe0这样的设备名。数据路径发送数据时应用调用ibv_post_send把WQEWork Queue Element投递到SQSend Queue。Soft-RoCE驱动从SQ里取出WQE把里面的数据封装成RoCE报文再通过绑定的以太网设备发送出去。接收方向相反以太网设备接收到RoCE报文驱动解析后创建对应的接收WQE通过CQCompletion Queue通知应用。状态管理每个QP都有状态机从RESET到INIT、RTR、RTS最后到SQD、SQE、ERROR。Soft-RoCE驱动完整实现了这整套状态转换逻辑所以你在真机上遇到的QP状态异常问题在Soft-RoCE里也能复现。这个机制带来的一个实际好处是你可以在同一台机器上用两个rxe设备做本机通信测试。比如eth0绑成rxe0eth1绑成rxe1rxe0和rxe1之间就能跑RDMA的read、write、send操作不需要第二台机器。这对学习RDMA编程特别友好写完代码本机就能自测。2. 环境准备这步决定你后面顺不顺2.1 硬件与内核版本要求Soft-RoCE对硬件的要求其实很低但有一些硬性门槛需要注意。内存至少2GB磁盘20GB以上这些基本都能满足。CPU没有特殊要求但如果是虚拟机里跑建议至少2核因为数据路径全走CPU核太少跑iperf会明显吃力。网卡方面普通千兆网卡就行不要求支持RDMA。我自己就在一台KVM虚拟机里跑通过KVM的虚拟网卡virtio也能正常绑定rxe设备。内核版本是个关键点。Soft-RoCE在4.14内核之前问题比较多4.14之后才逐渐稳定。如果是老内核推荐至少升到4.14最好能用4.19或5.x系列。内核里需要支持INFINIBAND、INFINIBAND_SOFT_ROCE驱动还要有RDMA_RXE相关的模块。检查方法很简单确认内核版本后再看模块和配置。很多发行版默认没有把Soft-RoCE编进内核需要单独装驱动包。Ubuntu从18.04开始linux-modules-extra包里有rxe相关模块CentOS需要在7.7以上版本才比较完善。2.2 必须装好的用户态工具链光有内核模块还不够还需要rdma-core工具集。它提供的是用户态库和管理命令包括但不限于以下内容ibv_devinfo查看RDMA设备信息rdma link管理rdma设备、查看状态rxe_cfgSoft-RoCE专用配置工具用于绑定以太网设备和rxe模块perftest里面是ib_write_bw、ib_read_lat这些带宽和延迟测试工具ibpingIB网络连通性测试工具装这些工具的方式不同的系统有区别。Ubuntu和Debian两个包就搞定。CentOS和RHEL需要epel仓库。装完之后可以用ibv_devinfo验证用户态是否正常连接内核模块跑一次就能看到rxe设备信息。还有一个容易漏的组件是uverbs模块。用户态程序通过/dev/infiniband/uverbs设备访问内核驱动这个设备文件是udev自动创建的。如果发现装完rdma-core后没有这个设备文件大概率是内核模块没加载成功。3. Soft-RoCE环境搭建实操从零到能跑通ib_write_bw3.1 完整搭建步骤与命令记录下面把我实际操作中验证过的步骤完整列出来。用Ubuntu系统演示CentOS的差异点会在关键处补充说明。第一步确认内核支持先看内核版本uname -r我的测试机器是5.4.0没问题。如果版本太低建议先升级内核再继续。然后检查相关模块是否存在modprobe rdma_rxe lsmod | grep rxe如果modprobe没有报错说明内核已经把模块编进去了。第二步安装用户态工具Ubuntu系统直接apt update apt install -y rdma-core perftest infiniband-diags装完之后确认命令存在ibv_devinfo -v rxe_cfg -hCentOS/RHEL系列需要先加epel仓库yum install -y epel-release yum install -y rdma-core perftest infiniband-diags第三步加载内核模块并绑定设备用modprobe加载模块后要为Soft-RoCE绑定一个物理网卡。有两种方式我推荐用现代的方式直接用rdma link命令创建rxe设备。# 查看当前rdma设备 rdma link show # 绑定ens3到rxe模块 rdma link add rxe0 type rxe netdev ens3 # 确认rxe0创建成功 rdma link show如果这一步报错“Could not create device”先查dmesgdmesg | tail -50常见原因是sysfs权限问题或者rxe模块没有正确注册。老版本的工具还需要用rxe_cfg新版本已经统一到rdma命令下了这点注意区分。第四步配置IP地址RoCEv2是需要IP层通信的每个rxe设备需要分配IP地址。这里的IP地址应该配置在物理网卡上rxe设备会自动复用。比如物理网卡ens3配置了192.168.1.10那么rxe0的IP也是192.168.1.10。单机双设备自测的时候需要给两对网卡配好不同网段的IP。比如ens3配192.168.1.10ens4配192.168.2.10它们分别绑rxe0和rxe1。第五步验证设备状态ibv_devinfo -d rxe0正常输出会显示设备支持的各种能力包括端口状态PORT_ACTIVE、最大QP数、最大MR大小等。再跑一次连通性测试# 机器1上执行 ibping -S -o 192.168.1.10 # 机器2上执行 ibping -c 1000 -C 1 -S 192.168.1.10输出会显示往返延迟和丢包情况。第六步跑一次带宽测试用perftest工具组的ib_write_bw验证实际带宽# 服务端 ib_write_bw -d rxe0 -s 65536 # 客户端 ib_write_bw -d rxe0 -s 65536 192.168.1.11如果看到正常的吞吐数据说明环境已经全部打通。3.2 本机双rxe设备自测方案没有第二台机器的话可以在一台机器上配两个rxe设备让它们互相通信。先把两个物理网卡belonging到不同网段然后分别创建rxe设备rdma link add rxe0 type rxe netdev ens3 rdma link add rxe1 type rxe netdev ens4物理接口配置ip addr add 192.168.1.10/24 dev ens3 ip addr add 192.168.2.10/24 dev ens4 ip link set ens3 up ip link set ens4 up然后跑ib_write_bw的时候服务端监听在rxe0上客户端用rxe1去连接192.168.2.10# 终端1服务端 ib_write_bw -d rxe0 -s 65536 # 终端2客户端 ib_write_bw -d rxe1 -s 65536 192.168.2.10这种自测方式特别适合调试RDMA代码改完逻辑不用两台机器同步完全本地就能验证。3.3 内核参数和配置文件优化网卡中断和内存锁限制会影响Soft-RoCE的性能和稳定性。建议把这两个内核参数调一下。提升内存锁上限RDMA操作需要锁定内存区域默认限制太低会导致注册MR失败。在/etc/security/limits.conf里加上* soft memlock unlimited * hard memlock unlimited改完重新登录才会生效。关闭网卡offload部分网卡的特性比如LRO、GRO会干扰RoCE报文解析建议关闭。用ethtool操作ethtool -K ens3 gro off gso off tso off如果网卡支持还可以关lroethtool -K ens3 lro off调整系统XDPMCpuSoft-RoCE的数据路径走的是内核软中断网卡的RX队列中断尽量绑定到不同CPU上避免单核跑满限制性能。网卡多队列结合RPS配置在判断性能瓶颈时可以重点关注。这些配置本身是通用的调优手段Soft-RoCE环境下能改善CPU开销真实RoCE网卡下同样适用。4. 实操过程全记录一次完整的Soft-RoCE连通测试4.1 从零开始完整跑通一次RDMA通信我用两台Ubuntu 20.04虚拟机做演示物理网卡分别是ens3IP配置如下节点A192.168.1.10/24节点B192.168.1.11/24两台机器都没有RDMA硬件只有virtio虚拟网卡。整个搭建过程耗时约15分钟。加载模块并创建rxe设备modprobe rdma_rxe rdma link add rxe0 type rxe netdev ens3用ibv_devinfo确认设备状态。节点A的输出中端口状态是PORT_ACTIVE这就对了。如果状态是PORT_DOWN说明物理网卡链路有问题或者IP没配好。然后测试连通性。节点B先启动ibping服务端ibping -S -o 192.168.1.11节点A发起pingibping -c 100 -C 1 -S 192.168.1.11100个包全通平均延迟在0.2ms左右。这个延迟数值看看就好别当真实RoCE延迟参考Soft-RoCE的延迟参数没有生产参考价值只能验证连通性。接着跑带宽。节点Bib_write_bw -d rxe0 -s 65536节点Aib_write_bw -d rxe0 -s 65536 192.168.1.11实测千兆网卡下的带宽在940MB/s左右接近纯软件转发的极限。换小包测试比如-s 64带宽会掉到几十MB/s这是因为小包场景下CPU要处理更多报文Soft-RoCE的CPU开销非常明显。这也印证了一个结论Soft-RoCE看功能、看流程不要看性能数字。4.2 数据路径分析报文是怎么走的跑一次ib_write_bw在节点A上抓包能看到报文的流转过程。tcpdump -i ens3 -nn udp port 4791正常能看到UDP端口4791的双向报文这就是RoCEv2的通信端口。我尝试用tcpdump抓v1的RoCE报文如果报文类型是0x8915需要过滤ether proto 0x8915才能看到。Soft-RoCE默认跑RoCEv2除非特别配置这在抓包验证时要注意。再深一层用rdma res show qp查看QP状态rdma res show qp输出会显示当前活跃的QP的LQPNLocal QP Number、状态、以及对端的IP和QP号。这个命令在排查连接问题时特别好用正常状态应该是RTS。如果在跑测试的同时观察CPU占用top输出中会有大量软中断的CPU占用。这再次证实数据路径走的是内核协议栈所有RDMA操作都由CPU承担。4.3 多节点场景的配置差异两台以上节点之间的搭建方式完全一样每台机器各自绑rxe设备、配IP即可。需要注意的是所有节点要在同一个二层网络内且IP要能互通。如果涉及跨子网需要确保路由可达但RoCEv2支持三层路由只是需要额外排查防火墙是否放行UDP 4791端口。物理机上如果装了firewalld或者ufw记得放行ufw allow 4791/udp # 或者关掉防火墙 systemctl stop firewalld很多网络问题其实不是RDMA配置的问题是防火墙把UDP 4791挡了。排查顺序建议是先ping通IP再测UDP端口最后看RDMA命令的输出。5. 常见问题与排查技巧实录5.1 qp创建失败与GID索引问题这个是我遇到过最高频的问题。RDMA程序在连接对端的时候需要查询本地设备的GIDGlobal Identifier索引代码里经常硬编码用gid_index3但Soft-RoCE设备上的GID索引数量和顺序跟真实网卡不一样。报错信息一般是ibv_create_qp failed或者gid index 3 out of range解决办法是先用ibv_devinfo -v查看设备的GID表ibv_devinfo -d rxe0 -v | grep -A5 GID然后把代码里的gid_index改成实际存在的索引。在Soft-RoCE环境里IPv4对应的GID一般出现在前几个索引里比如0和1。更隐蔽的问题是绑定rxe设备后修改物理网卡的IP地址GID表会刷新。之前能跑的程序可能突然报GID错误这时重新查询GID索引并修改程序即可。5.2 rxe设备状态一直DOWNrdma link show里看到rxe0状态是DOWN但物理网卡明明UP。这个问题的根源通常是IP配置。Soft-RoCE设备的状态跟物理网卡的IP绑定有关。检查ens3是否配置了有效IPip addr show ens3还有一种情况是物理网卡处于DOWN状态ip link set ens3 up如果IP和物理网卡都没问题尝试重新添加rxe设备rdma link del rxe0 rdma link add rxe0 type rxe netdev ens3注意不是所有内核版本都支持del操作不支持就直接重启网络服务再重新添加。5.3 本机自测时连接失败用两个rxe设备本机自测客户端连不上服务端或者连接后被重置。这通常是路由问题。检查本机路由确保发往对端IP的报文走对了网卡。ip route get 192.168.2.10如果路由不对可能是内核的rp_filter反向路径过滤在干扰。关闭它sysctl -w net.ipv4.conf.ens4.rp_filter0 sysctl -w net.ipv4.conf.all.rp_filter0自测场景下直接关闭所有网卡的rp_filter是省事做法。生产环境不建议这么干但在练习环境里完全没问题。5.4 内存注册失败的排查跑perftest报MR注册失败ibv_reg_mr failed: Operation not permitted注意这个“Operation not permitted”不是权限问题是内存锁限制到了。检查limits.conf的配置确认ulimit -l输出ulimit -l输出应该是unlimited如果不是就是你刚才改的limits.conf没生效重新登录shell再试。如果是systemd服务里面跑RDMA程序光改limits.conf不够还要在服务的unit文件里加LimitMEMLOCKinfinity。这个细节容易漏用systemd管理守护进程时报错先想到这个。5.5 性能异常低的排查思路Soft-RoCE性能低是正常的但低到离谱比如几十MB/s就得排查了。先确认网卡协商速率是不是正常千兆关掉LRO/GRO后重新测试检查CPU有没有被IRQ打满用mpstat看软中断占比确认测试工具参数是否合理比如-s 65536大数据包不要用默认的小包我之前遇到过一次性能特别差排查半天发现是虚拟机管理程序开启了流量整形限速在100Mbps。这种外部因素在虚拟化环境下特别多排查时把物理网络的因素一起考虑进去。5.6 问题速查表现象可能原因排查步骤rdma link add报错模块未加载或权限不足modprobe rdma_rxe检查dmesg设备状态DOWN物理网卡未UP或未配IPip link set upip addr addibv_devinfo看不到设备rdma-core版本过低升级rdma-core版本QP创建失败GID索引无效查询GID表调整代码连接失败防火墙拦截UDP 4791放行方向或关闭防火墙内存注册失败memlock限制ulimit -l检查改limits.conf自测连接失败rp_filter干扰关闭反向路径过滤性能异常低offload没关或外部限速关闭GRO/LRO检查物理链路6. 进阶技巧与典型应用场景6.1 用Soft-RoCE调试RDMA程序RDMA编程入门最难的就是调试。真实RoCE环境下程序崩溃一次可能就把网卡搞到异常状态影响整个集群。Soft-RoCE在虚拟机里随便折腾crash了重启虚拟机就行。调试的时候有几个技巧用ibv_devinfo看设备能力。很多RDMA程序的报错源于对设备能力假设错误。比如程序假设设备支持原子操作但Soft-RoCE早期版本对原子操作支持不完整。先用ibv_devinfo确认设备能力再写代码。用rdma res show命令查运行时状态。这个命令能看到当前所有QP、MR、CQ的状态。程序异常退出后用这个命令确认资源是否被正确清理。用tcpdump抓包定位问题。从抓包里能清楚看到握手过程走到哪一步失败是连接建立失败还是数据发送失败。tcpdump在Soft-RoCE下的意义比在真实RoCE下大得多因为真实RoCE网卡上抓包经常抓到的是加密或者摘要过的内容。6.2 用Soft-RoCE搭建学习测试平台Soft-RoCE最适合的场景就是做RDMA学习平台。有几点设计建议用虚拟机快照保存干净的基准环境。搭建一次之后实验做完就回滚几秒钟回到初始状态。同一套环境可以跑不同OS版本。宿主机上开多个虚拟机分别用Ubuntu、CentOS、Rocky测试同一段程序对比不同系统间行为的差异。配合容器使用。在容器里跑RDMA程序宿主机绑定rxe设备后容器用host网络模式直接访问。容器拆了重建对环境没有任何影响。我自己为了写RDMA的示例代码搭了3个虚拟机的环境一个是Ubuntu、一个是CentOS、一个是Debian。三个环境代码完全一样行为有差异的地方很快就暴露出来这对理解不同发行版的差异帮助很大。6.3 Soft-RoCE不是万能的性能差异的清醒认知Soft-RoCE可以做很多事但有些事它确实做不了不能用Soft-RoCE测真实业务的性能。它跑出来的延迟和带宽数据没有参考价值CPU开销又高性能指标是纯软件模拟的结果与真实硬件有天壤之别。不能验证无损网络特性。RoCE的核心优势之一是利用无损网络实现Zero-Copy收包Soft-RoCE完全没有PFCPriority Flow Control等无损网络机制这方面的行为差异大。不能模拟网卡硬件卸载能力。比如多流哈希、动态连接追踪等网卡特性Soft-RoCE都没有。你只能在代码逻辑层面理解RDMA硬件相关的优化点无法在这里验证。这些认知很重要。Soft-RoCE解决的是“从无到有”的问题让你先跑起来、先学通API、先理解流程后续在真机上做性能验证和调优才有基础。7. 写在最后的一个实用小建议搭建Soft-RoCE环境这件事说简单也简单几条命令的事说麻烦也麻烦模块加载、GID索引、防火墙策略、内核参数每个环节都可能卡一下。我个人的体会是如果你刚开始学RDMA与其纠结在一台昂贵但没配置好的真机上不如先用Soft-RoCE把代码跑通、把QP状态机玩熟、把ibv_verbs的API都过一遍这个过程里积累的调试经验不会白费换到真实硬件上依然有效。最后分享一个很多人不知道的小技巧rdma link show的输出中rxe设备的link layer显示是Ethernet而真实RoCE网卡显示的是InfiniBand或者Ethernet取决于具体型号。如果你在一个环境里同时有Soft-RoCE和真实网卡用这个字段就能一秒区分当前操作的是模拟设备还是硬件设备排查问题时非常省事。
返回列表