夜雨聆风学习资料网

ARTICLE · 1258220

PCIe设备---智能网卡系列之卸载方式

PCIe设备---智能网卡系列之卸载方式

 第三篇:智能网卡各种卸载模式实现方式

 一、为什么需要卸载

1.1 CPU的时间都花在哪了

假设你有一台100G带宽的服务器。100G是什么概念?一秒钟能传1.5亿个数据包。如果每个包都要CPU亲自来处理,会发生什么?

CPU要干这些活:

• 收到一个包 → 中断通知CPU → CPU放下手里的活来处理

• 内核协议栈拆包 → 去掉以太网头、IP头、TCP头

• 算校验和 → 检查数据有没有出错

• 内存拷贝 → 把数据从内核缓冲区搬到应用手里

• 如果是虚拟机,还要在虚拟交换机(OVS)里查流表、决定往哪转发

结果就是:CPU一大半时间都在给网卡打工,真正跑业务的时间少得可怜。就好比你请了个高级厨师,结果他大半时间在洗菜切菜,炒菜的时间反而少了。

图1:不开卸载 vs 开卸载 —— CPU时间分配的对比

1.2 卸载的本质

卸载(Offload)的思路很简单:把CPU不擅长的事交给擅长的人干。

• CPU擅长什么?跑复杂的业务逻辑,做判断,算AI模型

• CPU不擅长什么?搬运数据包、算校验和、给报文套外壳

• 网卡芯片擅长什么?就是上面CPU不擅长的那些活

所以卸载就是:让网卡芯片把数据包相关的杂活全包了,CPU专心跑业务。从基础网卡到智能网卡到DPU,卸载的程度越来越深,CPU越来越轻松。 

二、网络层卸载:TSO和LRO

网络层卸载是最基础的卸载功能,几乎所有现代网卡都支持。其中最有用的是TSO和LRO,一个管发送,一个管接收。

2.1 TSO(发送方向的大包切片)

TSO全称TCP Segmentation Offload,TCP分段卸载。要理解TSO,先得知道一个问题:以太网有个最大传输单元(MTU),一般是1500字节。也就是说,一个以太网帧最多只能装1500字节的数据。

但应用层的数据往往比1500字节大得多。比如一个64KB的文件块要发出去,就需要切成45个1.4KB左右的小包,每个小包还要加上TCP头、IP头、以太网头。

不开TSO:

CPU要亲自把64KB切成45个小包,每个包套上TCP/IP头,算好校验和,然后一个一个发给网卡。CPU要干45次切片、45次加报文头、45次算校验。

开了TSO:

CPU直接把64KB的大块数据丢给网卡,说:'帮我切一下发出去'。网卡芯片自动把数据切成45个小包,每片自动套上TCP/IP头,算好校验和,发出去。CPU只给了1个'工单',剩下的网卡全包。

2.2 LRO/GRO(接收方向的小包合并)

LRO(Large Receive Offload)和TSO反过来:收到一堆小包后,网卡自动把它们合并成一个大包,再交给协议栈。

比如对面发了45个1.4KB的小包过来。不开LRO的话,协议栈要处理45次中断,拆45次报文头。开了LRO后,网卡先把45个小包拼成一个64KB的大包,只产生1次中断,协议栈只处理1次。

GRO(Generic Receive Offload)是LRO的软件版本,在内核里做合并。LRO是硬件做的,更快。

图2:TSO(发送切片)和LRO(接收合并)

2.3 其他基础卸载

卸载功能

干什么的

省了CPU什么活

CSO

校验和卸载

IP/TCP/UDP校验和由网卡硬件算,CPU不用算

VLAN

VLAN标签处理

发送时自动加VLAN头,接收时自动去掉VLAN头

RSS

多队列分发

收到包后Hash分配到不同队列,多核并行处理

FDIR

流定向

按规则把特定流量定向到指定队列

Checksum

校验和验证

接收时网卡自动校验,错了直接丢弃

 三、隧道层卸载:VXLAN封装/解封装

3.1 VXLAN是什么

在云数据中心里,虚拟机之间要通信,但物理网络是共享的。为了区分不同租户的流量,就需要一种'隧道'技术——在虚拟机的原始数据包外面再套一层'外壳',就像俄罗斯套娃一样。

VXLAN就是最常用的隧道协议。它要在原始报文外面加上:外层MAC头(6字节)+ 外层IP头(20字节)+ UDP头(8字节)+ VXLAN头(8字节)= 总共多了50字节的外壳。

