# RDMA MTU 实验:把 MTU 从 1500 调到 9000,到底能提升多少带宽?
关键字:RDMA MTU、巨型帧、Jumbo Frame、9000 MTU、perftest msg_size MTU 关系
一、问题动机
实验测试全程用默认 MTU1500(标准以太网),发现:
- QP=1, msg=4KB 跑出 77.68 Gb/s
- QP=1, msg=4KB, bidir 跑出128.44 Gb/s
MTU=1500 在小包场景下会有分片开销。
- 4KB / 1500B = 3 个 IP 分片
- 64KB / 1500B =44 个分片
- 每个分片都要单独的包头(Ethernet + IP + UDP + RoCE v2 = 至少 78 字节)
如果把 MTU 改成 9000(巨型帧 / Jumbo Frame)呢?
二、MTU 是什么?
2.1 一句话定义
MTU(Maximum Transmission Unit)是单个网络包能承载的最大数据量(不含包头)。
2.2 类比
快递包裹的尺寸限制:
- MTU=1500 =小包裹(每次只能装 1.5kg),分批发
- MTU=9000 =大包裹(一次能装 9kg),少发货次
包头 vs 包体:
- 每个网络包 =78 字节包头(Ethernet 14 + IP 20 + UDP 8 + RoCE v2 36)+MTU 字节数据
- MTU 越大 →包头占比越小→传输效率越高
2.3 不同 MTU 下 4KB 数据需要的包数
| MTU | 4KB 数据需要 | 包头总开销 | 实际包数 |
|---|---|---|---|
| 1500 | 3 个包 | 3 × 78 = 234 字节 | 数据 + 234B |
| 4096 | 1 个包 | 1 × 78 = 78 字节 | 数据 + 78B |
| 9000 | 1 个包 | 1 × 78 = 78 字节 | 数据 + 78B |
注意:MTU=4096 跟 MTU=9000 对 4KB 数据"看起来"一样(都是单包),但 MTU=9000 给 CPU 更少的中断次数(用于更大包)。
三、实验方法
配置:
- 2 × cx8(200GbE RoCE v2)
- ib_write_bw + perf stat
- QP=1, 4(验证甜点)
- msg_size: 4KB, 64KB, 1MB(3 个量级)
- MTU:1500 vs 9000(对比)
- test_duration: 15 秒
配置方法:
# 改 MTU(需重启网络或下拉接口)iplinkseteth1 mtu9000iplinkseteth2 mtu9000# 测完后还原iplinkseteth1 mtu1500iplinkseteth2 mtu1500四、测试结果
4.1 完整数据(12 个配置点)
| MTU | QP | msg_size | BW (Gb/s) | IPC | L1_dc_miss | ctx_switch |
|---|---|---|---|---|---|---|
| 1500 | 1 | 4KB | 60.76 | 2.319 | 36.8M | 149 |
| 1500 | 1 | 64KB | 47.94 | 2.402 | 9.4M | 141 |
| 1500 | 1 | 1MB | 50.94 | 2.513 | 1.9M | 105 |
| 1500 | 4 | 4KB | 50.20 | 2.715 | 40.1M | 162 |
| 1500 | 4 | 64KB | 50.31 | 2.961 | 8.6M | 162 |
| 1500 | 4 | 1MB | 50.89 | 3.026 | 2.7M | 388 |
| 9000 | 1 | 4KB | 74.91⭐ | 2.187 | 45.8M | 118 |
| 9000 | 1 | 64KB | 51.55 | 2.456 | 8.1M | 160 |
| 9000 | 1 | 1MB | 51.77 | 2.526 | 2.0M | 270 |
| 9000 | 4 | 4KB | 52.06 | 2.699 | 41.8M | 160 |
| 9000 | 4 | 64KB | 51.46 | 2.970 | 8.5M | 259 |
| 9000 | 4 | 1MB | 50.09 | 3.020 | 2.6M | 161 |
4.2 MTU=9000 vs MTU=1500 对比
| 配置 | MTU=1500 | MTU=9000 | 提升 |
|---|---|---|---|
| QP=1, msg=4KB | 60.76 | 74.91 | +23.3%⭐ |
| QP=1, msg=64KB | 47.94 | 51.55 | +7.5% |
| QP=1, msg=1MB | 50.94 | 51.77 | +1.6% |
| QP=4, msg=4KB | 50.20 | 52.06 | +3.7% |
| QP=4, msg=64KB | 50.31 | 51.46 | +2.3% |
| QP=4, msg=1MB | 50.89 | 50.09 | -1.6% |
4.3 ASCII 图(BW vs msg_size,QP=1,MTU 对比)
BW (Gb/s) 80 ┤ ● ← MTU 9000, msg=4KB = 74.91 75 ┤ 70 ┤ 65 ┤ 60 ┤ ● ← MTU 1500, msg=4KB = 60.76 55 ┤ 50 ┤ ● ● ← 平台期 45 ┤ ●(1500) ← MTU 1500 + 64KB = 47.94(异常) └──┬──┬──┬─► msg_size 4K 64K 1M五、根因分析
5.1 为什么 MTU=9000 在 4KB 时提升 23%?
MTU=1500 + 4KB 数据:
- 4KB / 1464B (1500 - 36 包头) =3 个 IP 分片
- 每次 DMA 处理 1464B + 包头 →3 次 PCIe 事务
- CPU 3 次中断处理 →3 次 L1 cache 访问
MTU=9000 + 4KB 数据:
- 4KB / 8964B =1 个包
- 单次 DMA → 单次 PCIe → 单次中断 →单次 cache 访问
- 包头开销从 234B 降到 78B(省 67%)
理论提升:
- (4096 + 234) / (4096 + 78) = 4330 / 4174 =1.037 倍(包头节省)
- 但实际看到 1.23 倍提升 →分片整合带来的 CPU 调度节省比单纯包头开销大
5.2 为什么 MTU=1500 + msg=64KB 跌到 47.94?
64KB / 1500B = 44 个 IP 分片
每个分片都是独立的 PCIe DMA + 中断处理:
- 64KB 数据实际传输 = 64KB + 44×78B =67.4KB 物理流量
- 44 次中断 → CPU 调度开销巨大
MTU=9000 + msg=64KB:
- 64KB / 8964B =8 个包
- 8 次中断 vs 44 次中断 →CPU 调度开销减少 82%
- BW 从 47.94 升到 51.55(+7.5%)
5.3 为什么大包(1MB)MTU 影响小?
1MB / 1500B ≈ 699 个包
1MB / 9000B ≈ 117 个包
但 699 vs 117 都不算多(已经够流水线),所以包数减少带来的收益摊薄到总耗时上很小。
而且1MB 大包的瓶颈是 DMA / PCIe / 内存带宽,不在 CPU 包数处理。
六、MTU + bidir 综合实验(追加测试)
猜想:MTU 9000 + bidir + 4KB 是不是能突破 128 Gb/s?
结果:
| MTU | QP | 模式 | 单方向 BW | 总 BW | 链路利用率 |
|---|---|---|---|---|---|
| 1500 | 1 | 单向 4KB | 77.68* | 77.68 | 38.8% |
| 1500 | 1 | bidir 4KB | 64.22 | 128.44 | 64.2%⭐ |
| 9000 | 1 | 单向 4KB | 74.91 | 74.91 | 37.5% |
| 9000 | 1 | bidir 4KB | 53.64 | 107.28 | 53.6% |
| 9000 | 4 | 单向 4KB | 52.06 | 52.06 | 26.0% |
| 9000 | 4 | bidir 4KB | 50.64 | 101.28 | 50.6%⭐ |
* 上次实验值,本次测试波动到 60.76(见 4.1)
反直觉发现:MTU 9000 + bidir 不如 MTU 1500 + bidir!
| 组合 | 总 BW |
|---|---|
| MTU 1500 + bidir QP=1 | 128.44⭐ |
| MTU 9000 + bidir QP=1 | 107.28 |
| MTU 9000 + bidir QP=4 | 101.28 |
为什么?
MTU 1500 + bidir 优势:
- 每包小 → 包数多 →CPU 流水线越深
- 4 个核并发处理多个 SQ 槽 → 隐藏 CPU 延迟
MTU 9000 + bidir 劣势:
- 每包大 → 包数少 →CPU 等待 DMA 完成时间变长
- i3 单核在这段时间"闲着"
- 未能充分发挥流水线
推论:在 i3 单核 CPU 上,MTU 1500 + bidir 反而是最优组合。
七、综合判断
7.1 MTU 怎么选?
| 场景 | 推荐 MTU | 理由 |
|---|---|---|
| 单核 CPU + 小包 + 单向 | MTU=9000 | 省包头 + 省中断(+23%) |
| 单核 CPU + 小包 + bidir | MTU=1500⭐ | 包数多利于流水线(128 vs 107) |
| 多核 CPU + 大包 | MTU=9000 | 省分片开销 |
| 多核 CPU + NCCL AllReduce | 两者都行 | NCCL 内部已优化 |
| 跨广域网 | MTU=1500 | 互联网普遍不支持巨型帧 |
八、复现命令
# 设 MTU 9000sshroot@cx8"ip link set eth1 mtu 9000 && ip link set eth2 mtu 9000"# 跑测试sshroot@cx8"ib_write_bw -d mlx5_0 -x 2 -s 4096 -D 15 -q 1 -t 128 -b \ --report_gbits --cpu_util &"sleep2sshroot@cx8"ib_write_bw -d mlx5_1 -x 2 -s 4096 -D 15 -q 1 -t 128 -b \ --report_gbits --cpu_util 192.168.99.1"# 还原 MTUsshroot@cx8"ip link set eth1 mtu 1500 && ip link set eth2 mtu 1500"九、一句话总结
MTU 9000 对小包单方向帮助显著(+23%),但单核 CPU 下小包 bidir 反而不如 MTU 1500(128 vs 107)。MTU 不是越大越好,要看 CPU 核心数和流量模式。
