RDMA 写操作带宽性能建模与参数敏感性分析

提到 RDMA 性能测试,大多数人第一反应是:需要 100G 交换机、ConnectX-5 网卡、物理服务器集群,动辄几十万投入。但本文要展示的是:一台普通笔记本电脑、两个 Ubuntu 虚拟机、零硬件成本,同样能完成一套完整的 RDMA 参数调优实验,并且得出与硬件环境截然不同的反直觉结论。

我们在 Soft-RoCE(rxe)虚拟化环境中,系统性地扫描了消息大小、MTU、QP 数、Post List、CQ Moderation、CPU 绑核等六大类参数,发现两个核心反直觉现象:

  • CQ Moderation 开大反而带宽暴跌 64%(硬件环境建议开大以省 CPU)
  • taskset 绑核反而性能下降 44%(硬件环境绑核是标准优化手段)

这些"反常"背后,指向一个关键认知:**Soft-RoCE 的软件栈架构与硬件 RDMA 完全不同,盲目移植硬件调优经验不仅无效,还可能适得其反。**​


1. 实验环境

1.1 硬件与虚拟化平台

项目 配置
宿主机 笔记本电脑(Intel Core i7-10xxx, 16GB RAM)
虚拟化软件 VMware Workstation 17
虚拟机 × 2 Ubuntu 22.04, 内核 5.15.0-xx, 4 vCPU, 8GB 内存
RDMA 实现 Soft-RoCE (rdma_rxe),设备名 rxe_0
网络互联 VMware 虚拟网桥(VMnet),两台 VM 同网段互通
以太网 MTU 9000(Jumbo Frame,两端均已配置)
RDMA MTU active_mtu = 4096
测试工具 perftest 4.5-0.18, rdma-core 39.0

1.2 环境声明

本文实验环境为笔记本电脑虚拟化平台,两台 Ubuntu VM 通过宿主机虚拟网桥互联,RDMA 传输由 Soft-RoCE(rxe)在 CPU 上软件模拟实现。数据路径不经过物理网卡,而是在宿主机内存中通过虚拟交换机完成 VM 间转发,因此绝对带宽数值远低于物理机 + 硬件 RDMA 网卡的表现。本文定位为参数敏感性验证 ,关注不同配置下带宽的相对变化趋势,而非提供线速基准数据。所有带宽数据取 ib_write_bw 输出的 BW average​ 值(总数据量/总耗时),代表稳态吞吐。

1.3 测试命令规范

全文统一使用 ib_write_bw,服务端:

ib_write_bw -d rxe_0 -i 1 -x 2 参数...

客户端:

ib_write_bw -d rxe_0 -i 1 -x 2 参数... <server_ip>

-x 2 指定 GID index(RoCEv2 / IPv4),两端均需配置一致。


2. 基线:消息大小对带宽的影响

2.1 测试方法

固定参数:MTU=4096, QP=1, post_list=1,消息大小从 64B 到 1MB 扫描。

for size in 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576; do

echo "=== size=$size ==="

ib_write_bw -d rxe_0 -s $size -m 4096 -q 1 -l 1 -x 2 --report-gbits <server_ip> 2>&1 | tail -3

done

2.2 实测结果

消息大小 带宽 (Gb/s) 备注
64B 0.021 小消息协议头主导
512B 0.085
4KB 0.66 拐点附近
16KB 2.19
64KB 2.50 本环境带宽峰值区
256KB 2.38
1MB 0.77 大消息开销显现

2.3 分析

在 Soft-RoCE 环境下:

  1. 小消息带宽极低:64B 消息带宽仅 0.021 Gb/s,每次 ibv_post_send 要走完 rxe 内核模块 → UDP 封装 → 虚拟交换机 → 对端解包的全路径,CPU 开销远大于有效载荷。
  2. 4KB 附近出现拐点:与 MTU=4096 的分片边界吻合,超过此值后单消息需拆多个包,封装开销叠加。
  3. 64KB 以上带宽趋于饱和:瓶颈固定在 CPU 处理能力(虚拟交换机转发 + rxe 软栈),增大消息大小不再提升带宽,1MB 时反而因内存拷贝开销下降。

