TL;DR
- 智能网卡(SmartNIC)= 带"大脑"的网卡,能在卡上直接完成网络、存储、安全等处理,把 CPU 解放出来跑业务。
- 典型卸载能力包括 OVS 流表加速、VXLAN/Geneve 隧道封装、TCP/IP 协议栈卸载、RoCE/RDMA、IPsec/TLS 加解密、NVMe over TCP 等。
- 主流实现路线有三条:FPGA(灵活可重配)、多核 ARM SoC(软件生态好)、专用 ASIC(性能功耗最优但功能固化)。
- 内部数据面遵循 P4 的 Parser → Match-Action → Deparser 三段式流水线,FPGA 上可做到每周期一个包,实现线速卸载。
目录
- [1. 对比传统网卡 vs 智能网卡](#1. 对比传统网卡 vs 智能网卡)
- [2. 智能网卡能"智能"地做什么?](#2. 智能网卡能“智能”地做什么?)
- [3. FPGA 在智能网卡中的角色](#3. FPGA 在智能网卡中的角色)
- [三种实现方案对比:FPGA、多核 ARM SoC、专用 ASIC](#三种实现方案对比:FPGA、多核 ARM SoC、专用 ASIC)
- 智能网卡内部数据包处理流水线
- [4. 为什么需要智能网卡?](#4. 为什么需要智能网卡?)
- [一个量化对比:100Gbps + OVS 场景](#一个量化对比:100Gbps + OVS 场景)
- 总结一句话
- 参考资料
智能网卡(SmartNIC),简单说就是:一颗带有"大脑"的网卡。
通过网盘分享的文件:FPGA课程
链接: https://pan.baidu.com/s/1pIFS8GEYu_jH1np4ZLG2Kw?pwd=wbbw 提取码: wbbw FPGA汇总课程,整理不易,尽快保存
传统网卡只负责把数据包从网络线缆搬到主机内存(或反向),而智能网卡在这个基础上,自己就能处理一部分网络、存储甚至安全相关的任务,不需要麻烦主机的 CPU。
-
对比传统网卡 vs 智能网卡
特性 传统网卡(标准 NIC) 智能网卡(SmartNIC)
主要任务 收发数据包、简单的 DMA 收发 + 卸载(offload)复杂处理
对 CPU 的依赖 高(协议栈、流表、隧道封装等由 CPU 做) 低(网卡自己处理很多任务)
典型硬件 固定功能的 ASIC FPGA 或多核 ARM 或专用 NPU
灵活性 几乎为零 可编程、可升级
你可以把 CPU 想象成公司的总经理,传统网卡就是一个"快递员"------只管送件,送到之后总经理要亲自拆包、分类、回复。智能网卡则是一个"能干的助理",在门口就把包裹分类、过滤、甚至直接回复一部分,只有重要或复杂的事情才交给总经理。
-
智能网卡能"智能"地做什么?
常见卸载任务包括:
OVS(Open vSwitch)加速:在云计算里,虚拟机之间的虚拟交换机规则(如流表)直接由网卡硬件执行,不再消耗 CPU 核心。
隧道协议处理:VXLAN、Geneve 等隧道封装/解封装,智能网卡自己完成。
TCP/IP 协议栈卸载:甚至能把整个 TCP 连接的处理(重传、窗口管理等)搬到网卡上。
RoCE/RDMA:实现零拷贝、CPU 旁路的高性能网络通信。
网络安全:在网卡上做硬件防火墙、IPsec/TLS 加解密。
存储协议加速:NVMe over TCP、iSCSI 等,由网卡完成协议解析和数据布局。
- FPGA 在智能网卡中的角色
这正是与之前讨论的"FPGA 实现以太网"一脉相承的地方。
FPGA 是实现智能网卡最主流的技术之一(另外还有基于 ARM 的 SoC 或专用 ASIC)。
因为 FPGA 可编程且并行处理能力极强,可以:
以线速(如 100Gbps)处理每个数据包。
如果需要系统学习FPGA,这里有一份整理的FPGA汇总课程资料,包含BD教程、Vivado教程、IP 核教程等,有需要的朋友可以保存:链接: https://pan.baidu.com/s/1pIFS8GEYu_jH1np4ZLG2Kw?pwd=wbbw 提取码: wbbw 整理不易,尽快保存
动态加载不同的处理逻辑(比如今天做 OVS,明天刷一个 NVMe over TCP 的固件)。
实现硬件级的 TCAM 查找、哈希表、正则匹配等。
很多商用智能网卡(如 Xilinx/AMD Alveo、Intel FPGA 系列、NVIDIA BlueField 中的一部分加速逻辑)内部就包含了大规模 FPGA 芯片。
三种实现方案对比:FPGA、多核 ARM SoC、专用 ASIC
同样是智能网卡,底层实现路线差别很大。下面从可编程性、性能、功耗、开发周期、典型产品五个维度做个横向对比:
| 维度 | FPGA | 多核 ARM SoC | 专用 ASIC |
|---|---|---|---|
| 可编程性 | 高,硬件逻辑可重配,支持 P4/自定义流水线,可现场升级 | 中高,软件可编程,C/C++/DPDK 生态成熟,但数据面受核数与主频限制 | 低,功能出厂固化,只能通过固件参数微调 |
| 性能 | 高,流水线级联可线速处理 100Gbps~400Gbps,时延确定 | 中,多核并行处理,通常 25G~100Gbps,小包场景易受核数瓶颈 | 最高,单芯片可做到 400Gbps 以上,功耗性能比最优 |
| 功耗 | 较高,大规模逻辑 + 高速 SerDes,典型 25~75W | 中等,典型 15~35W | 最低,典型 10~25W |
| 开发周期 | 长,RTL 开发 + 时序收敛 + 板级调试,通常 6~18 个月 | 中,软件栈开发为主,通常 3~9 个月 | 最长,流片成本高,通常 18~36 个月且需千万级投入 |
| 典型产品 | Xilinx/AMD Alveo U25/U55C、Intel FPGA 加速卡、Napatech 系列 | NVIDIA BlueField-2/3、Marvell OCTEON、Amazon Nitro(部分) | NVIDIA ConnectX 系列、Broadcom Stingray、Intel E810 |
怎么选?
- 要灵活、要快速验证新协议:选 FPGA。OVS 流表、自定义隧道、新的安全卸载逻辑都能通过重配 bitstream 迭代,适合云厂商自研和科研验证场景,代价是功耗和开发人力投入偏高。
- 要跑完整软件栈、要独立 CPU 做控制面:选多核 ARM SoC。它本质上是"网卡里塞了一台小服务器",可以直接跑 Linux、容器化卸载程序,开发门槛最低,适合需要把存储、安全、虚拟化整套服务下沉到网卡的场景。
- 要极致性能、大规模出货:选专用 ASIC。功能一旦定型,ASIC 在功耗、成本、时延上全面占优,是成熟商用网卡的主流选择,但前期流片投入大、功能改不动。
把上面的三条路径画成一张决策流程图,按「功能是否频繁变化 → 是否需要独立 CPU 跑软件栈 → 出货量/功耗预算」逐层判断:
#mermaid-svg-PYHp10XkNZafVumG{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PYHp10XkNZafVumG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PYHp10XkNZafVumG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PYHp10XkNZafVumG .error-icon{fill:#552222;}#mermaid-svg-PYHp10XkNZafVumG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PYHp10XkNZafVumG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PYHp10XkNZafVumG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PYHp10XkNZafVumG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PYHp10XkNZafVumG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PYHp10XkNZafVumG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PYHp10XkNZafVumG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PYHp10XkNZafVumG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PYHp10XkNZafVumG .marker.cross{stroke:#333333;}#mermaid-svg-PYHp10XkNZafVumG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PYHp10XkNZafVumG p{margin:0;}#mermaid-svg-PYHp10XkNZafVumG .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PYHp10XkNZafVumG .cluster-label text{fill:#333;}#mermaid-svg-PYHp10XkNZafVumG .cluster-label span{color:#333;}#mermaid-svg-PYHp10XkNZafVumG .cluster-label span p{background-color:transparent;}#mermaid-svg-PYHp10XkNZafVumG .label text,#mermaid-svg-PYHp10XkNZafVumG span{fill:#333;color:#333;}#mermaid-svg-PYHp10XkNZafVumG .node rect,#mermaid-svg-PYHp10XkNZafVumG .node circle,#mermaid-svg-PYHp10XkNZafVumG .node ellipse,#mermaid-svg-PYHp10XkNZafVumG .node polygon,#mermaid-svg-PYHp10XkNZafVumG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PYHp10XkNZafVumG .rough-node .label text,#mermaid-svg-PYHp10XkNZafVumG .node .label text,#mermaid-svg-PYHp10XkNZafVumG .image-shape .label,#mermaid-svg-PYHp10XkNZafVumG .icon-shape .label{text-anchor:middle;}#mermaid-svg-PYHp10XkNZafVumG .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PYHp10XkNZafVumG .rough-node .label,#mermaid-svg-PYHp10XkNZafVumG .node .label,#mermaid-svg-PYHp10XkNZafVumG .image-shape .label,#mermaid-svg-PYHp10XkNZafVumG .icon-shape .label{text-align:center;}#mermaid-svg-PYHp10XkNZafVumG .node.clickable{cursor:pointer;}#mermaid-svg-PYHp10XkNZafVumG .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PYHp10XkNZafVumG .arrowheadPath{fill:#333333;}#mermaid-svg-PYHp10XkNZafVumG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PYHp10XkNZafVumG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PYHp10XkNZafVumG .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PYHp10XkNZafVumG .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PYHp10XkNZafVumG .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PYHp10XkNZafVumG .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PYHp10XkNZafVumG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PYHp10XkNZafVumG .cluster text{fill:#333;}#mermaid-svg-PYHp10XkNZafVumG .cluster span{color:#333;}#mermaid-svg-PYHp10XkNZafVumG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PYHp10XkNZafVumG .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PYHp10XkNZafVumG rect.text{fill:none;stroke-width:0;}#mermaid-svg-PYHp10XkNZafVumG .icon-shape,#mermaid-svg-PYHp10XkNZafVumG .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PYHp10XkNZafVumG .icon-shape p,#mermaid-svg-PYHp10XkNZafVumG .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PYHp10XkNZafVumG .icon-shape .label rect,#mermaid-svg-PYHp10XkNZafVumG .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PYHp10XkNZafVumG .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PYHp10XkNZafVumG .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PYHp10XkNZafVumG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
是
否
开始选型
功能是否频繁变化?
新协议/新卸载逻辑需现场升级
FPGA
可重配 bitstream,快速迭代
是否需要独立 CPU
跑完整软件栈?
多核 ARM SoC
卡内跑 Linux/容器化卸载
出货量大且功耗预算紧?
专用 ASIC
性能功耗最优,功能固化
先用 FPGA 或 ARM SoC 验证
量起来后再转 ASIC
读图说明:先看功能会不会变,会变就选 FPGA;功能稳定但要在卡上跑软件栈,选多核 ARM SoC;两者都不需要、且出货量大、功耗预算紧,才值得投入流片做专用 ASIC。中间态可先用 FPGA/SoC 验证,量起来再转 ASIC。
实际产品里三者经常混用:BlueField 是 ARM SoC + 部分加速逻辑,Alveo 是纯 FPGA,ConnectX 是 ASIC 加可编程的 eSwitch 模块。选型时先明确"功能会不会变、量有多大、功耗预算多少",答案基本就出来了。
智能网卡内部数据包处理流水线
智能网卡之所以能"自己处理"数据包,靠的是一条高度流水化的硬件处理链路。业界最典型的抽象是 P4 语言定义的 Parser → Match-Action → Deparser 三段式模型,FPGA 上的实现基本都遵循这个骨架。
Parser(解析器)
数据包从 MAC 进来后,先由解析器逐层"剥洋葱":以太网头 → VLAN → IPv4/IPv6 → TCP/UDP → 应用层协议头。解析器把每个字段按预定义的协议图(Parser Graph)提取出来,写入一个统一的元数据(metadata)结构,供后续阶段使用。FPGA 上的解析器通常用状态机实现,多个包可以并行解析,因此能跟上 100 Gbps 甚至更高的线速。
Match-Action(匹配-动作)
这是流水线的"大脑"。它拿解析出的字段(五元组、VLAN ID、隧道 VNI 等)去查表------可能是精确匹配的哈希表,也可能是支持通配的 TCAM。命中某条表项后,就执行对应的动作:转发到某个端口、丢弃、修改报文头(比如做 NAT、封装 VXLAN)、计数统计,或者把包送到控制平面。多级 Match-Action 串联起来,就构成了完整的流表处理逻辑,OVS 加速本质上就是把 OpenFlow 流表映射到这一层。
Deparser(重组器)
处理完成后,报文头可能已经被改得面目全非(字段被改写、新头部被插入)。Deparser 负责按新的元数据把各层协议头重新序列化拼装成合法的字节流,再交给 MAC 发送出去。它和 Parser 是镜像关系:Parser 拆,Deparser 装。
整条流水线在 FPGA 上以流水线级联的方式实现,每个时钟周期都能吞吐一个新包,这就是智能网卡能做到"线速卸载"的根本原因。
如果需要系统学习FPGA,这里有一份整理的FPGA汇总课程资料,包含BD教程、Vivado教程、IP 核教程等,有需要的朋友可以保存:链接: https://pan.baidu.com/s/1pIFS8GEYu_jH1np4ZLG2Kw?pwd=wbbw 提取码: wbbw 整理不易,尽快保存
#mermaid-svg-1laO8xnwnZ1j0ofz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1laO8xnwnZ1j0ofz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1laO8xnwnZ1j0ofz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1laO8xnwnZ1j0ofz .error-icon{fill:#552222;}#mermaid-svg-1laO8xnwnZ1j0ofz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1laO8xnwnZ1j0ofz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1laO8xnwnZ1j0ofz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1laO8xnwnZ1j0ofz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1laO8xnwnZ1j0ofz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1laO8xnwnZ1j0ofz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1laO8xnwnZ1j0ofz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1laO8xnwnZ1j0ofz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1laO8xnwnZ1j0ofz .marker.cross{stroke:#333333;}#mermaid-svg-1laO8xnwnZ1j0ofz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1laO8xnwnZ1j0ofz p{margin:0;}#mermaid-svg-1laO8xnwnZ1j0ofz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1laO8xnwnZ1j0ofz .cluster-label text{fill:#333;}#mermaid-svg-1laO8xnwnZ1j0ofz .cluster-label span{color:#333;}#mermaid-svg-1laO8xnwnZ1j0ofz .cluster-label span p{background-color:transparent;}#mermaid-svg-1laO8xnwnZ1j0ofz .label text,#mermaid-svg-1laO8xnwnZ1j0ofz span{fill:#333;color:#333;}#mermaid-svg-1laO8xnwnZ1j0ofz .node rect,#mermaid-svg-1laO8xnwnZ1j0ofz .node circle,#mermaid-svg-1laO8xnwnZ1j0ofz .node ellipse,#mermaid-svg-1laO8xnwnZ1j0ofz .node polygon,#mermaid-svg-1laO8xnwnZ1j0ofz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1laO8xnwnZ1j0ofz .rough-node .label text,#mermaid-svg-1laO8xnwnZ1j0ofz .node .label text,#mermaid-svg-1laO8xnwnZ1j0ofz .image-shape .label,#mermaid-svg-1laO8xnwnZ1j0ofz .icon-shape .label{text-anchor:middle;}#mermaid-svg-1laO8xnwnZ1j0ofz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1laO8xnwnZ1j0ofz .rough-node .label,#mermaid-svg-1laO8xnwnZ1j0ofz .node .label,#mermaid-svg-1laO8xnwnZ1j0ofz .image-shape .label,#mermaid-svg-1laO8xnwnZ1j0ofz .icon-shape .label{text-align:center;}#mermaid-svg-1laO8xnwnZ1j0ofz .node.clickable{cursor:pointer;}#mermaid-svg-1laO8xnwnZ1j0ofz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1laO8xnwnZ1j0ofz .arrowheadPath{fill:#333333;}#mermaid-svg-1laO8xnwnZ1j0ofz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1laO8xnwnZ1j0ofz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1laO8xnwnZ1j0ofz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1laO8xnwnZ1j0ofz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1laO8xnwnZ1j0ofz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1laO8xnwnZ1j0ofz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1laO8xnwnZ1j0ofz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1laO8xnwnZ1j0ofz .cluster text{fill:#333;}#mermaid-svg-1laO8xnwnZ1j0ofz .cluster span{color:#333;}#mermaid-svg-1laO8xnwnZ1j0ofz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1laO8xnwnZ1j0ofz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1laO8xnwnZ1j0ofz rect.text{fill:none;stroke-width:0;}#mermaid-svg-1laO8xnwnZ1j0ofz .icon-shape,#mermaid-svg-1laO8xnwnZ1j0ofz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1laO8xnwnZ1j0ofz .icon-shape p,#mermaid-svg-1laO8xnwnZ1j0ofz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1laO8xnwnZ1j0ofz .icon-shape .label rect,#mermaid-svg-1laO8xnwnZ1j0ofz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1laO8xnwnZ1j0ofz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1laO8xnwnZ1j0ofz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1laO8xnwnZ1j0ofz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 命中
未命中
数据包进入 MAC
Parser 解析器
逐层提取协议头字段
元数据 metadata
Match-Action 匹配-动作
查表 + 执行动作
是否命中流表
执行动作
转发/丢弃/改写/封装
上送控制平面
Deparser 重组器
重新序列化协议头
数据包发出 MAC
- 为什么需要智能网卡?
现代数据中心服务器 CPU 性能增长趋缓,而网络带宽从 10G → 25G → 100G → 400G 飙升。如果所有网络处理都靠 CPU,可能会吃掉 30%~50% 的 CPU 核心。用智能网卡把这些开销卸载下来,让 CPU 专心跑业务应用,这是云服务商(AWS、Azure、阿里云)大规模采用智能网卡的根本原因。
一个量化对比:100Gbps + OVS 场景
光说"吃掉 CPU"不够直观,下面用一组典型数据做对比。假设单台服务器配一块 100Gbps 网卡,跑 OVS 虚拟交换,虚拟机之间以 64B~1500B 混合小包为主,流量接近线速。
| 场景 | CPU 占用 | 吞吐 | 延迟 |
|---|---|---|---|
| 传统网卡 + 内核 OVS(软件转发) | 8~16 个物理核(约 2~4 个 NUMA 节点被打满) | 约 30~50Gbps 后开始丢包 | 单跳约 30~80μs,抖动明显 |
| 智能网卡卸载 OVS(硬件流表) | 1~2 个核(仅控制面与慢路径) | 稳定接近 100Gbps 线速 | 单跳约 5~15μs,抖动小 |
把两条路径并排画出来,差异一目了然:
#mermaid-svg-lU8dYoDLDrNqGlJN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lU8dYoDLDrNqGlJN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lU8dYoDLDrNqGlJN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lU8dYoDLDrNqGlJN .error-icon{fill:#552222;}#mermaid-svg-lU8dYoDLDrNqGlJN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lU8dYoDLDrNqGlJN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lU8dYoDLDrNqGlJN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lU8dYoDLDrNqGlJN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lU8dYoDLDrNqGlJN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lU8dYoDLDrNqGlJN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lU8dYoDLDrNqGlJN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lU8dYoDLDrNqGlJN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lU8dYoDLDrNqGlJN .marker.cross{stroke:#333333;}#mermaid-svg-lU8dYoDLDrNqGlJN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lU8dYoDLDrNqGlJN p{margin:0;}#mermaid-svg-lU8dYoDLDrNqGlJN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lU8dYoDLDrNqGlJN .cluster-label text{fill:#333;}#mermaid-svg-lU8dYoDLDrNqGlJN .cluster-label span{color:#333;}#mermaid-svg-lU8dYoDLDrNqGlJN .cluster-label span p{background-color:transparent;}#mermaid-svg-lU8dYoDLDrNqGlJN .label text,#mermaid-svg-lU8dYoDLDrNqGlJN span{fill:#333;color:#333;}#mermaid-svg-lU8dYoDLDrNqGlJN .node rect,#mermaid-svg-lU8dYoDLDrNqGlJN .node circle,#mermaid-svg-lU8dYoDLDrNqGlJN .node ellipse,#mermaid-svg-lU8dYoDLDrNqGlJN .node polygon,#mermaid-svg-lU8dYoDLDrNqGlJN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lU8dYoDLDrNqGlJN .rough-node .label text,#mermaid-svg-lU8dYoDLDrNqGlJN .node .label text,#mermaid-svg-lU8dYoDLDrNqGlJN .image-shape .label,#mermaid-svg-lU8dYoDLDrNqGlJN .icon-shape .label{text-anchor:middle;}#mermaid-svg-lU8dYoDLDrNqGlJN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lU8dYoDLDrNqGlJN .rough-node .label,#mermaid-svg-lU8dYoDLDrNqGlJN .node .label,#mermaid-svg-lU8dYoDLDrNqGlJN .image-shape .label,#mermaid-svg-lU8dYoDLDrNqGlJN .icon-shape .label{text-align:center;}#mermaid-svg-lU8dYoDLDrNqGlJN .node.clickable{cursor:pointer;}#mermaid-svg-lU8dYoDLDrNqGlJN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lU8dYoDLDrNqGlJN .arrowheadPath{fill:#333333;}#mermaid-svg-lU8dYoDLDrNqGlJN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lU8dYoDLDrNqGlJN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lU8dYoDLDrNqGlJN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lU8dYoDLDrNqGlJN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lU8dYoDLDrNqGlJN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lU8dYoDLDrNqGlJN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lU8dYoDLDrNqGlJN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lU8dYoDLDrNqGlJN .cluster text{fill:#333;}#mermaid-svg-lU8dYoDLDrNqGlJN .cluster span{color:#333;}#mermaid-svg-lU8dYoDLDrNqGlJN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lU8dYoDLDrNqGlJN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lU8dYoDLDrNqGlJN rect.text{fill:none;stroke-width:0;}#mermaid-svg-lU8dYoDLDrNqGlJN .icon-shape,#mermaid-svg-lU8dYoDLDrNqGlJN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lU8dYoDLDrNqGlJN .icon-shape p,#mermaid-svg-lU8dYoDLDrNqGlJN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lU8dYoDLDrNqGlJN .icon-shape .label rect,#mermaid-svg-lU8dYoDLDrNqGlJN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lU8dYoDLDrNqGlJN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lU8dYoDLDrNqGlJN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lU8dYoDLDrNqGlJN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 智能网卡:硬件卸载路径
报文到达网卡
卡内 Parser 解析
Match-Action 查流表
硬件流水线
Deparser 重组
直接转发
报文不进主机内存
CPU 占用 1~2 核
延迟 5~15μs
传统网卡:软件转发路径
报文到达网卡
DMA 写入主机内存
skb 分配
内核协议栈处理
中断 + 上下文切换
OVS 流表查找
vhost 拷贝
再次拷贝回用户态/虚拟机
CPU 占用 8~16 核
延迟 30~80μs
读图说明:左侧软件路径每个包都要在主机内存里来回拷贝、走内核协议栈,CPU 核心被大量占用、延迟高且抖动大;右侧硬件卸载路径把解析、查表、改写全部放在网卡流水线内完成,报文不落主机内存,CPU 只保留控制面,因此核心占用和延迟都低一个量级。
这些数字是怎么来的?
- CPU 占用:软件 OVS 每个数据包都要走一遍内核协议栈、skb 分配、流表查找和 vhost 拷贝,单核处理小包的极限大约在 2~5Mpps。100Gbps 在 64B 小包下约 148Mpps,即使按混合包型折算也需要十几核才能扛住,因此 8~16 核是常见实测区间。卸载后数据面完全在网卡内完成,主机只剩控制面下发流表、处理未命中报文,1~2 核足够。
- 吞吐:软件转发受限于单核 pps 和内存带宽,通常在 30~50Gbps 出现拐点;硬件流水线每个时钟周期处理一个包,可以稳定跑满 100Gbps。
- 延迟:软件路径包含中断、上下文切换、多次内存拷贝,单跳几十微秒很正常;硬件卸载后报文不进主机内存,只做流水线级处理,延迟降到个位数到十几微秒。
需要说明的是,以上是量级参考值,实际结果会随包长分布、流表规模、CPU 型号(主频、是否开启 DDIO)、NUMA 亲和性配置以及网卡固件版本而明显波动。真实选型时建议用 TRex 或 pktgen 打流,在自己的业务流量模型下实测,而不是直接套用表格里的数字。
总结一句话
智能网卡 = 可编程的、能独立处理网络/存储/安全任务的高性能网卡,通常基于 FPGA 或多核处理器,用于卸载 CPU 的网络负担,加速数据中心网络。
如果需要系统学习FPGA,这里有一份整理的FPGA汇总课程资料,包含BD教程、Vivado教程、IP 核教程等,有需要的朋友可以保存:链接: https://pan.baidu.com/s/1pIFS8GEYu_jH1np4ZLG2Kw?pwd=wbbw 提取码: wbbw 整理不易,尽快保存
参考资料
- P4 语言规范(P4 Language Specification,P4 Language Consortium):https://p4.org/specs/
- P4 官方教程与示例仓库:https://github.com/p4lang/tutorials
- Open vSwitch 官方文档(含硬件卸载 / HW Offload 说明):https://docs.openvswitch.org/
- OVS 硬件卸载设计文档(ovs-fields / DPDK HW Offload):https://docs.openvswitch.org/en/latest/howto/dpdk/
- DPDK 官方文档(用户态数据面与卸载相关能力):https://doc.dpdk.org/guides/
- AMD/Xilinx Alveo 智能网卡产品页(Alveo U25 等):https://www.xilinx.com/products/boards-and-kits/alveo.html
- NVIDIA BlueField DPU 官方产品页:https://www.nvidia.com/en-us/networking/products/data-processing-unit/
- NVIDIA ConnectX 网卡产品页:https://www.nvidia.com/en-us/networking/ethernet-adapters/
如果需要系统学习FPGA,这里有一份整理的FPGA汇总课程资料,包含BD教程、Vivado教程、IP 核教程等,有需要的朋友可以保存:链接: https://pan.baidu.com/s/1pIFS8GEYu_jH1np4ZLG2Kw?pwd=wbbw 提取码: wbbw 整理不易,尽快保存
通过网盘分享的文件:FPGA 课程
链接: https://pan.baidu.com/s/1pIFS8GEYu_jH1np4ZLG2Kw?pwd=wbbw 提取码: wbbw FPGA 汇总课程,整理不易,尽快保存
回到你之前的问题脉络:FPGA 实现普通以太网是基础,而用 FPGA 做一个"能自己处理协议和流表"的网卡,就迈入了智能网卡的领域。如果你有兴趣,我可以进一步解释智能网卡内部一个典型的数据包处理流水线是怎么工作的。