2. 报文处理硬件架构
理解 SmartNIC 的报文处理能力,不能只看“有多少个 ARM 核”或“支持多少 Gbps”,而要沿着一条报文从光模块进入、到被 CPU 或主机消费的完整路径去看。这条路径上的每一级——PHY/MAC、packet processor、硬件加速引擎、ARM 核、DMA 与内存子系统——都决定了报文在什么位置被识别、被修改、被丢弃或被转发。本节把这条数据通路拆开,说明各部件如何协同完成线速收发。
一、从 SerDes 到 MAC:报文进入芯片的第一站
光模块或电口送来的高速串行信号首先进入 PHY 层。PHY 内部包含 SerDes、时钟数据恢复(CDR)、均衡与编解码逻辑,把串行比特流恢复成对齐的符号流,再交给 MAC 层。以 100GbE 为例,典型实现是 4 条 25Gbps lane 组成一个 100G 端口,PHY 完成 lane 对齐与通道绑定后,MAC 侧看到的是一个连续的以太网帧流。
MAC 层负责帧定界、前导码与 SFD 识别、FCS 校验、以及基本的流控(PAUSE/PFC)。这里有一个关键判断点:FCS 校验失败或长度非法的帧,通常在 MAC 或紧邻的解析模块就被丢弃,不会继续占用后续 packet processor 的处理带宽。MAC 还会把帧按端口打上来源标识(port ID),这个标识会随报文一路传递,成为后续转发、镜像、统计的依据。
二、Packet Processor:解析、匹配与动作决策
报文离开 MAC 后进入 packet processor(也称 parser + match-action pipeline)。它的工作可以概括为三步:解析、查表、执行动作。
- 解析(Parse):按协议栈逐层剥离头部,识别 EtherType、VLAN、IPv4/IPv6、TCP/UDP、VXLAN/Geneve 等,提取出五元组、隧道 ID、元数据字段。解析结果写入一个内部报文描述符(descriptor),而不是反复访问报文本体。
- 匹配(Match):用解析出的字段去查 ACL、流表、路由表、隧道解封装表等。匹配可以是精确匹配、最长前缀匹配或通配匹配,取决于表类型。
- 动作(Action):命中后执行转发、丢弃、镜像、计数、修改头部(如改 VLAN、改目的 MAC、做 encap/decap)、或者把报文重定向到某个队列或 ARM 核。
这一级是“线速”能否成立的核心。若报文在 pipeline 中需要多次串行查表,或者表项过大导致 SRAM 访问冲突,吞吐就会下降。因此实际设计中,parser 与 match-action 通常做成多级流水,每级只做有限工作,用流水线深度换取时钟频率与吞吐。
三、硬件加速引擎:把重复劳动从 ARM 核手里拿走
如果所有报文都交给 ARM 核处理,核很快会被校验和、加解密、正则匹配等重复操作占满。硬件加速引擎的作用就是把这些固定模式的操作卸载掉。常见引擎包括:
- 校验和卸载:IP/TCP/UDP checksum 的验证与重算,在报文修改后自动更新。
- 加解密与认证:IPsec、MACsec、TLS 记录层的对称加解密与完整性校验。
- 正则/模式匹配:用于 DPI、流分类、特征识别。
- 压缩/解压:部分场景下用于隧道或存储流量。
加速引擎一般挂在 packet processor 之后、ARM 核之前,或者与 ARM 核并行。报文描述符里会带一个“是否需要加速”的标志位,pipeline 根据标志把报文送入对应引擎,处理完再回到主路径。这样 ARM 核看到的已经是校验和正确、已解密或已分类的报文,只需做控制面或复杂业务逻辑。
四、ARM 核、队列与 DMA:报文如何交给主机
ARM 核在数据面中通常承担两类角色:一是运行控制面协议栈(如路由协议、管理代理),二是处理无法完全卸载的慢路径报文。真正的高速数据面报文,更多是经由队列和 DMA 直接送到主机内存,ARM 核只负责配置队列、维护描述符环、处理异常。
队列是报文调度的基本单位。每个端口可以有多个发送队列和接收队列,队列与优先级、TC、VF 绑定。报文在 packet processor 中被分类后,被放入某个接收队列;DMA 引擎从队列中取出描述符,把报文数据写入主机内存中的缓冲区,并更新完成描述符。主机侧驱动通过轮询或中断感知新报文。
内存子系统在这里至关重要。DMA 读写的是主机内存,若内存带宽不足或缓存一致性处理不当,就会出现丢包或延迟抖动。SmartNIC 通常采用多通道 DDR 或 HBM 作为片上缓冲,配合 PCIe 的读写通道,形成“端口—片上缓冲—PCIe—主机内存”的数据通路。队列深度、缓冲区大小、PCIe 通道数共同决定了突发流量下的吸收能力。
五、队列、端口与内存的协同关系
把上述部件串起来看,端口是物理入口,队列是逻辑调度单位,DMA 是搬运通道,内存是缓冲池。四者的协同关系可以这样理解:
- 端口决定“从哪来”:每个端口有独立的 MAC 与统计计数器,port ID 随报文传递。
- 队列决定“排在哪”:packet processor 根据分类结果把报文映射到某个 RX 队列,队列深度决定了能吸收多少突发。
- DMA 决定“搬多快”:DMA 通道数与描述符环大小影响搬运效率,描述符环满时新报文只能丢弃或背压。
- 内存决定“放得下多少”:缓冲区数量与大小决定了在途报文的上限,PCIe 带宽决定了主机侧能多快消费。
一个常见的教学示例参数是:100GbE 端口、4 个 RX 队列、每个队列 1024 个描述符、每个缓冲区 2048 字节。此时单队列可缓存的报文数约为 1024 个,若平均报文 512 字节,则单队列缓冲约 512KB,四队列合计约 2MB。这个量级决定了在主机短暂停顿(如 GC 或调度延迟)时,网卡能撑多久不丢包。实际值需以具体芯片手册和驱动配置为准,此处仅用于说明队列深度与缓冲能力的关系。
六、数据通路上的关键观察点
在实际调试或性能分析时,可以关注以下位置的状态与计数:
| 观察点 | 典型指标 | 异常含义 |
|---|---|---|
| MAC 层 | FCS 错误数、PAUSE 帧数 | 链路质量或对端流控 |
| Packet Processor | parser 错误、表项 miss 计数 | 协议不支持或表项未命中 |
| 加速引擎 | 引擎占用率、队列积压 | 卸载能力不足或配置错误 |
| RX 队列 | 队列深度、丢弃计数 | 主机消费慢或队列过浅 |
| DMA/PCIe | 描述符环满次数、PCIe 重传 | 搬运瓶颈或链路问题 |
这些观察点对应数据通路上的不同级,定位问题时可以按“先看端口计数,再看 pipeline 计数,最后看队列与 DMA 计数”的顺序缩小范围。理解这条通路,也就理解了 SmartNIC 为什么能在不占用主机 CPU 的情况下完成线速收发:每一级只做自己擅长的事,用硬件流水线替代软件逐包处理,用队列和 DMA 把报文高效地交给主机。