2. DPU硬件与网络数据路径

BlueField DPU 不是一块“插在服务器里的普通网卡”,而是一台以 PCIe 为宿主接口、自带多核 ARM 子系统与完整网络数据通路的片上系统。理解它的硬件结构,是后续做 DOCA 卸载、流量镜像、OVS 加速和零拷贝通信的前提。本节从芯片内部结构出发,沿着“网络接口 → 报文解析 → 内存/PCIe 拓扑 → 主机或 ARM 侧处理”的顺序,把数据包在 DPU 中的真实流转路径讲清楚。

一、BlueField DPU 的内部结构

以 BlueField-2 为例,芯片内部可以划分为四个功能域:

  • 网络接口域:提供两个 100Gb/s 以太网端口(或一个 200Gb/s 聚合端口),支持以太网、RoCEv2、VXLAN/Geneve 等封装。物理层与 MAC 由硬件处理,报文进入后交给可编程的报文处理流水线。
  • 可编程数据面:包含 eSwitch(嵌入式交换机)与 Parser/Match/Action 流水线。eSwitch 负责在物理端口、主机 PF/VF、ARM 侧 PF/VF 之间做二层/三层转发与 ACL 匹配,是“流量到底给谁”的决策点。
  • ARM 子系统:多核 Arm Cortex-A72(BlueField-2 为 8 核),运行 Linux,承载 DOCA 服务、OVS、DPDK、存储与安全应用。它通过内部总线访问网络接口与内存,是“卸载逻辑”的执行者。
  • PCIe 与内存域:DPU 作为 PCIe Endpoint 接入主机,同时自身挂载 DDR 内存。主机与 DPU 之间通过 PCIe 交换数据,DPU 内部通过一致性互联访问本地 DDR。

关键点在于:DPU 同时是“网卡”和“主机”。对宿主机而言,它是一张 PCIe 设备;对网络而言,它是一台能独立跑协议栈的服务器。这种双重身份决定了数据包有两条可能的归宿——主机侧或 ARM 侧。

二、网络接口与 PCIe 拓扑

BlueField-2 的 PCIe 接口通常为 PCIe Gen4 x16,向下兼容 Gen3。它向主机暴露多个 PCIe Physical Function(PF)与 Virtual Function(VF),典型划分如下:

功能典型用途归属
PF0 / PF1主机侧以太网接口(netdev)宿主机
VF0…VFnSR-IOV 虚拟化、容器网络宿主机/虚拟机
ARM PFDPU 自身管理口、DOCA 服务ARM 子系统
eSwitch 端口连接物理口、主机 PF/VF、ARM PF数据面

内存拓扑上,DPU 拥有独立的 DDR4/DDR5 控制器与内存条,容量常见 8GB~32GB。主机内存与 DPU 内存是两套物理内存:主机通过 PCIe BAR 空间访问 DPU 的寄存器与队列,DPU 通过 PCIe 发起 DMA 读写主机内存。二者之间没有硬件缓存一致性,跨 PCIe 的数据搬运需要显式 DMA 或 RDMA 操作。

理解拓扑的一个实用判断:如果一段数据要“从网口到主机应用”,它必须经过 eSwitch → 主机 PF/VF → PCIe DMA → 主机内存;如果“从网口到 DPU 上的 OVS”,则走 eSwitch → ARM PF → DPU DDR,完全不占用主机 PCIe 带宽。

三、数据包在 DPU 中的流转路径

下面这张图给出了一条报文从物理端口进入后,在 BlueField DPU 内部的主要分支与流转关系。它把网络接口、eSwitch、ARM 子系统、PCIe 与两侧内存放在同一张拓扑里,便于对照理解“流量去了哪里”。

物理网络 100GbE ×2 RoCEv2 / VXLAN 网络接口域 MAC / Parser 校验 / 分流 RSS / 时间戳 eSwitch 数据面 Match / Action ACL / 转发决策 VLAN / VXLAN 镜像 / 采样 端口映射 ARM 子系统(DPU 侧) 8×Cortex-A72 + Linux DOCA / OVS / DPDK ARM PF 接口 DPU DDR 内存 本地协议栈处理 宿主机(Host) PCIe Gen4 x16 Endpoint PF0/PF1 + SR-IOV VF 主机 DDR 内存 应用 / 内核协议栈 DMA 读写 DPU 队列 ARM PF 分支 主机 PF/VF 分支 PCIe 总线 DMA / BAR 路径判断要点: ① 走 ARM 侧:报文不经过主机 PCIe,节省主机带宽,适合 OVS/防火墙/存储卸载。 ② 走主机侧:报文经 PCIe DMA 进入主机内存,适合传统应用与 SR-IOV 直通。

