硬件加速与功能卸载
与软件实现相比,同样的功能如果硬件来做,可以减少CPU的开销。通常硬件能力强,具有高并发处理特点,有助于大幅提高系统吞吐率与减少时延。
硬件加速实现在哪里?可以实现在通用CPU上,也可以实现在芯片组,还可以实现在各种接口卡上。和网络数据最直接的接口是网卡,在网卡上进行网络数据卸载是主要思路。
硬件的缺点在于资源局限,功能固化,一旦设计发布完成,再对功能进行改变就变得非常困难。且硬件的设计与发布时间长,更新周期无法与软件相比。
硬件卸载简介
硬件提供越来越多的功能,从以太网,IP数据报文头部的校验和计算、加解密等功能,发展到对高级协议的分析处理,可以预期,未来硬件直接提供的功能将会占据越来越大的比重。
对于数据中心服务器,需要处理来自网络中的数据包,解析网络协议,早起受芯片技术限制,网卡功能简单,大量依赖服务器的CPU来处理网络协议,服务器的处理能力被消耗在这些处理任务上。随着半导体技术的飞速发展,处理器有越来越强的运算能力,能容纳承载更多的应用,接纳更多的网络数据包构建互联网应用。服务器需要处理来自网络中的大量数据包。同样的半导体技术进步也体现在网卡上,已经可以看到今年来万兆网络在服务器中的大量使用。
对于专用网络,为了提高处理数据包的速度,数据面和控制面分离是一项常用的技术。简单来说,就是复杂的数据包进入控制面,进行复杂的控制处理;而在数据面留下简单且类似的包处理,比如:
- 查表(路由表,访问控制,ARP,调度队列)
- 报文校验与头部修改(以太网,IP,隧道报文)
- 复杂运算(加解密与压缩算法)
基于专门设计的硬件,快速执行数据包的转发和一些简单的报文修改处理可以有效提高数据吞吐量和降低发送时延。
在网络功能节点的设计上,数据面的处理此前大多是用于专们的硬件(网络处理器,FPGA,ASIC)来处理这些比较耗时的功能,以提高处理效率。
硬件卸载功能分为计算及更新、分片、组包三大类。
网卡硬件卸载功能
通过选取四种Intel网卡(i350、82599、x550、xl710)进行介绍,提供一个网卡的硬件卸载功能发展脉络。
i350是1G的网卡,82599和x550是10G的网卡,xl710是10/40G的网卡。
下表展现了各种网卡支持的硬件卸载的功能。
i350 | 82599 | x550 | xl710 | ||
计算及更新 | VLAN | ✓ | ✓ | ✓ | ✓ |
Double VLAN | ✓ | ✓ | ✓ | ✓ | |
IEEE588 | ✓ | ✓ | ✓ | ✓ | |
IP/TCP/UDP/SCTP的Checksum Offload | ✓ | ✓ | ✓ | ✓ | |
VXLAN & NVGRE Support | ✓ | ||||
分片 | TCP Segmentation Offload | ✓ | ✓ | ✓ | ✓ |
组包 | RSC | ✓ |
从表中可以看出,每种硬件支持的功能都是类似的,这表明很有有效实用的硬件卸载功能是会在新的各种网卡上继承下来,同时,新的硬件卸载功能也逐步被丰富。
DPDK软件接口
网卡的硬件卸载功能可能是基于端口设置,也有可能是基于每个包处理设置使能,需仔细区分。在包细粒度而言,每个包都对应一个或多个Mbuf,DPDK软件利用rte_mbuf数据结构里的64位标识(ol_flags)来表征卸载与状态,ol_flags的解码信息具体如下:
接收侧:
DPDK软件接口提供的硬件卸载功能(接收侧)
ol_flags解码信息 | 功能解释 |
PKT_RX_VLAN_PKT | 接收包带有VLAN信息,VALN标识被剥离到Mbuf中 |
PKT_RX_RSS_HASH | 接收包带有RSS的哈希运算结果在Mbuf中 |
PKT_RX_FDIR | 接收包带有FDIR的信息,在Mbuf中 |
PKT_RX_L4_CKSUM_BAD PKT_RX_IP_CKSUM_BAD | 接收侧进行了checksum检查,报文正确性在此处显示 |
PKT_RX_IEEE1588_PTP PKT_RX_IEEE1588_TMST | IEEE1588卸载 |
发送侧:
DPDK软件接口提供的硬件卸载功能(发送侧)
ol_flags解码信息 | 功能解释 |
PKT_TX_VLAN_PKT | 发送时插入VLAN标识,VLAN标识已经在Mbuf中 |
PKT_TX_IP_VLAN_CKSUM PKT_TX_TCP_CKSUM PKT_TX_SCTP_CKSUM PKT_TX_UDP_CKSUM PKT_TX_OUTER_IP_CKSUM PKT_TX_TCP_SEG PKT_TX_IPV4 PKT_TX_IPV6 PKT_TX_OUTER_IPV4 PKT_TX_OUTER_IP6 | 发送时进行checksum计算,插入协议头部的Checksum字段。这些标志可以用在TSO,VXLAN/NVGRE协议的场景下 |
PKT_TX_IEEE1588_PTP | IEEE1588卸载 |
硬件与软件功能实现
硬件卸载功能是将某些功能下移到硬件实现,这些功能原先一般是由软件承担的。
如果需要使用硬件卸载功能,网卡驱动需要提供相应的API给上层应用,通过调用API驱动硬件完成相应的工作。而驱动硬件的工作实际上是由网卡驱动程序完成的,网卡驱动程序也是通过硬件提供的接口来驱动硬件。硬件提供的接口一般包括寄存器(Register)和描述符(Descriptor)。寄存器是全局的设置,一般用于开启某项功能或为某项功能设置全局性的参数配置,一般情况下是基于以太网端口为基本单位。描述符可以看做是每个数据包的属性,和数据包一起发送给硬件,一般用于携带单个数据包的参数或设置。这两种接口提供的一粗一细两种粒度可以有效合作,完成硬件卸载功能的设置。
计算及更新功能卸载
VLAN硬件卸载
VLAN虽然只有4个字节,但是可以实现以太网中逻辑网络隔离功能,在数据中心、企业网络及宽带接入中被广泛应用。典型网络处理中,需要对报文的VLAN Tag进行识别,判断有无(检测0x8100),读取剥离,识别转发,以及发送插入。
VLAN在以太网报文中增加了一个4字节的802.1q Tag(也称为VLAN Tag),VLAN Tag的插入可以完全由软件完成。如果有软件完成VLAN Tag 的插入将会给CPU带来额外的负荷,涉及一次额外的内存拷贝(报文内容复制),最坏场景下,可能是上百周期的开销。大多数网卡硬件提供了VLAN卸载的功能,VLAN Tag的插入和剥离由网卡硬件完成,可以减轻服务器CPU的负荷。
1.收包时VLAN Tag的过滤
VLAN定义了虚拟网络,只有属于相同VLAN的报文,才需要被进一步处理,不属于VLAN的报文会被直接丢弃,因此网卡最典型的卸载功能之一就是在接收侧针对VLAN进行包过滤。典型的实现就是在网卡硬件端口设计了VLAN过滤表,无法在过滤表中匹配的VLAN包会被丢弃,没有VLAN信息的以太网则会通过网卡的过滤机制。在DPDK中app/testpmd提供了测试命令和代码。
2.收包时VLAN Tag的剥离
网卡硬件能够对接收到的包的VLAN Tag进行剥离。首先硬件能够对VLAN包进行识别,原理上是预判以太帧的以太网类型来确定是否是VLAN包。启动这项硬件特性,需要在网卡端口,或者是输入这个网卡端口的队列上设置使能标志,将VLAN剥离特性打开,对应到软件,是驱动写配置入相应的寄存器。网卡会从此寄存器中提取配置信息,用于判断是否对收到的以太网数据执行VLAN剥离。
网卡硬件将4字节的VLAN Tag从数据包中剥离,VLAN Tag中包含的信息对上层应用是有意义的,不能丢弃,此时网卡硬件会在硬件描述符中设置两个域,将需要的信息通知驱动软件,包含次包是否被剥离了VLAN Tag以及被剥离的Tag。软件省去了剥离VLAN Tag的工作负载,还获取了需要的信息。
3.发包时VLAN Tag的插入
在发送端插入VLAN在数据包中,是报文处理的常见操作。VLAN Tag由两部分组成:TPID,也就是VLAN的Ether type,和TCI(Tag Control Information)。TPID是一个固定值,作为一个全局范围内起作用的值,可通过寄存器进行设置。而TCI是每个包相关的,需要逐包设置,在DPDK中,在调用发送函数前,必须提前设置mbuf数据结构,设置PKT_TX_VLAN_PKT位,同时将具体的Tag信息写入vlan_tci字段。
4.多层VLAN的支持
为了容纳多个(4096以上)虚拟网络,出现了双层乃至多层VLAN堆叠模式,随着这种模式(QinQ技术)在网络应用变得普遍,现代网卡大多提供给对两层VLAN Tag进行卸载,如VLAN Tag的剥离、插入。
以82599,X550网卡为例,在接收侧,VLAN过滤与剥离操作是针对双层VLAN中的内层VLAN Tag。
以XL710网卡为例,VLAN剥离时能同时剥去内外层VLAN Tag,并存储在mbuf的数据结构中。
对于发包方向,硬件可能只会提供对内层VLAN的操作。也就是说,硬件会假设外层VLAN已经由软件生成,硬件能够解析此外层VLAN,并且跳过它对内层进行操作。
IEEE1588硬件卸载功能
IEEE1588定义了PTP(精确时间同步协议),用于同步以太网的各个节点,是一个非常适合使用硬件卸载功能的特性。作为时间同步功能,本身对实时性的要求很高。也就是说,当需要为数据包打上时间戳的时候,希望时间戳能够尽量的精确。如果采用软件的方式,报文修改处理本身消耗大,可能打时间戳和获取时间戳之间已经存在一定的延时,导致时间戳本身不是非常精确。采用硬件来实现IEEE1588的功能,则能够快速完成获取并打时间戳的工作,能有效提高时间戳的精确性。
硬件承担的责任也就是硬件卸载能够承担的工作是:
- 分辨出哪些包是需要时间戳的
- 为那些需要的包添加时间戳。既需要在接收方向,也需要在发送方向进行。
- 需要存储添加的时间戳,从而能够将这个时间戳的值告诉软件。
DPDK提供的是打时间戳和获取时间戳的硬件卸载。DPDK的使用者还是需要自己去关系IEEE1588的协议栈,DPDK并没有实现协议栈。
IP TCP/UDP/SCTP checksum硬件卸载功能
checksum计算是网络协议的容错性设计的一部分,基于网络传输不可靠的假设,因此在Ethernet、IPV4、UDP、TCP、SCTP各个协议层设计中都有checksum字段,用于校验包的正确性,checksum不涉及复杂的逻辑。虽然各个协议定义主体不同,checksum算法岑差不齐,但总体归纳,checksum依然可以说是简单机械的计算,算法稳定,适合固化到硬件中。需要注意的是,checksum可以硬件卸载,但依然需要软件的协议配合实现。
Tunnel硬件卸载功能
VxLAN和NVGRE网卡具有识别VxLAN和NVGRE数据包的能力,并对其设计的协议IP和TCP/UDP提供校验和的功能(VxLAN的外层UDP的校验和需要固定填写成0),从而减轻CPU的负担。这种校验和的功能可以涵盖外层和内存头。
这两种网卡还可能提供更复杂的功能,比如将VxLAN和NVGRE的外层头添加或剥离的功能卸载到硬件。
目前DPDK仅支持对VxLAN和NVGRE的流进行重定向。
分片功能卸载
TSO(TCP Segment Offload)是TCP分片功能的硬件卸载,显然这是发送方向的功能。TCP会协商决定发送的TCP分片的大小。对于从应用层获取的较大的数据,TCP需要根据下层网络的报文大小限制,将其分成较小的分片发送。
硬件提供的TCP分片硬件卸载功能可以大幅度减轻软件对TCP分片的负担。这项功能很适合用硬件来完成,因为它是比较简单机械的实现。
组包功能卸载
RSC(接收方聚合)是TCP组包功能的硬件卸载。硬件组包功能实际上是硬件拆包的逆向功能实现。硬件组包功能针对TCP实现,是接收方的功能,可以将拆分的TCP分片聚合成一个大的分片,从而减轻软件的处理。