3. 网络层参数:MTU 的影响

3.1 测试设计

固定:QP=1, 消息大小=64KB,扫描 MTU。

for mtu in 512 1024 2048 4096; do

echo "=== mtu=$mtu ==="

ib_write_bw -d rxe_0 -s 65536 -m $mtu -q 1 -x 2 --report-gbits <server_ip> 2>&1 | tail -3

done

3.2 实测结果

MTU 带宽 (Gb/s) 相对 1024 提升
512 0.28 -30%
1024 0.40 基准
2048 0.92 +130%
4096 1.16 +190%

3.3 分析

MTU 从 1024 提到 4096,带宽提升近 3 倍,在 Soft-RoCE 下效果比硬件环境更显著:

  • 协议头开销占比更大:每个包固定封装约 58B+(以太网头 + IP + UDP + RoCE + ICRC),小 MTU 下有效载荷率极低
  • CPU 中断频率降低:大消息拆包数减少,每包触发一次处理,减少 CPU 总工作量

4. 队列层参数:QP 数与 Post List Size

4.1 QP 数扫描

for qp in 1 2 4 8; do

echo "=== qp=$qp ==="

ib_write_bw -d rxe_0 -s 65536 -m 4096 -q $qp -x 2 --report-gbits <server_ip> 2>&1 | tail -3

done

QP 数 聚合带宽 (Gb/s) 备注
1 1.11 基准
2 2.75
4 3.64
8 3.37 锁竞争导致回落

分析:Soft-RoCE 是单线程软实现,多 QP 不能并行利用多网卡队列,反而增加 rxe 内核模块内部锁竞争。QP=4 达到最优,QP=8 开始回落。

4.2 Post List Size(一次投递 WR 数量)

for pl in 1 4 8 16 32; do

echo "=== post_list=$pl ==="

ib_write_bw -d rxe_0 -s 65536 -m 4096 -q 1 -l $pl -x 2 --report-gbits <server_ip> 2>&1 | tail -3

done

Post List (-l) 带宽 (Gb/s) 说明
1 1.12 每次投递 1 个 WR
4 1.50
8 1.53
16 2.45
32 2.46 边际递减

分析 :增大 post_list(-l 参数)减少 ibv_post_send 调用次数,降低用户态/内核态切换频率。在 CPU 瓶颈环境下效果明显,从 1 到 16 提升约 119%。

⚠️ 避坑:perftest 中控制一次投递 WR 数量的是 -l(--post_list),不是 -b。-b 是 bidirectional 双向模式,不带参数。


5. 完成语义层:Inline 与 CQ Moderation

5.1 Inline Data

Inline 对 ib_write_bw 带宽测试影响有限。在 Soft-RoCE 环境下,大消息 inline 无效(超过 max_inline_data 限制),小消息带宽本身极低,inline 带来的微小改善被协议栈开销淹没。

验证(可选)

ib_write_bw -d rxe_0 -s 64 -m 4096 -I 64 -q 1 -x 2 --report-gbits <server_ip>

结论:带宽测试中 inline 不是关键变量,生产环境如需优化延迟再单独测试。

5.2 CQ Moderation:Soft-RoCE 下的反直觉现象

测试命令

for mod in 1 4 8 16 32; do

echo "=== cq_mod=$mod ==="

ib_write_bw -d rxe_0 -s 65536 -m 4096 -q 2 --cq-mod=$mod -x 2 --report-gbits <server_ip> 2>&1 | tail -3

done

实测结果

CQ Mod 带宽 (Gb/s) 相对 cq-mod=1
1 5.11 基准
4 4.96 -3%
8 4.71 -8%
16 1.84 **-64%**​
32 1.17 **-77%**​

反直觉分析

