3. DPU数据处理流水线解析

Marvell DPU 的数据面之所以能在 100Gbps 甚至 400Gbps 线速下同时完成转发、安全、存储与虚拟化卸载,核心在于一条高度流水化的处理链。理解这条链,不能只记住“解析—匹配—动作—调度—DMA”这几个词,而要看清每一级在做什么、数据以什么形态流动、哪些字段被改写、哪些资源被消耗,以及瓶颈通常出现在哪里。本节按数据包在 DPU 内部的真实行进顺序展开,并给出可观察的参数与判断依据。

一、报文解析:把字节流变成可匹配的字段

报文进入 DPU 后,第一步是解析器(Parser)对原始字节流做逐层解封装。解析器并不“理解”协议语义,它依据预置的协议图和起始偏移,依次识别以太网、VLAN、IPv4/IPv6、TCP/UDP、VXLAN/Geneve、NVGRE 等头部,并输出一组解析键(Parse Key)与解析图(Parse Graph)。解析键是后续匹配的输入,通常包含五元组、VLAN ID、隧道 VNI、DSCP、TCP 标志位等;解析图则记录各层头部的偏移和长度,供动作阶段做改写或封装。

解析器的关键参数是可识别协议层数和每层可提取字段数。以典型配置为例,若解析器支持 8 层协议、每层提取 16 字节键,则一条 VXLAN 内层 TCP 报文可提取到外层五元组、VNI、内层五元组共 11 个字段。若报文出现非标准封装(如自定义隧道),解析器会进入“未识别”分支,此时通常回退到默认动作或送 CPU 处理。判断解析是否正常,可观察解析器统计中的 parse_error、unknown_proto 计数;若这两个计数持续增长,说明协议图需要扩展或报文封装不符合预期。

二、匹配动作:TCAM 与 SRAM 的分工

解析出的键进入匹配动作阶段。DPU 通常采用多级表结构:第一级用 TCAM 做精确或掩码匹配,处理 ACL、隧道终结、安全策略等需要通配的规则;第二级用 SRAM 做哈希匹配,处理 MAC 表、路由表、流表等大规模精确查找。匹配结果指向一个动作表项,动作可以是转发、丢弃、镜像、封装、解封装、修改字段、计数或送 CPU。

这里有一个工程上常被忽略的细节:动作不是单条指令,而是一组微操作的集合。例如“VXLAN 解封装并转发到内层目的端口”至少包含:剥离外层 UDP/IP/Ethernet、读取 VNI、用内层目的 MAC 查二层表、更新 TTL、重算校验和、指定出端口。这些微操作在流水线中按序执行,任一环节失败都会触发异常路径。实际调优时,应关注动作表的命中率和微操作展开深度:命中率低说明表项老化过快或哈希冲突多;展开深度过大则可能拉长流水线延迟。

DPU 数据面流水线:从入端口到 DMA 写回 入端口 100G MAC/PCS 报文解析器 协议图 / 解析键 VXLAN·IPv4·TCP 匹配动作 TCAM 掩码匹配 SRAM 哈希查找 动作微操作展开 流量管理 计量 / 标记 / 整形 WRED / 拥塞控制 队列调度 SP / WRR / DWRR 优先级映射 解析键:五元组 + VNI + DSCP + TCP Flags 动作:转发 / 丢弃 / 封装 改写 TTL / 重算校验和 指定出端口 / 计数 DMA 路径 描述符环 → 读描述符 → 取包数据 → 写主机内存 PCIe Gen4/5 x16 · 地址翻译 · 中断/轮询 关键资源与瓶颈判断 解析器 看 parse_error / unknown_proto 匹配动作 看命中率 / 哈希冲突 / 表项老化 流量管理 看令牌桶速率 / 丢包计数 队列与 DMA 看队列深度 / 描述符耗尽 典型线速目标:100Gbps 下每包处理预算约 6.7ns(64B 小包),流水线级数越多,单级延迟必须越短。 判断依据:若入端口无丢包但出端口丢包,瓶颈通常在队列调度或 DMA 写回;若解析错误增长,优先检查协议图与封装格式。

