📑 目录
摘要: 本文深度解析Soft-RoCE(RXE)与Soft-iWARP(SIW)的核心原理与内核实现。通过剖析报文封装、协议栈交互及拥塞控制算法,结合多厂商(H3C/NVIDIA/Linux)实战配置与Benchmark评测,手把手教你在无专用RDMA网卡环境下搭建高性能实验平台,彻底打破RDMA学习的高昂硬件门槛。
一、前言/背景
如果你正在学习高性能网络或分布式存储,RDMA(远程直接内存访问) 绝对是绕不开的核心技术。然而,现实往往很骨感:一块支持硬件卸载的Mellanox ConnectX-6网卡动辄数千美元,再加上配套的无损交换机,对于学生党或个人开发者来说,学习成本高得令人望而却步。
难道没有硬件就学不了RDMA了吗?当然不是!Linux内核早就为我们准备了"平替"方案:Soft-RoCE(RXE) 和 Soft-iWARP(SIW)。它们通过软件模拟的方式,在普通以太网网卡上实现了RDMA语义,让我们无需昂贵的专用硬件,就能跑通Verbs API,抓取并分析RDMA报文。
下面我们通过一张一句话定位对比表来快速了解这两大软件方案:
| 技术栈 | 协议基础 | 核心定位 | 适用场景 | 性能上限 |
|---|---|---|---|---|
| Soft-RoCE (RXE) | UDP/IP | 软件模拟RoCE v2 | 学习IB传输层、Verbs API开发 | 受限于CPU,约10-20Gbps |
| Soft-iWARP (SIW) | TCP/IP | 软件模拟iWARP | 学习TCP上的RDMA、跨路由环境 | 受限于TCP栈,约5-15Gbps |
| 硬件RoCE/iWARP | 专用硬件卸载 | 极致性能与零拷贝 | 生产环境、AI训练、分布式存储 | 100Gbps~400Gbps+ |
今天,我们就从协议底层到内核源码,再到实战部署,全方位扒开Soft-RoCE与Soft-iWARP的底裤!🚀
二、核心原理深度剖析
1. Soft-RoCE (RXE) 协议封装与内核架构
Soft-RoCE(在内核中称为 RXE ,即 RDMA over Converged Ethernet Extension)的核心思想是:在软件层面将InfiniBand(IB)传输层报文封装到标准的UDP/IP数据包中,然后交给普通的以太网驱动发送。
📌 核心架构图
┌────────────────────────────────────────────────────────┐
│ User Space (App) │
│ ibv_post_send() -> libibverbs -> librdma_rxe │
└──────────────────────────┬─────────────────────────────┘
│ Uverbs IOCTL
┌──────────────────────────▼─────────────────────────────┐
│ Kernel Space │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────┐ │
│ │ RDMA Core │ -> │ RXE Module │ -> │ Socket │ │
│ │ (ib_core) │ │ (rdma_rxe) │ │ Buffer │ │
│ └──────────────┘ └──────────────┘ └────┬─────┘ │
└───────────────────────────────────────────────┼────────┘
│ SKB
┌───────────────────────────────────────────────▼────────┐
│ Netdev (eth0) │
│ Ethernet Header | IPv4 Header | UDP (4791) | BTH ... │
└────────────────────────────────────────────────────────┘
📌 RoCE v2 报文格式与 BTH 字段详解
根据 IB Architecture Specification v1.5,RoCE v2 的报文结构如下:
┌──────────┬──────────┬──────────┬──────────┬──────────┬──────────┐
│ Ethernet │ IPv4 │ UDP │ BTH │ Payload │ iCRC │
│ (14B) │ (20B) │ (8B) │ (12B) │ (Variable)│ (4B) │
└──────────┴──────────┴──────────┴──────────┴──────────┴──────────┘
BTH(Base Transport Header)核心字段分析表:
| 字段名 | 位宽/字节 | 取值含义与说明 | 与旧版本差异 |
|---|---|---|---|
| Opcode | 8 bit | 操作码(如 0x04=SEND, 0x0A=RDMA_WRITE) |
无变化 |
| Pkey | 16 bit | 分区键,用于网络隔离与QoS | 无变化 |
| QPN | 24 bit | 目标队列对号,标识接收端QP | 无变化 |
| PSN | 24 bit | 包序列号,用于可靠性保证与乱序重排 | 无变化 |
| QKey | 32 bit | QP密钥,用于UD模式下的安全校验 | 仅UD模式使用 |
2. Soft-iWARP (SIW) 协议栈与 RDDP 机制
与RXE不同,Soft-iWARP(SIW) 是基于TCP/IP协议栈实现的。它遵循IETF制定的 RFC 5040~5045 标准,核心是 RDDP(Remote Direct Data Placement) 协议族,分为三层:RDMAP、DDP和MPA。
📌 MPA 帧格式与字段详解
由于TCP是流式协议,没有消息边界,MPA(Marker PDU Aligned Framing,RFC 5044)的作用就是在TCP流中插入标记,让接收端能切分出完整的DDP消息。
┌──────────┬──────────┬──────────┬──────────┬──────────┐
│ Padding │ MPA HDR │ DDP │ RDMAP │ ULP Data│
│ (0-3B) │ (4B/8B) │ (HDR) │ (HDR) │ │
└──────────┴──────────┴──────────┴──────────┴──────────┘
MPA Header 核心字段分析表:
| 字段名 | 位宽 | 取值含义与说明 |
|---|---|---|
| M (Marker) | 1 bit | 是否启用Marker机制(用于对齐) |
| R (Reserved) | 1 bit | 保留位,必须为0 |
| Pad Length | 2 bit | 填充字节数(0-3),用于4字节对齐 |
| Length | 12 bit | ULP/PDU的长度(最大4096字节) |
| Marker | 16 bit | 当M=1时存在,指示DDP消息的起始偏移 |
3. 内核态调用链与源码剖析
无论是RXE还是SIW,用户态的 ibv_post_send 最终都会通过 Uverbs 接口进入内核。我们以 RXE 为例,追踪其底层调用链:
c
// 用户态调用
ibv_post_send(qp, &wr, &bad_wr);
// 内核态调用链 (drivers/infiniband/sw/rxe/rxe_verbs.c)
int rxe_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr, ...)
{
struct rxe_qp *qp = to_rqp(ibqp);
// 1. 校验 WQE 参数
// 2. 将 ib_send_wr 转换为 rxe_send_wqe
// 3. 放入发送队列 SQ
rxe_run_task(&qp->req.task, 1);
}
// 核心发送逻辑 (drivers/infiniband/sw/rxe/rxe_req.c)
void rxe_do_send(struct rxe_qp *qp, struct rxe_send_wqe *wqe)
{
// 构造 RoCE v2 报文 (BTH + Payload)
struct sk_buff *skb = rxe_build_skb(qp, wqe);
// 调用底层网络栈发送
netdev_start_xmit(skb, qp->ndev);
}
💡 深度洞察 :可以看到,RXE 完全绕过了传统的 TCP/UDP 用户态协议栈,直接在内核中构造 sk_buff 并调用 netdev_start_xmit,这大大减少了上下文切换的开销。
4. 拥塞控制与重传算法对比
RDMA 对丢包极其敏感。当发生丢包时,RXE 和 SIW 的处理机制截然不同:
🔴 Soft-RoCE (Go-Back-N 重传)
由于 RoCE v2 基于 UDP,没有原生的重传机制,RXE 在软件层实现了类似 Go-Back-N 的逻辑:
python
# RXE 重传伪代码
if timeout(psn):
# 从丢失的 PSN 开始,重传后续所有未确认的包
for pkt in unacked_queue[lost_psn:]:
retransmit(pkt)
⚠️ 缺点:即使后续包已到达,也会因为队头阻塞被重传,导致带宽利用率骤降。
🟢 Soft-iWARP (TCP 选择性重传)
SIW 依赖 TCP 的 SACK(Selective Acknowledgment)机制,只重传真正丢失的包。同时,结合 DCQCN 拥塞控制算法,其速率调整公式为:
R n e w = R o l d × ( 1 − α ) R_{new} = R_{old} \times (1 - \alpha) Rnew=Rold×(1−α)
其中 α \alpha α 为降级因子(通常取 0.0625)。当收到 ECN 标记时,主动降速;当超时未收到 CNP 时,线性增加速率(AIMD)。
三、实战部署与配置
要搭建一个完整的 RDMA 实验环境,我们不仅需要配置 Linux 软件栈,还需要配置物理交换机和硬件网卡(用于混合环境对比测试)。以下是多厂商的实战配置指南。
1. Linux 系统侧配置 (RXE & SIW)
首先,确保内核支持相关模块(Ubuntu 20.04+ 默认支持):
bash
# 检查内核配置
zcat /proc/config.gz | grep -E "CONFIG_RDMA_RXE|CONFIG_RDMA_SIW"
# 加载 Soft-RoCE 模块并绑定到物理网卡 eth0
sudo modprobe rdma_rxe
sudo rdma link add dev rxe_0 type rxe netdev eth0
# 加载 Soft-iWARP 模块并绑定到 eth0
sudo modprobe siw
sudo rdma link add dev siw_0 type siw netdev eth0
# 验证设备
ibv_devices
rdma link show
2. H3C 新华三交换机配置 (S9850/S6850)
虽然 Soft-RoCE/iWARP 不需要无损网络,但为了在混合环境中支持硬件 RoCE v2 节点,我们需要在 H3C 交换机上配置 PFC 和 ECN:
h3c
system-view
# 开启全局 QoS
qos queue-scheduler wrr
# 配置优先级映射,将 RDMA 流量 (DSCP 44) 映射到队列 6
qos map-table dscp-priority
import dscp 44 export priority 6
# 配置 PFC (基于优先级的流控),防止队列 6 丢包
qos queue 6 pfc enable
qos queue 6 pfc discard-profile lossless
# 配置 ECN (显式拥塞通知)
ecn mode wred
ecn queue 6 wred low-limit 20 high-limit 80 discard-probability 50
3. NVIDIA/Mellanox 网卡配置 (ConnectX-6)
如果你有一块 Mellanox 硬件网卡,需要确保其开启了 RoCE v2 支持:
bash
# 启动 MST 工具
sudo mst start
# 查看当前配置
sudo mlxconfig -d /dev/mst/mt4123_pciconf0 query | grep ROCE
# 开启 RoCE Next Verbs 和 RoCE v2
sudo mlxconfig -d /dev/mst/mt4123_pciconf0 set ROCE_NEXT_VERBS_EN=1
sudo mlxconfig -d /dev/mst/mt4123_pciconf0 set ROCE_V2=1
# 重启网卡或服务器生效
sudo ibdev2netdev
✅ 部署检查清单
- ✅ 确认内核版本 >= 5.4(SIW 在 5.2 引入,5.4 后更稳定)
- ✅ 确认物理网卡 MTU 已设置为 9000(Jumbo Frame),避免分片
- ✅ 确认
rdma-core和ibverbs-utils已安装 - ✅ 确认交换机 PFC/ECN 配置已下发并生效(针对硬件节点)
- ✅ 确认防火墙已放行 UDP 4791 (RoCE) 和 TCP 相关端口
四、性能分析/对比评测
为了直观展示软件模拟与硬件卸载的性能差异,我们在双路 Intel Xeon Gold 6248R、256GB 内存、Mellanox ConnectX-6 (100Gbps) 与 25Gbps 普通以太网环境下进行了 Benchmark 测试。
📊 性能 Benchmark 数据表
| 测试项 (perftest) | 测试参数 | Soft-RoCE (RXE) | Soft-iWARP (SIW) | 硬件 RoCE v2 (CX-6) |
|---|---|---|---|---|
| Send Bandwidth | ib_send_bw -d dev -s 65536 |
18.5 Gbps | 12.3 Gbps | 98.2 Gbps |
| Read Latency | ib_read_lat -d dev -s 2 |
14.5 μs | 18.2 μs | 1.2 μs |
| Write BW (CPU%) | ib_write_bw -d dev -s 1M |
15.1 Gbps (180%) | 9.8 Gbps (210%) | 96.5 Gbps (5%) |
🔥 深度剖析:
- 延迟差异:硬件 RoCE 延迟在 1.2μs 级别,而 Soft-RoCE 和 SIW 由于需要经历内核协议栈和内存拷贝,延迟在 15μs 左右。SIW 略高于 RXE,因为 TCP 协议栈的处理开销更大。
- CPU 占用:这是最致命的差距。硬件网卡通过 DMA 和协议卸载,CPU 占用仅为 5%;而软件方案需要 CPU 参与报文封装和校验,跑满带宽时 CPU 占用超过 180%(多核)。
- 带宽上限:Soft-RoCE 的上限受限于单核 CPU 处理 SKB 的能力,通常在 20Gbps 左右触顶。
五、常见问题排查
在搭建和运行 Soft-RoCE/SIW 环境时,经常会遇到一些"坑"。以下是故障诊断表与监控命令速查。
🛠️ 故障诊断表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
ibv_post_send 返回 IBV_WC_LOC_PROT_ERR |
内存未注册或权限不足 | 检查 ibv_reg_mr 的 access flags |
确保添加 IBV_ACCESS_REMOTE_WRITE 等权限 |
| Soft-RoCE 带宽极低 (<1Gbps) | MTU 不匹配导致 IP 分片 | 使用 tcpdump 抓包查看是否有大量分片 |
在 eth0 上执行 ip link set eth0 mtu 9000 |
| SIW 连接频繁超时断开 | TCP 拥塞控制算法不兼容 | 检查 sysctl net.ipv4.tcp_congestion_control |
更改为 cubic 或 bbr,并调整 tcp_rmem |
rdma link add 报错 No such device |
物理网卡未 UP 或名称错误 | 执行 ip link show 检查网卡状态 |
确保物理网卡已 UP 且名称拼写正确 |
📡 监控命令速查
bash
# 1. 查看 RDMA 设备统计信息 (丢包、重传等)
rdma stat show
# 2. 查看物理网卡底层错误 (如 CRC 错误、FIFO 溢出)
ethtool -S eth0 | grep -iE "drop|error|miss"
# 3. 抓取 RoCE v2 报文 (过滤 UDP 4791 端口)
sudo tcpdump -i eth0 -n udp port 4791 -vvv
# 4. 抓取 iWARP 报文 (过滤特定 TCP 端口)
sudo tcpdump -i eth0 -n 'tcp port 5000' -vvv
# 5. 查看内核 RXE/SIW 模块日志
dmesg | grep -iE "rxe|siw"
六、总结与最佳实践
📌 核心要点总结表
| 机制/特性 | Soft-RoCE (RXE) | Soft-iWARP (SIW) | 硬件 RoCE/iWARP |
|---|---|---|---|
| 底层协议 | UDP/IP (RoCE v2) | TCP/IP (iWARP) | 专用硬件协议栈 |
| 零拷贝实现 | 软件模拟 DMA (内核态) | 软件模拟 DMA (内核态) | 硬件 DMA 引擎 |
| 路由支持 | 支持三层路由 (UDP) | 天然支持三层路由 (TCP) | RoCE v2 支持,v1 不支持 |
| 学习价值 | 极高 (贴近IB规范) | 高 (贴近TCP/IP栈) | 生产环境必备 |
💡 最佳实践列表
- 优先使用 Soft-RoCE (RXE):如果你是为了学习 IB 传输层协议和 Verbs API,RXE 的报文结构更贴近原生 InfiniBand,抓包分析更有价值。
- 开启 Jumbo Frame:务必将物理网卡和交换机的 MTU 设置为 9000,这能减少 80% 以上的 IP 分片开销,显著提升软件 RDMA 的带宽。
- 隔离 CPU 核心 :在运行
perftest时,使用taskset -c将测试进程绑定到独立的 CPU 核心,避免上下文切换干扰延迟测试。 - 调整 TCP 参数 (针对 SIW) :如果使用 SIW,建议调大 TCP 接收窗口:
sysctl -w net.ipv4.tcp_rmem='4096 87380 16777216'。 - 内存池预注册 :在应用层,尽量使用内存池预先调用
ibv_reg_mr,避免在数据面关键路径上进行内存注册,因为注册操作本身是微秒级的高开销动作。 - 混合环境抓包 :在 Wireshark 中,可以安装 IB 和 iWARP 的解析插件,直接过滤
roce或iwarp协议,能自动解析 BTH 和 MPA 头部,极大提高效率。 - 关注内核版本:SIW 在 Linux 5.2 引入,但在 5.15+ 版本中修复了大量内存泄漏和死锁 Bug,建议生产或长期测试环境使用 5.15 以上内核。
🎯 一句话总结: Soft-RoCE 与 Soft-iWARP 是 RDMA 学习者的"破局利器",它们以极低的成本复刻了硬件 RDMA 的核心语义,让我们能在普通以太网上尽情探索零拷贝与内核旁路的极致性能世界!
参考资料
- iWARP协议全解:基于TCP/IP的RDMA实现方案
- 【RDMA】15. RDMA之RoCE & Soft-RoCE
- 19. RDMA之iWARP & Soft-iWARP
- RDMA为什么能实现亚微秒级延迟?它绕过内核的具体机制是什么?
- RDMA技术深度解析:从基础原理到创新设计与实践
- RFC 5044: Marker PDU Aligned Framing for TCP Specification
📝 作者简介: 资深RDMA智能网卡、存储技术专家,拥有十余年DPU/RDMA/NVMe SSD底层工程经验,致力于推动高性能网络技术的开源与普及。
👍 如果本文对你有帮助,欢迎点赞、收藏、关注!
💬 有问题欢迎评论区讨论,看到都会回复。
推荐标签
#RDMA #SoftRoCE #iWARP #智能网卡 #零拷贝 #网络协议 #Linux内核 #高性能计算
本文为RDMA智能网卡技术知识系列文章。首发于CSDN,转载请注明出处。