3. 基于DPU的OVS卸载
任务目标
在BlueField-3 DPU上,将Open vSwitch(OVS)的数据路径(datapath)从主机CPU卸载到DPU硬件,使虚拟机的网络流量转发由DPU的ASAP2加速引擎处理,从而释放主机CPU资源。完成本案例后,您将获得一套可验证的OVS硬件卸载(Hardware Offload)配置。
环境依赖
- BlueField-3 DPU(建议使用BF2及以上,本案例基于BF3)
- DOCA 2.x或更高版本(包含OVS卸载所需的驱动与工具)
- 主机侧:Ubuntu 22.04+,内核≥5.15,已安装
openvswitch-switch(版本≥2.17) - DPU侧:已安装
rshim工具,可登录DPU的BlueField Linux环境 - 固件版本需支持ASAP2(建议使用DOCA 2.5+配套固件)
实现原理与配置步骤
OVS卸载的核心是将OVS的流表规则下发到DPU的硬件TC(Traffic Control)引擎。BlueField-3通过mlx5网卡驱动与OVS的hw-offload机制配合,将匹配的流表转换为硬件规则。本案例使用最小拓扑:主机侧创建两个VF(Virtual Function),分别作为两个虚拟机的虚拟网卡,通过OVS网桥连接,验证卸载后VF间流量转发。
1. 主机侧配置
首先确认网卡驱动支持卸载,并加载相关模块:
# 检查驱动参数(需为“true”)
cat /sys/module/mlx5_core/parameters/hw_offload
# 若输出为false,则重新加载驱动
echo options mlx5_core hw_offload=true > /etc/modprobe.d/mlx5.conf
rmmod mlx5_core && modprobe mlx5_core
# 创建两个VF(假设PF为p0,使用SF端口时同理)
echo 2 > /sys/class/net/p0/device/sriov_numvfs
# 确认VF已生成
ip link show | grep vf
2. OVS卸载配置
配置OVS开启硬件卸载,并创建网桥与端口:
# 开启OVS硬件卸载
ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
# 重启OVS使配置生效
systemctl restart openvswitch-switch
# 创建网桥并添加VF端口
ovs-vsctl add-br ovs-br
ovs-vsctl add-port ovs-br p0_0
ovs-vsctl add-port ovs-br p0_1
# 查看端口状态
ovs-vsctl show
其中p0_0和p0_1是VF对应的接口名(通常为enp0f0npf0vf0等,可通过ip link show确认)。
3. DPU侧验证配置
登录DPU侧,确认硬件卸载表项已同步。DPU侧无需额外配置,但需确认ASAP2固件已加载:
# 在DPU侧执行(通过rshim登录)
doca_hw_offload_check # 若命令不存在,可跳过,以主机侧验证为准
验证方法与判定标准
完成上述配置后,通过以下步骤验证卸载是否生效:
- 检查OVS卸载状态:执行
ovs-appctl dpif-netdev/dpif-netlink相关命令,观察是否有卸载统计。更直接的方法是查看硬件规则表:
# 查看卸载到硬件的流表数(非零即表示有卸载)
ovs-appctl dpctl/dump-flows type=offloaded
# 若输出非空,说明有流表已卸载
- 连通性测试:在两个VF对应的命名空间(或直连虚拟机)中配置IP并互相ping。若卸载生效,ping流量应能通过,且主机CPU占用率显著低于纯软件转发。
- 判定通过条件:
ovs-appctl dpctl/dump-flows type=offloaded输出中能看到匹配的流表项(如ipv4、eth类型),且VF间网络连通。若输出为空,则卸载未生效,需检查驱动参数与OVS版本。
常见问题排查
- 卸载不生效:确认
hw-offload=true已写入OVS配置且OVS已重启;检查dmesg中是否有mlx5相关报错。 - VF端口无法添加:确认VF已正确创建且未被其他驱动占用,使用
ip link show查看VF状态。 - 性能未提升:卸载仅对匹配流表的长连接流量生效,短连接或首包仍走软件路径,需使用持续流量测试(如
iperf)。
本案例提供最小可复现的OVS卸载配置,核心验证路径为:配置驱动→开启OVS卸载→添加VF端口→检查卸载流表→连通性测试。完成上述步骤并观察到非空卸载流表,即表示DPU硬件加速已生效。