不做卸载:CPU要手动给每个包套外壳、拆外壳。100G网络下每秒上亿个包,CPU光套外壳就忙不过来了。

3.2 发送方向的封装

虚拟机发出一个数据包,网卡芯片收到后,根据预配置的流表规则,自动在包外面套上外层MAC头、外层IP头、UDP头和VXLAN头。套好后直接发出去。整个过程CPU不参与,虚拟机也不知道自己的包被套了壳。

3.3 接收方向的解封装

网卡收到一个带VXLAN外壳的包后,芯片自动识别:'哦,这是个VXLAN包'。然后去掉外层MAC头、IP头、UDP头、VXLAN头,还原出原始包,通过DMA直接放到目标虚拟机的内存里。虚拟机收到的就是一个干净的原始包,完全不知道外面曾经套过壳。

图3:VXLAN隧道卸载 —— 发送时套外壳,接收时去外壳

除了VXLAN,还有GRE、NVGRE、Geneve等隧道协议,原理类似,都是自动套壳/去壳。

四、协议层卸载:TOE和存储协议

4.1 TOE(TCP卸载引擎)

TOE全称TCP Offload Engine,TCP卸载引擎。这是比TSO/LRO更深一层的卸载——不只是切片合并,而是把整个TCP协议栈搬进网卡芯片。

TCP协议栈要干的事可不少:

• 三次握手建立连接、四次挥手断开连接

• 序列号管理、确认应答(ACK)

• 超时重传:包丢了要重发

• 拥塞控制:网络堵了要降速

• 流量控制:对方处理不过来要减速

不开TOE:

每条TCP连接的状态都由操作系统内核维护,CPU要处理每个连接的握手、重传、确认等。

开了TOE:

TCP连接的状态由网卡芯片维护。芯片内部有专门的硬件来处理TCP连接的建立、维护、断开的整个生命周期。CPU只需要在建立连接时告诉网卡:'这条连接卸载给你了',之后所有的TCP处理都由网卡芯片搞定。驱动通过QPC(Queue Pair Context)把连接上下文下发给芯片,芯片后续自主管理这条连接。

4.2 NVMe-oF和iSCSI

除了网络协议,存储协议也可以卸载。

协议

是什么

卸载了什么

NVMe-oF

NVMe over Fabrics 远程NVMe存储访问

NVMe命令的封装/解封装,     RDMA传输由网卡硬件完成

iSCSI

SCSI over TCP   通过TCP传SCSI命令

SCSI命令的TCP封装/解封装,   由网卡硬件完成CRC和数据处理

 这些协议卸载后,CPU不需要处理存储协议的细节,网卡芯片直接把远程存储的数据DMA到主机内存,就像本地磁盘一样。

五、交换层卸载:OVS和SR-IOV

5.1 OVS虚拟交换机硬件卸载

OVS(Open vSwitch)是云环境中最常用的虚拟交换机。每个虚拟机的网络流量都要经过OVS转发。

软件OVS的问题:

OVS跑在CPU上,每个包都要查流表、匹配规则、决定转发路径、修改报文头。VM越多,OVS越忙,CPU负担越重。而且数据包要在内核和OVS之间来回拷贝,延迟很高。

硬件OVS卸载:

网卡芯片里有专门的TCAM(三态内容可寻址存储器)来做流表匹配。驱动把OVS的流表规则下发到网卡的TCAM里。包到了网卡后,硬件直接查TCAM匹配规则,匹配上了就直接转发,不需要CPU参与。只有第一次见到的新流才上报给CPU处理(称为'miss'),之后网卡就记住规则了。

图4:OVS卸载 —— 从CPU软件转发到网卡硬件转发

5.2 SR-IOV硬件虚拟化

SR-IOV(Single Root I/O Virtualization)是另一种虚拟化方案。它让一块物理网卡虚拟出多个'虚拟功能'(VF),每个VF可以直接分配给一个虚拟机。

有了SR-IOV,虚拟机可以直接访问物理网卡硬件,绕过OVS,网络性能接近物理机。但缺点是VF数量有限(一般几十到几百个),而且VF之间的隔离和策略管理不如OVS灵活。

实践中,OVS卸载和SR-IOV经常配合使用:OVS管理控制面,VF处理数据面。 

六、安全层卸载:IPSec和TLS

网络安全越来越重要,加密/解密是很耗CPU的操作。网卡芯片可以内置加解密引擎来分担这个负担。

6.1 IPSec卸载

