4. 基于 DPU 的 VXLAN 隧道端点卸载
VXLAN 卸载的核心:把隧道端点搬到 DPU
VXLAN 隧道端点(VTEP)负责把二层帧封装进 UDP 报文,或把收到的 UDP 报文解封装还原成二层帧。若 VTEP 运行在主机内核里,每个跨主机报文都要经过内核网络栈,CPU 开销随东西向流量线性上升。把 VTEP 下沉到 DPU 后,封装/解封装、VNI 查表、外层路由查找和转发全部由 DPU 的硬件加速引擎完成,主机 CPU 只负责产生和消费原始业务流量。
本例在 Marvell DPU 上配置一个硬件卸载的 VTEP,让两台主机通过 VXLAN overlay 互通,并对比软件 VTEP 与 DPU 卸载 VTEP 的吞吐和时延。
配置步骤
以下操作在 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
| 测试项 | 软件 VTEP | DPU 硬件 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 规则中的外层地址不一致。