3. DPU 上部署 OVS 并卸载流表到硬件
OVS 硬件卸载的数据通路与配置对象
在 Marvell DPU 上,OVS 的硬件卸载依赖三层协作:用户态 ovs-vswitchd 负责流表管理与慢路径,内核 openvswitch 模块负责 datapath 与流表缓存,DPU 加速引擎(如 OCTEON 系列内置的流处理/加密/网络加速单元)通过 representor 端口与 rte_flow 接口接收卸载规则。理解这三者的连接关系,是正确配置卸载的前提。
安装 OVS 与启用硬件卸载
Marvell DPU 通常运行基于 Yocto 或 Ubuntu 的 ARM64 系统。安装 OVS 时需确保内核已包含 openvswitch 与 tc-flower 卸载支持,并安装 ovs-ctl、ovs-vsctl、ovs-appctl 等工具。以下命令在 DPU 的 Linux 终端中执行。
# 1. 安装 OVS 与依赖(以 Ubuntu 22.04 ARM64 为例)
sudo apt update
sudo apt install -y openvswitch-switch openvswitch-common iproute2
# 2. 启动 OVS 服务
sudo systemctl enable --now openvswitch-switch
# 3. 验证 OVS 版本与内核模块
ovs-vsctl --version
lsmod | grep openvswitch
# 4. 创建网桥并绑定 DPU 数据口(假设数据口为 eth1、eth2)
sudo ovs-vsctl add-br br0
sudo ovs-vsctl add-port br0 eth1
sudo ovs-vsctl add-port br0 eth2
# 5. 启用硬件卸载(关键步骤)
sudo ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
sudo systemctl restart openvswitch-switch
# 6. 确认卸载已启用
ovs-vsctl get Open_vSwitch . other_config:hw-offload
# 预期输出:true
hw-offload 返回 false,检查 DPU 固件是否已加载流分类固件,以及 tc 是否支持 flower 卸载。可通过 ethtool -k eth1 | grep hw-tc-offload 确认网卡是否报告支持硬件 TC 卸载。下发流表并验证卸载状态
创建一条简单的 L2 转发流表,将 eth1 进入、目的 MAC 为 00:11:22:33:44:55 的流量直接转发到 eth2,并请求硬件卸载。
# 添加流表,actions=output:eth2,并标记为可卸载
sudo ovs-ofctl add-flow br0 \
"table=0,priority=100,in_port=eth1,dl_dst=00:11:22:33:44:55,actions=output:eth2"
# 查看流表
sudo ovs-ofctl dump-flows br0
# 查看已卸载到硬件的流表
sudo ovs-appctl dpctl/dump-flows -m type=offloaded
# 查看 datapath 端口与掩码
sudo ovs-dpctl show
若卸载成功,dump-flows type=offloaded 会显示该流表条目,且 ovs-dpctl show 中对应端口的 mask 字段会体现硬件匹配能力。若未显示,说明流表仍停留在软件 datapath,需检查 hw-offload 是否生效、网卡是否支持 TC flower 卸载、以及流表是否包含无法卸载的 action(如 ct 未配置硬件连接跟踪)。
软件转发与硬件卸载吞吐对比
使用 iperf3 或 netperf 在 DPU 的两个数据口之间打流,分别测试关闭和开启硬件卸载时的吞吐。测试拓扑为:主机 A → DPU eth1 → OVS br0 → DPU eth2 → 主机 B。以下为教学示例参数,实际数值取决于 DPU 型号、包长和流表复杂度。
| 测试条件 | 包长 (Byte) | 软件转发吞吐 (Gbps) | 硬件卸载吞吐 (Gbps) | CPU 占用 (软件/硬件) |
|---|---|---|---|---|
| 单条 L2 转发流表 | 64 | 约 2.1 | 约 9.8 | 约 85% / 约 12% |
| 单条 L2 转发流表 | 512 | 约 5.6 | 约 24.5 | 约 70% / 约 8% |
| 单条 L2 转发流表 | 1518 | 约 8.9 | 约 38.2 | 约 55% / 约 5% |
iperf3 -c <对端IP> -t 30 -P 4 多次取平均,并记录 mpstat -P ALL 1 的 CPU 占用。卸载失败排查路径
若 dump-flows type=offloaded 为空,按以下顺序排查:
- 确认
other_config:hw-offload=true已设置且 OVS 已重启。 - 确认数据口网卡支持
hw-tc-offload:ethtool -k eth1 | grep hw-tc-offload应返回on。 - 确认流表 action 可卸载:
output、drop、vlan等通常可卸载;ct、learn、controller等需额外硬件支持。 - 查看内核日志:
dmesg | grep -i flower或dmesg | grep -i octeon,定位驱动拒绝卸载的原因。 - 使用
ovs-appctl dpctl/dump-flows -m查看所有流表(含软件路径),对比type=offloaded的差异。
ovs-appctl dpctl/dump-flows -m type=offloaded 中出现对应流表条目,且 ovs-dpctl show 中端口掩码与流表匹配字段一致。若只有软件流表,则卸载未生效。