查阅 RDMA 技术文档,硬件环境下的常规建议是:适当增大 CQ Moderation,减少 CQE 数量和 CPU 中断频率,带宽基本不受影响甚至略有提升。但本次实测完全相反。

--cq-mod=N 的含义是:每 N 个 WR 完成才生成一个 CQE。perftest 的发送循环依赖 CQE 来补充新 WQE:

post WQE → 等 CQE → poll 完成 → 补充新 WQE → 继续 post

  • 硬件 RDMA:网卡有独立 DMA 引擎,CQE 只是"通知",不影响发送节奏。cq-mod 大 → CQE 少 → CPU 省 → 带宽持平。
  • Soft-RoCE:发送和完成上报全靠 CPU 内核线程。cq-mod 大 → CQE 稀疏 → 应用迟迟不补 WQE → 管道里在途请求变少 → 带宽暴跌。

cq-mod=16 时,等待期间 vCPU 被调度走或进入空闲,恢复后 QP 已空,需要重新填充,带宽自然崩。

结论:Soft-RoCE 下 cq-mod=1(默认)最有利于维持发送流水线饱满,不宜盲目套用硬件调优经验。


6. 系统层:绑核与 Hugepage

6.1 taskset 绑核:又一个反直觉

测试命令

不绑核(默认)

ib_write_bw -d rxe_0 -s 65536 -m 4096 -q 2 -x 2 --report-gbits <server_ip>

绑核

taskset -c 0,1 ib_write_bw -d rxe_0 -s 65536 -m 4096 -q 2 -x 2 --report-gbits <server_ip>

实测结果

配置 带宽 (Gb/s) 相对变化
不绑核(默认调度) 3.00 基准
taskset -c 0,1 绑核 1.69 **-44%**​

分析

绑核后性能下降 44%,与硬件 RDMA 环境的常见结论相反。

原因:

  1. Soft-RoCE 是多内核线程协作模型:ibv_post_send 触发的内核 rxe 模块、虚拟网卡驱动、软中断处理(ksoftirqd)分散在不同内核线程中。
  2. 绑核造成资源争抢:将用户态测试进程钉在 CPU 0-1 后,内核线程也被调度到同一组核上,用户态与内核态处理互相抢占 CPU 时间片。
  3. OS 调度器的默认策略反而更优:不绑核时,调度器将用户态进程与内核线程分散到不同 vCPU,减少互相阻塞。

启示:硬件 RDMA 绑核有效是因为真正的 I/O 由网卡 DMA 完成,不消耗 CPU;Soft-RoCE 下所有工作都在 CPU 上,绑核反而限制了调度器的灵活性。

6.2 Hugepage

perftest 默认使用 4KB 页。Soft-RoCE 环境下 hugepage 对带宽影响有限(瓶颈在 CPU 软栈而非 TLB),生产环境建议配置:

cat /proc/meminfo | grep Huge

sudo sysctl vm.nr_hugepages=256


7. 综合最优配置 vs 默认配置

7.1 默认配置

ib_write_bw -d rxe_0 -s 65536 -x 2 <server_ip>

结果:带宽 2.54 Gb/s

7.2 调优配置

ib_write_bw -d rxe_0 -s 65536 -q 4 -m 4096 -l 32 -x 2 --cq-mod=4 --report-gbits 192.168.95.128

结果:带宽 4.98 Gb/s

7.3 对比总结

指标 默认配置 调优配置 提升幅度
带宽 2.54 Gb/s 4.98 Gb/s **+96%**​

核心发现:

  1. MTU + Post List + QP 数 是 Soft-RoCE 环境下性价比最高的三个调优手段
  2. CQ Moderation 不宜开大:cq-mod=1 最优,开到 16 带宽暴跌 64%
  3. 绑核有害:不绑核比绑核快 78%
  4. 多 QP 有甜区:QP=4 最优,QP=8 开始回落
  5. 所有优化叠加后带宽接近翻倍(+96%),说明参数组合 > 单参数极致