IPSec是网络层的安全协议,给数据包加密。加密算法(如AES-GCM)计算量很大,100G线速加密要消耗大量CPU。网卡里的安全引擎用硬件AES加速,CPU不用管加密解密的事。

6.2 TLS卸载

TLS是传输层的安全协议(就是HTTPS那个'S')。TLS握手和加解密同样耗CPU。智能网卡可以把TLS处理也卸载到芯片里,特别是TLS 1.3的硬件加速。

七、卸载模式全家桶

图5:智能网卡卸载模式全景图

总结一下,智能网卡的卸载模式可以按层级分为这么几类:

层级

卸载功能

一句话解释

网络层

TSO/LRO/CSO/VLAN

切片、合并、算校验、处理VLAN标签

隧道层

VXLAN/GRE/Geneve

自动套外壳/去外壳

协议层

TOE/RDMA/NVMe-oF/iSCSI

TCP连接管理、远程内存访问、远程存储

交换层

OVS卸载/SR-IOV/FDIR/RSS

虚拟交换机、硬件虚拟化、流定向

安全层

IPSec/TLS

硬件加解密

DPU全卸载

完整网络栈+安全+存储

ARM核跑独立OS,CPU 0负担

 从普通网卡到DPU,卸载的程度是逐步加深的:

• 普通网卡:只支持TSO/LRO/CSO/VLAN这些基础功能

• 智能网卡:加上VXLAN、TOE、OVS卸载、安全卸载

• DPU:完整的网络栈+安全+存储都卸载到卡上的ARM核和硬件引擎,Host CPU完全不管

一句话总结:卸载就是让专业的人干专业的活。CPU跑业务,网卡搬数据包。

八、卸载与RDMA的关系

8.1 殊途同归:两条不同的路

前面讲了卸载,第二篇讲了RDMA。很多人会问:这两者是什么关系?是 competing(竞争)还是 complementary(互补)?答案是:殊途同归,相辅相成。

两者的共同目标都是让CPU轻松,但走的路不一样:

卸载的路:仍然走TCP/IP协议栈,但把协议栈里的重活(切片、合并、封装、加密等)交给网卡硬件干。CPU还是参与流程,只是干的活少了。

RDMA的路:干脆不走TCP/IP协议栈了,直接内存到内存。CPU完全不参与数据传输,网卡硬件全包。

8.2 关键区别

卸载(Offload)

RDMA

协议栈

走TCP/IP协议栈

绕过TCP/IP协议栈

CPU参与

参与但少干活

完全不参与数据传输

延迟

毫秒级

微秒级

兼容性

好,普通应用无缝使用

需要应用改代码用Verbs API

适用场景

通用网络流量(Web/数据库/虚拟化)

AI训练/GPU互联/高性能计算

典型代表

TSO/LRO/VXLAN/TOE/OVS

RoCE v2 / InfiniBand

8.3 如何配合工作

在实际的数据中心里,卸载和RDMA不是二选一,而是配合使用的:

• 普通业务流量走卸载通道:Web服务、数据库同步、虚拟化网络等通用流量,用TSO/LRO/VXLAN/TOE等卸载功能,减少CPU负担,同时保持TCP/IP的兼容性。

• AI训练/GPU互联走RDMA通道:多GPU分布式训练中,各节点之间要频繁交换梯度参数,数据量大、延迟要求极高。这种场景用RDMA(RoCE v2),零拷贝+内核旁路,延迟降到微秒级。

• 同一张网卡同时支持两种模式:比如NVIDIA ConnectX-6/7系列,既能跑RoCE RDMA,也支持TSO/LRO/VXLAN/TOE等各种卸载。不同流量走不同通道,互不干扰。

• DPU级别的融合:到了DPU这一代,网卡芯片里既有RoCE引擎(处理RDMA),也有VSW/OVS引擎(处理虚拟交换),还有TOE引擎(处理TCP),还有加解密引擎。所有路径都在一颗芯片里完成,Host CPU彻底解放。

8.4 一个形象的比喻

把数据中心网络比作一个物流系统:

• 卸载 = 给快递公司的货车装上自动分拣机。包裹还是走快递流程,但分拣、打包这些杂活机器干了,人只需要最后签收。

• RDMA = 建了一条"直通车"专线。重要货物不走快递流程,直接从A仓库运到B仓库,中间不经过任何分拣中心。

• 两者配合 = 普通包裹走快递(卸载),重要急件走直通车(RDMA),同一个物流中心两种通道都有。

图6:卸载与RDMA的对比与配合

相关学习资料