3. DPU 上部署 OVS 并卸载流表到硬件

DPU 上部署 OVS 并卸载流表到硬件 学习卡片

OVS 硬件卸载的数据通路与配置对象

在 Marvell DPU 上,OVS 的硬件卸载依赖三层协作:用户态 ovs-vswitchd 负责流表管理与慢路径,内核 openvswitch 模块负责 datapath 与流表缓存,DPU 加速引擎(如 OCTEON 系列内置的流处理/加密/网络加速单元)通过 representor 端口与 rte_flow 接口接收卸载规则。理解这三者的连接关系,是正确配置卸载的前提。

用户态 (Userspace) ovs-vswitchd 流表管理 / 慢路径 ovsdb-server 配置数据库 ovs-appctl / ovs-dpctl 调试与卸载查询工具 内核态 (Kernel) openvswitch 模块 datapath / 流表缓存 TC Flower / rte_flow 卸载规则下发接口 netdev 物理/虚拟端口 DPU 硬件加速层 (Marvell OCTEON) 流分类引擎 Flow Classification 包处理引擎 Packet Processing 加密/校验引擎 Crypto / Checksum PHY/MAC 物理端口 netlink 配置下发 卸载规则 rte_flow 端口绑定 卸载状态查询: ovs-appctl dpctl/dump-flows -m type=offloaded → 查看已卸载流表;ovs-dpctl show → 查看 datapath 端口与掩码 用户态 内核态 DPU 硬件加速

安装 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%
表中数值为教学示例,用于说明趋势:硬件卸载在小包场景下吞吐提升更显著,因为软件转发受限于每包 CPU 中断与协议栈开销;大包场景下差距缩小,但仍能释放大量 CPU 资源。实际测试请以 iperf3 -c <对端IP> -t 30 -P 4 多次取平均,并记录 mpstat -P ALL 1 的 CPU 占用。

卸载失败排查路径

若 dump-flows type=offloaded 为空,按以下顺序排查:

  1. 确认 other_config:hw-offload=true 已设置且 OVS 已重启。
  2. 确认数据口网卡支持 hw-tc-offload:ethtool -k eth1 | grep hw-tc-offload 应返回 on。
  3. 确认流表 action 可卸载:output、drop、vlan 等通常可卸载;ct、learn、controller 等需额外硬件支持。
  4. 查看内核日志:dmesg | grep -i flower 或 dmesg | grep -i octeon,定位驱动拒绝卸载的原因。
  5. 使用 ovs-appctl dpctl/dump-flows -m 查看所有流表(含软件路径),对比 type=offloaded 的差异。
关键判断:硬件卸载成功的标志是 ovs-appctl dpctl/dump-flows -m type=offloaded 中出现对应流表条目,且 ovs-dpctl show 中端口掩码与流表匹配字段一致。若只有软件流表,则卸载未生效。