8. 结论

  1. Soft-RoCE + 虚拟化环境适合做 RDMA 参数学习和带宽趋势验证,不适合做绝对性能评价。
  2. CPU 软栈为瓶颈的环境下,减少 CPU 工作量的参数(MTU↑、post_list↑、QP 适度↑)收益最大。
  3. 硬件 RDMA 的调优经验不能直接移植到 Soft-RoCE:本文两个反直觉现象(CQ Moderation 开大暴跌、绑核反降 44%)共同证明,Soft-RoCE 是一个完全不同的性能模型。
  4. 本文所有测试可在普通笔记本电脑上复现,适合作为高校 RDMA 实训课程的教学案例,尤其适合讲解"环境差异导致优化方向不同"这一核心概念。

附录 A:环境搭建速查

1. 安装依赖

sudo apt install -y rdma-core ibverbs-utils perftest iproute2

2. 加载模块

sudo modprobe rdma_rxe

3. 创建 Soft-RoCE 设备(假设接口为 ens33)

sudo rdma link add rxe_0 type rxe netdev ens33

4. 修改以太网 MTU

sudo ip link set dev ens33 mtu 9000

5. 验证

rdma link

ibv_devinfo -d rxe_0 | grep -i mtu

show_gids

6. 启动测试

服务端:ib_write_bw -d rxe_0 -m 4096 -x 2

客户端:ib_write_bw -d rxe_0 -m 4096 -x 2 <server_ip>

附录 B:常见故障排查

问题 原因 解决
IB device wasn't found 设备名错或 rxe 未创建 rdma link 确认名字,modprobe rdma_rxe
Requested mtu is higher than active mtu 以太网口 MTU 未改 ip link set dev <iface> mtu 9000
能 ping 但 ib_write_bw 不通 GID index 不对 show_gids 找 IPv4 行,用 -x 指定
带宽只有几百 Kb/s 防火墙拦了 UDP/4791 sudo ufw disable 或放行 4791
Device or resource busy 端口被占用 换 -i 2 或杀残留进程
Invalid Command line 参数写错(如 -b 带数字) -b 是双向模式(不带参数),burst 用 -l,inline 用 -I

附录 C:perftest 易混参数速查

目的 参数 易混点
消息大小 -s
IB/RoCE MTU -m
QP 数 -q
GID index -x
带宽按 Gbps --report-gbits
Inline 最大长度 -I 不是 -l
一次投递 WR 数 -l 不是 -b
双向带宽 -b 不带数字
CQ Moderation --cq-mod 双横线,不是 -c
持续时长(秒) -D
迭代次数 -n

作者注:本文所有测试在个人笔记本电脑虚拟化环境中完成,数据仅反映该环境下的相对趋势。如需引用绝对性能数据,请以物理硬件测试为准。

相关推荐
夜之眷属2 小时前
记一次战斗服务器 CPU 打满 100% 且“无法恢复“的排查
java·linux·运维·服务器·后端·性能优化
余槐i3 小时前
WAL 下写并发仍是 1:SQLite 单写者模型实测与绕开方案
数据库·python·性能优化·sqlite·wal
晚安日记wanna18 小时前
MySQL 回表为什么这么慢?5 种优化手段逐个拆解
数据库·mysql·性能优化
晚安日记wanna18 小时前
索引建了却不走?7 个失效原因逐层排查
数据库·mysql·性能优化
工作10年+,存储芯片行业18 小时前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie
Wang's Blog21 小时前
Java框架 SpringCloud 快速入门: Feign 的性能优化
java·spring cloud·性能优化
打工仔折腾 AI21 小时前
从零写一个CAD 05:以鼠标为中心的滚轮缩放,招法能复用但顺序不能反
开发语言·后端·python·性能优化·计算机外设·swift·ai agent 实战
gwf2161 天前
QP状态机详解:Reset→Init→RTR→RTS与建链握手过程
性能调优·rdma·qp状态机·linux内核驱动·ib_modify_qp·cm建链·irdma
cyf311 天前
RDMA数据传输原理深入解读
udp·rdma·rocev2·bth·pertest