结合上图,一条报文的典型流转可以拆成四步:

  1. 入口解析:报文从物理端口进入网络接口域,硬件完成 MAC 层校验、五元组解析、RSS 哈希,并打上时间戳。此时报文仍是“裸包”,尚未决定归属。
  2. eSwitch 决策:报文进入 eSwitch 流水线,按 Match/Action 规则匹配。规则可以基于目的 MAC、VLAN、IP、端口号,也可以基于 VXLAN VNI。匹配结果决定报文被送往主机 PF/VF、ARM PF,还是被镜像/丢弃。
  3. 分支搬运:若送往 ARM 侧,报文写入 DPU DDR,由 ARM 上的 DPDK/OVS 直接处理;若送往主机侧,报文通过 PCIe DMA 写入主机内存中预先注册的 RX 队列,主机驱动收到中断或轮询后交给协议栈。
  4. 回程与卸载:主机或 ARM 侧处理完成后,报文沿相反方向经 eSwitch 从物理口发出。若启用了 DOCA 卸载,部分转发、加密、压缩动作在 eSwitch 或硬件引擎中完成,CPU 只处理控制面。

四、实际观察与验证方法

在真实环境中,可以用几条命令确认上述拓扑是否按预期工作。以下命令在 DPU 的 ARM 侧 Linux 中执行,用于查看 PCIe 设备与网络接口的对应关系:

# 查看 DPU 作为 PCIe Endpoint 暴露给主机的设备
lspci -nn | grep -i mellanox

# 查看 ARM 侧网络接口与 representor 端口
ip link show

# 查看 eSwitch 端口映射与 representor 对应关系
devlink port show

# 查看主机侧 PF/VF 与 DPU 的绑定状态
cat /sys/class/net/ens1f0/device/sriov_numvfs

判断依据很直接:如果 devlink port show 中物理口对应的 representor 与主机 PF 处于同一 eSwitch 下,说明流量可以在主机与 ARM 之间被规则调度;如果 ethtool -S 中 RX 队列计数在 ARM 侧增长而主机侧不增长,说明报文走的是 ARM 分支,未占用主机 PCIe 带宽。反之,主机侧队列增长则说明报文经 PCIe DMA 进入了主机内存。

一个常见误区:把 DPU 当成“更快的网卡”只做 SR-IOV 直通,此时 ARM 子系统基本闲置,eSwitch 只做简单转发,DOCA 的卸载能力没有被使用。要发挥 DPU 价值,必须让流量经过 ARM 侧的 DOCA 服务或 eSwitch 的可编程规则,而不是全部直通给主机。

五、内存与 PCIe 对性能的影响

跨 PCIe 的 DMA 是主机侧路径的主要开销来源。以 PCIe Gen4 x16 为例,理论双向带宽约 32GB/s,但实际有效带宽受报文大小、队列深度和 DMA 描述符开销影响。小包场景下,每包都要经历一次描述符读写和一次数据 DMA,PCIe 事务开销占比高,吞吐会明显低于大包。这也是为什么在高包转发率场景中,优先把处理逻辑放在 ARM 侧或 eSwitch 中,避免报文反复穿越 PCIe。

DPU 本地 DDR 的访问延迟远低于跨 PCIe 访问主机内存。因此,DOCA 应用在 ARM 侧做报文缓存、流表查找和状态维护时,应尽量使用本地内存;只有必须与主机共享的数据,才通过 PCIe 或 RDMA 传递。理解“哪侧内存、哪条总线”是后续做零拷贝和卸载设计的基础。

把本节内容压缩成一句话:BlueField DPU 的数据路径由 eSwitch 做分叉决策,向上可走 ARM 子系统与本地 DDR,向下可走 PCIe 与主机内存;选择哪条路径,决定了带宽开销、延迟和可卸载的功能范围。