2. DPU网络卸载初体验

任务目标

本案例使用DPU(以NVIDIA BlueField-2为例)将OVS(Open vSwitch)数据通路从CPU卸载到DPU硬件,验证卸载后主机CPU占用率显著下降。完成本案例后,您将掌握DPU网络卸载的基本配置方法,并能够量化评估卸载效果。

环境与依赖

  • 服务器:x86主机 + BlueField-2 DPU(25GbE双端口),已安装DOCA 2.0及以上版本
  • 操作系统:主机与DPU均运行Ubuntu 22.04
  • 软件依赖:主机侧安装ovs-vswitchd(2.17+)、dpdk(22.11+)、pktgen-dpdk(用于流量生成);DPU侧安装rshim驱动及mlx5_ctl工具
  • 网络拓扑:DPU端口0连接流量测试仪(或另一台pktgen主机),端口1连接业务服务器

实现原理与配置步骤

OVS卸载的核心是将流表规则下发到DPU的硬件TCAM中,使数据包在DPU侧完成匹配与转发,不再上送主机CPU。本案例通过配置OVS的硬件卸载(hw-offload)模式,并验证卸载前后CPU利用率的差异。

1. 主机侧OVS配置

# 加载vfio驱动并绑定DPU代表口
modprobe vfio-pci
echo 0000:03:00.0 > /sys/bus/pci/drivers/mlx5_core/unbind
echo 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/bind

# 启动OVS并开启硬件卸载
systemctl start openvswitch-switch
ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
ovs-vsctl set Open_vSwitch . other_config:max-idle=30000
systemctl restart openvswitch-switch

# 创建网桥并添加DPU代表口(假设代表口名为enp3s0f0)
ovs-vsctl add-br ovs-br0
ovs-vsctl add-port ovs-br0 enp3s0f0
ovs-vsctl add-port ovs-br0 enp3s0f1
ifconfig enp3s0f0 up
ifconfig enp3s0f1 up

2. 下发卸载流表

# 添加双向转发规则(示例:IP 10.0.0.1 <-> 10.0.0.2)
ovs-ofctl add-flow ovs-br0 "ip,in_port=1,nw_src=10.0.0.1,nw_dst=10.0.0.2,actions=output:2"
ovs-ofctl add-flow ovs-br0 "ip,in_port=2,nw_src=10.0.0.2,nw_dst=10.0.0.1,actions=output:1"

# 验证流表是否成功卸载到硬件(出现OFFLOADED标志)
ovs-appctl dpctl/dump-flows type=offloaded

3. DPU侧确认

# 登录DPU(通过rshim)
ssh root@192.168.100.1

# 查看硬件流表条目
mlx5_ctl hw_flow_table_dump 0

# 确认数据包计数递增(表示硬件正在处理流量)
mlx5_ctl hw_counter_show 0

验证方法与判定标准

使用pktgen-dpdk在测试仪上以线速(25Gbps)发送双向UDP流量,持续60秒。分别记录卸载开启前后的主机CPU占用率:

  1. 卸载前基线:在OVS中执行ovs-vsctl set Open_vSwitch . other_config:hw-offload=false并重启,使用top或pidstat监控ovs-vswitchd进程CPU占用率。
  2. 卸载后对比:重新开启hw-offload并下发流表,同样监控CPU占用率。

通过条件:卸载后ovs-vswitchd的CPU占用率较卸载前下降超过80%,且ovs-appctl dpctl/dump-flows type=offloaded能查询到标记为OFFLOADED的流表条目,DPU侧硬件计数器显示数据包计数持续增长。

预期结果

以下为基于配置逻辑的预期输出示例(非实测数据):

# 卸载前ovs-vswitchd CPU占用率(示例)
pidstat -p $(pgrep ovs-vswitchd) 1 5
14:23:01     UID       PID    %usr  %system  %guest   %CPU   CPU  Command
14:23:02     0      1234    45.20   32.10    0.00   77.30    3  ovs-vswitchd

# 卸载后ovs-vswitchd CPU占用率(示例)
14:25:01     UID       PID    %usr  %system  %guest   %CPU   CPU  Command
14:25:02     0      1234     3.10    1.20    0.00    4.30    3  ovs-vswitchd

# 流表卸载确认
ovs-appctl dpctl/dump-flows type=offloaded
ufid:9a2c...1a, skb_priority:0, in_port(1),eth(),eth_type(0x0800),ipv4(frag=no), actions:output(2)  [OFFLOADED]

常见问题排查

  • 流表未标记OFFLOADED:检查是否已加载vfio-pci并正确绑定DPU代表口;确认OVS版本支持硬件卸载(2.17+);查看ovs-vswitchd.log中是否有offload相关错误。
  • 卸载后吞吐下降:确认流表规则使用了精确匹配(避免通配符),检查DPU固件版本是否支持匹配的报文头字段。
  • CPU占用率未下降:确认流量确实经过DPU硬件路径(而非回退到主机slow path),可通过mlx5_ctl hw_counter_show观察硬件计数是否增长。