# 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 数据需要的包数

MTU4KB 数据需要包头总开销实际包数
15003 个包3 × 78 = 234 字节数据 + 234B
40961 个包1 × 78 = 78 字节数据 + 78B
90001 个包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 个配置点)

MTUQPmsg_sizeBW (Gb/s)IPCL1_dc_missctx_switch
150014KB60.762.31936.8M149
1500164KB47.942.4029.4M141
150011MB50.942.5131.9M105
150044KB50.202.71540.1M162
1500464KB50.312.9618.6M162
150041MB50.893.0262.7M388
900014KB74.912.18745.8M118
9000164KB51.552.4568.1M160
900011MB51.772.5262.0M270
900044KB52.062.69941.8M160
9000464KB51.462.9708.5M259
900041MB50.093.0202.6M161

4.2 MTU=9000 vs MTU=1500 对比

配置MTU=1500MTU=9000提升
QP=1, msg=4KB60.7674.91+23.3%
QP=1, msg=64KB47.9451.55+7.5%
QP=1, msg=1MB50.9451.77+1.6%
QP=4, msg=4KB50.2052.06+3.7%
QP=4, msg=64KB50.3151.46+2.3%
QP=4, msg=1MB50.8950.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?

结果

MTUQP模式单方向 BW总 BW链路利用率
15001单向 4KB77.68*77.6838.8%
15001bidir 4KB64.22128.4464.2%
90001单向 4KB74.9174.9137.5%
90001bidir 4KB53.64107.2853.6%
90004单向 4KB52.0652.0626.0%
90004bidir 4KB50.64101.2850.6%

* 上次实验值,本次测试波动到 60.76(见 4.1)

反直觉发现:MTU 9000 + bidir 不如 MTU 1500 + bidir!

组合总 BW
MTU 1500 + bidir QP=1128.44
MTU 9000 + bidir QP=1107.28
MTU 9000 + bidir QP=4101.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 + 小包 + bidirMTU=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 核心数和流量模式