第2章:SmartNIC硬件架构
大家好,我是你们的讲师。今天咱们聊聊SmartNIC的硬件架构。说实话,很多做网络开发的兄弟一听到硬件就头疼,觉得那是硬件工程师的事。但你想啊,如果你不了解手里的武器长什么样,你怎么能把它用好?
这一章,我会从芯片选型、内部数据通路、板级组成三个维度,带你摸清SmartNIC的底细。我保证,看完这章你再去看开发文档,会感觉通透很多。
2.1 主流SmartNIC芯片介绍
目前市面上主流的SmartNIC方案,说白了就三大流派:NVIDIA的BlueField系列、基于FPGA的方案、以及新兴的DPU(数据处理单元)。
2.1.1 BlueField系列
BlueField是NVIDIA收购Mellanox后的拳头产品。我个人习惯把它看作「带网口的ARM服务器」。它内部集成了多个ARM Cortex-A72核心,跑的是Linux系统。
我记得第一次拿到BlueField-2的开发板时,第一反应是:这不就是个迷你服务器吗?确实,它有自己的DDR内存、PCIe接口、甚至还能跑Docker容器。
BlueField的核心优势在于:
- 完整的ARM SoC:可以独立运行Linux,支持标准网络协议栈
- 硬件加速引擎:内置了正则匹配、加密解密、流量整形等硬件模块
- SR-IOV支持:最多支持上千个虚拟功能(VF),适合虚拟化场景
避坑指南:我曾经在项目中遇到BlueField的ARM核跑满100%的情况。排查了半天,发现是某个用户态进程在轮询网卡队列。后来我建议把中断亲和性绑定到特定核心,问题就解决了。记住,ARM核虽然能跑Linux,但资源有限,别把它当通用CPU用。
2.1.2 FPGA-based方案
FPGA方案,说白了就是「可编程的硬件」。Xilinx(现在叫AMD)和Intel都有对应的SmartNIC方案。
FPGA方案最大的特点是灵活。你可以用Verilog或VHDL自己定义数据通路,想怎么处理包就怎么处理。但代价是开发难度大,调试周期长。
我见过一个团队,用FPGA实现了自定义的NVMe-oF卸载。他们花了三个月写RTL代码,又花了一个月调试。嗯,要是用BlueField,可能两周就搞定了。但FPGA方案的性能确实高,延迟能控制在微秒级。
FPGA方案的典型应用场景:
- 需要超低延迟的交易系统
- 自定义协议解析(比如非标网络协议)
- 需要频繁更新硬件逻辑的场景
2.1.3 DPU(数据处理单元)
DPU是最近两年火起来的概念。说白了,它就是专门为数据中心设计的SmartNIC芯片。代表产品有NVIDIA的BlueField-3、Intel的IPU、以及Marvell的OCTEON系列。
DPU和传统SmartNIC最大的区别在于:它把网络、存储、安全三大功能都集成到了一个芯片里。你想想看,以前需要三张卡做的事,现在一张卡就搞定了。
我个人觉得,DPU是未来五年的趋势。为什么?因为数据中心越来越需要「基础设施卸载」。把虚拟化、存储、安全这些开销从CPU上卸下来,让CPU专心跑业务应用。
2.2 内部总线与数据通路
理解了芯片选型,咱们再来看看数据是怎么在SmartNIC内部流动的。这部分我建议你重点看,因为开发卸载功能时,你写的代码最终都要映射到这条数据通路上。
2.2.1 数据通路概览
一个典型的数据包从网口进来,会经过以下路径:
- SerDes:把光信号/电信号转成数字信号
- MAC层:解析以太网帧头
- 硬件卸载引擎:做L2/L3/L4的校验和、分段重组等
- 流分类器:根据五元组或其他规则,决定包的去向
- 处理单元:ARM核或FPGA逻辑做深度处理
- PCIe DMA:把数据搬到主机内存
下面这张图是我手绘的数据通路,你感受一下:
2.2.2 内部总线架构
SmartNIC内部的总线架构,决定了数据能跑多快。目前主流方案有两种:
| 总线类型 | 带宽 | 延迟 | 典型应用 |
|---|---|---|---|
| AXI4 | 最高512位/时钟 | 低 | FPGA内部互联 |
| CCIX | 25GT/s per lane | 极低 | ARM与加速器通信 |
| NVLINK | 900GB/s | 极低 | NVIDIA GPU互联 |
我建议你重点关注AXI4总线。为什么?因为大部分FPGA-based的SmartNIC都用它。AXI4支持乱序传输、支持多个master同时访问,说白了就是「多车道高速公路」。
2.3 板级硬件组成
聊完芯片内部,咱们看看板级硬件。这部分我尽量讲得接地气一点,毕竟你写代码时可能不会直接操作这些硬件,但出了问题排查时,这些知识能救命。
2.3.1 PCIe接口
PCIe是SmartNIC和主机通信的桥梁。目前主流的是PCIe Gen4 x16,单向带宽约32GB/s。
我记得有一次,客户反馈说SmartNIC吞吐量上不去。我一看,他们把卡插在了PCIe Gen3的槽位上。嗯,带宽直接砍半。所以,部署时一定要确认主板的PCIe版本和槽位宽度。
小技巧:用lspci -vvv命令可以查看当前PCIe链路状态。重点关注LnkSta字段,它会显示当前协商的速度和宽度。
2.3.2 DDR内存
SmartNIC上的DDR内存,主要用于:
- 存储流表、路由表等控制面数据
- 作为数据包的临时缓冲区
- 运行ARM核的操作系统和应用程序
容量方面,低端卡配2-4GB,高端卡能到16GB甚至更多。我建议你根据业务场景来选:如果只是做简单的L4负载均衡,4GB绰绰有余;如果要跑复杂的DPI(深度包检测),至少8GB起步。
注意:SmartNIC上的DDR内存和主机内存是独立的。我曾经见过有人试图在SmartNIC上分配超过物理内存大小的缓冲区,结果系统直接OOM。记住,SmartNIC的内存资源很宝贵,别浪费。
2.3.3 SerDes
SerDes是串行器/解串器的缩写。说白了,它负责把并行数据转成串行信号,通过物理介质(光纤或铜缆)传输。
SerDes的关键参数:
- 速率:常见的有25Gbps、50Gbps、100Gbps
- 数量:决定了网口数量。比如8个25G SerDes可以组成2个100G网口
- 功耗:每个SerDes约1-2W,8个就是8-16W
嗯,这里要特别提醒一下:SerDes的功耗不容忽视。我做过一个项目,整卡功耗80W,其中SerDes占了30W。散热没做好,卡直接降频。所以,选型时一定要算好散热预算。
2.4 本章小结
这一章我们聊了SmartNIC的硬件架构。从芯片选型(BlueField、FPGA、DPU),到内部数据通路,再到板级组成(PCIe、DDR、SerDes)。
我个人觉得,理解硬件架构是开发卸载功能的第一步。你只有知道数据从哪里来、到哪里去、中间经过哪些处理单元,才能写出高效的卸载代码。
下一章,我们会深入软件栈,看看怎么在SmartNIC上开发网络卸载功能。到时候,我会带大家手写一个简单的包过滤卸载程序。
公众号:蓝海资料掘金营,微信deep3321