4. 基于 DPU 的 VXLAN 隧道端点卸载

基于 DPU 的 VXLAN 隧道端点卸载 学习卡片

VXLAN 卸载的核心:把隧道端点搬到 DPU

VXLAN 隧道端点(VTEP)负责把二层帧封装进 UDP 报文,或把收到的 UDP 报文解封装还原成二层帧。若 VTEP 运行在主机内核里,每个跨主机报文都要经过内核网络栈,CPU 开销随东西向流量线性上升。把 VTEP 下沉到 DPU 后,封装/解封装、VNI 查表、外层路由查找和转发全部由 DPU 的硬件加速引擎完成,主机 CPU 只负责产生和消费原始业务流量。

本例在 Marvell DPU 上配置一个硬件卸载的 VTEP,让两台主机通过 VXLAN overlay 互通,并对比软件 VTEP 与 DPU 卸载 VTEP 的吞吐和时延。

主机 A 业务 VM / 容器 overlay IP: 10.0.0.1/24 主机内核网络栈 仅处理原始业务帧 主机 B 业务 VM / 容器 overlay IP: 10.0.0.2/24 主机内核网络栈 仅处理原始业务帧 DPU A(VTEP 卸载) 硬件加速引擎 封装 / 解封装 / VNI 查表 VTEP 接口 vxlan0 VNI 100 underlay: 192.168.1.10 DPU B(VTEP 卸载) 硬件加速引擎 封装 / 解封装 / VNI 查表 VTEP 接口 vxlan0 VNI 100 underlay: 192.168.1.20 Underlay IP 网络 UDP 4789 | 192.168.1.0/24 VXLAN 封装报文(外层 UDP + VNI 100) VXLAN 封装报文结构 外层 MAC 外层 IP UDP VXLAN 原始二层帧(内层) VNI=100 标识 overlay 网段 主机-DPU 链路 DPU-Underlay 链路 VXLAN 封装流量

配置步骤

以下操作在 DPU A 和 DPU B 上对称执行。假设 DPU 已运行 Linux,且管理口与数据口已按前例完成配置,underlay 地址分别为 192.168.1.10 和 192.168.1.20。

1. 创建 VXLAN 接口并指定 VNI 与远端 VTEP

# 在 DPU A 上执行
ip link add vxlan0 type vxlan \
    id 100 \
    dstport 4789 \
    local 192.168.1.10 \
    remote 192.168.1.20 \
    dev eth1

ip link set vxlan0 up
ip addr add 10.0.0.1/24 dev vxlan0

DPU B 上把 local 与 remote 互换,overlay 地址改为 10.0.0.2/24。此时 vxlan0 是一个点对点隧道接口,VNI 100 对应 overlay 网段 10.0.0.0/24。

2. 将 VTEP 流表卸载到硬件

Marvell DPU 的加速引擎通过 tc flower 规则识别 VXLAN 流量并卸载。关键匹配字段包括外层 UDP 端口 4789、VNI 100 以及内层 overlay 地址。

# 卸载入口方向:解封装后转发到主机
tc qdisc add dev eth1 clsact
tc filter add dev eth1 ingress protocol ip flower \
    enc_dst_port 4789 \
    enc_key_id 100 \
    action tunnel_key unset \
    action mirred egress redirect dev vxlan0

# 卸载出口方向:从 vxlan0 封装后发出
tc filter add dev vxlan0 ingress protocol ip flower \
    action tunnel_key set \
        src_ip 192.168.1.10 \
        dst_ip 192.168.1.20 \
        dst_port 4789 \
        id 100 \
    action mirred egress redirect dev eth1

下发后可用 tc filter show dev eth1 ingress 确认规则已进入 in_hw 状态,表示由硬件而非内核软件路径处理。

3. 验证 overlay 连通性

# 从主机 A 的 overlay 地址 ping 主机 B
ping -c 5 10.0.0.2

# 查看 VXLAN 接口统计
ip -s link show vxlan0

# 确认卸载计数增长
tc -s filter show dev eth1 ingress

若 ping 通且 tc -s 中 in_hw 规则的包计数随流量增长,说明封装/解封装确实走了硬件路径。

吞吐与时延测试

用 iperf3 在 overlay 地址之间打流,分别记录软件 VTEP(关闭 tc 卸载规则)和 DPU 硬件 VTEP 两组数据。测试命令:

# 主机 B 作为服务端
iperf3 -s -B 10.0.0.2

# 主机 A 作为客户端,测试 TCP 吞吐
iperf3 -c 10.0.0.2 -t 30 -P 4

# 测试 UDP 时延(小包)
iperf3 -c 10.0.0.2 -u -b 1M -t 30 -l 64
测试项软件 VTEPDPU 硬件 VTEP观察重点
TCP 吞吐(4 流)约 4–6 Gbps约 18–22 Gbps硬件卸载后吞吐显著提升
UDP 64B 时延约 80–120 μs约 25–40 μs小包时延下降明显
主机 CPU 占用1 核接近 100%低于 15%封装开销从 CPU 转移到 DPU

表中数值为典型示例区间,实际结果取决于 DPU 型号、PCIe 带宽、主机 CPU 和流数量,应以现场实测为准。

若吞吐没有明显提升,先检查 tc filter show 是否显示 in_hw。若规则停留在 not_in_hw,通常是匹配字段不被硬件支持,或 VXLAN 接口的 remote 配置与 flower 规则中的外层地址不一致。
VXLAN 卸载要求 underlay 路径的 MTU 足够大。外层封装会增加约 50 字节开销,若物理口 MTU 为 1500,overlay 内层有效 MTU 只有约 1450。建议把物理口 MTU 设为 1600 以上,或把 overlay 接口 MTU 设为 1450,避免大包被分片导致性能骤降。