三、流量管理:计量、标记与整形

匹配动作完成后,报文进入流量管理(TM)阶段。TM 的核心是令牌桶与拥塞管理。以双速三色标记(trTCM)为例,配置承诺速率 CIR=1Gbps、峰值速率 PIR=2Gbps、承诺突发 CBS=64KB、峰值突发 PBS=128KB。报文到达时,先检查峰值桶:若令牌足够则标记为绿色;若峰值桶不足但承诺桶足够,标记为黄色;两者都不足则标记为红色。绿色和黄色通常允许转发,红色则丢弃或降级。WRED 则根据队列平均深度提前丢弃低优先级报文,避免全局同步。

工程上判断 TM 是否生效,不能只看“有没有丢包”,而要看颜色标记比例和队列深度曲线。若绿色比例远低于预期,说明 CIR 配置过小或突发流量超出 CBS;若队列深度长期贴近上限,说明出端口带宽不足或调度权重分配不合理。这些计数通常可通过 ethtool -S 或 DPU 管理接口的统计寄存器读取。

四、队列调度:决定谁先出

调度器从多个队列中选择下一个发送的报文。常见策略有严格优先级(SP)、加权轮询(WRR)和赤字加权轮询(DWRR)。SP 适合控制面报文,但可能饿死低优先级队列;WRR 按权重分配带宽,适合多租户场景。假设端口总带宽 100Gbps,配置三个队列权重为 5:3:2,则理论带宽分别为 50Gbps、30Gbps、20Gbps。实际中还要考虑队列深度和突发吸收能力:权重只决定长期比例,短时突发仍可能造成瞬时丢包。

调度阶段最值得观察的是每队列的出队速率与丢弃计数。若某队列出队速率长期低于其权重对应值,可能是该队列没有足够报文,也可能是上游 TM 已经丢弃。若某队列丢弃计数高但出队速率正常,说明该队列突发过大,需要增大队列深度或调整 WRED 阈值。

五、DMA 路径:从 DPU 到主机内存

报文最终要通过 DMA 写入主机内存或从主机内存读出。以收包方向为例,DPU 的 DMA 引擎读取描述符环,获取缓冲区地址和长度,然后将报文数据写入该地址,最后更新描述符状态并触发中断或置位轮询标志。这一路径的关键参数包括描述符环大小、缓冲区大小、PCIe 带宽和地址翻译开销。若描述符环过小,高吞吐下会出现描述符耗尽,表现为 rx_no_desc 计数增长;若缓冲区过小,则大包需要分片,增加描述符消耗。

一个实用的判断方法是:在 100Gbps 线速下,若平均包长 512 字节,则每秒约 24.4M 包。若每个包消耗一个 16 字节描述符和一个 2KB 缓冲区,描述符环至少需要覆盖数毫秒的突发,即环大小应大于 24.4M × 0.001 ≈ 24400 个条目。实际配置中常取 4096 或 8192,配合中断合并和轮询模式来平衡延迟与 CPU 占用。

排障提示:当出现“入端口计数正常、应用收不到包”时,按流水线顺序逐级检查:解析器是否有 parse_error;匹配动作是否命中丢弃规则;TM 是否因红色标记丢弃;队列是否满;DMA 描述符是否耗尽。每一级都有对应的统计寄存器,不要跳级猜测。

六、把五级串起来看

这条流水线的每一级都在消耗不同的资源:解析器消耗协议图条目,匹配动作消耗 TCAM/SRAM 表项,TM 消耗令牌桶和队列缓存,调度消耗队列深度,DMA 消耗描述符和 PCIe 带宽。理解数据面处理机制,本质上就是理解报文形态如何逐级变化、每级的关键参数如何影响结果,以及瓶颈出现时应该看哪个计数。掌握这条链,后续的配置、调优和故障定位才有明确的着力点。