《深入浅出DPDK》——读书笔记——硬件加速与功能卸载

硬件加速与功能卸载

与软件实现相比,同样的功能如果硬件来做,可以减少CPU的开销。通常硬件能力强,具有高并发处理特点,有助于大幅提高系统吞吐率与减少时延。

硬件加速实现在哪里?可以实现在通用CPU上,也可以实现在芯片组,还可以实现在各种接口卡上。和网络数据最直接的接口是网卡,在网卡上进行网络数据卸载是主要思路。

硬件的缺点在于资源局限,功能固化,一旦设计发布完成,再对功能进行改变就变得非常困难。且硬件的设计与发布时间长,更新周期无法与软件相比。

硬件卸载简介

硬件提供越来越多的功能,从以太网,IP数据报文头部的校验和计算、加解密等功能,发展到对高级协议的分析处理,可以预期,未来硬件直接提供的功能将会占据越来越大的比重。

对于数据中心服务器,需要处理来自网络中的数据包,解析网络协议,早起受芯片技术限制,网卡功能简单,大量依赖服务器的CPU来处理网络协议,服务器的处理能力被消耗在这些处理任务上。随着半导体技术的飞速发展,处理器有越来越强的运算能力,能容纳承载更多的应用,接纳更多的网络数据包构建互联网应用。服务器需要处理来自网络中的大量数据包。同样的半导体技术进步也体现在网卡上,已经可以看到今年来万兆网络在服务器中的大量使用。

对于专用网络,为了提高处理数据包的速度,数据面和控制面分离是一项常用的技术。简单来说,就是复杂的数据包进入控制面,进行复杂的控制处理;而在数据面留下简单且类似的包处理,比如:

  • 查表(路由表,访问控制,ARP,调度队列)

  • 报文校验与头部修改(以太网,IP,隧道报文)

  • 复杂运算(加解密与压缩算法)

基于专门设计的硬件,快速执行数据包的转发和一些简单的报文修改处理可以有效提高数据吞吐量和降低发送时延。

在网络功能节点的设计上,数据面的处理此前大多是用于专们的硬件(网络处理器,FPGA,ASIC)来处理这些比较耗时的功能,以提高处理效率。

硬件卸载功能分为计算及更新、分片、组包三大类。

网卡硬件卸载功能

通过选取四种Intel网卡(i350、82599、x550、xl710)进行介绍,提供一个网卡的硬件卸载功能发展脉络。

i350是1G的网卡,82599和x550是10G的网卡,xl710是10/40G的网卡。

下表展现了各种网卡支持的硬件卸载的功能。

i35082599x550xl710
计算及更新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_TMSTIEEE1588卸载

发送侧:

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_PTPIEEE1588卸载

硬件与软件功能实现

硬件卸载功能是将某些功能下移到硬件实现,这些功能原先一般是由软件承担的。

如果需要使用硬件卸载功能,网卡驱动需要提供相应的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的功能,则能够快速完成获取并打时间戳的工作,能有效提高时间戳的精确性。

硬件承担的责任也就是硬件卸载能够承担的工作是:

  1. 分辨出哪些包是需要时间戳的

  2. 为那些需要的包添加时间戳。既需要在接收方向,也需要在发送方向进行。

  3. 需要存储添加的时间戳,从而能够将这个时间戳的值告诉软件。

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分片聚合成一个大的分片,从而减轻软件的处理。

### 回答1: DPDK(Data Plane Development Kit)是一种高性能数据面开发工具包。深入浅出DPDK是一份详细介绍DPDK的PDF文档,适合初学者了解DPDK的基本概念和使用方法。 该文档从DPDK的介绍开始,介绍了DPDK的发展历史、使用场景和目标。接着详细介绍了DPDK的架构,包括主要组件和数据流向。其中详细介绍了包管理的基本原理和流程、缓存池的管理方式、内存对齐和地址映射等内容。 文档还介绍了如何使用DPDK,包括DPDK的编译和安装、如何使用DPDK进行虚拟网络功能(VNF)处理,以及如何使用DPDK进行数据包嗅探和过滤等。 此外,该文档还介绍了DPDK的性能优化技巧,包括如何优化包接收和处理、如何使用多核心优化性能和如何配置DPDK与硬件交互。 总体而言,深入浅出DPDK是一份非常有价值的文档,它不仅为初学者提供了详细的DPDK介绍和使用指南,还涵盖了DPDK的高级主题和性能优化技巧,为使用DPDK进行高性能数据面开发的人员提供了重要的参考资料。 ### 回答2: DPDK(Data Plane Development Kit)是一个高性能数据平面开发工具包,它使用用户态技术实现了零拷贝的数据处理和高速的数据包转发。作为一款开源工具,DPDK已经被广泛应用于虚拟化、云计算及网络功能虚拟化等领域。 《深入浅出dpdk》是一份由DPDK社区编写的指南,它的目的是帮助开发人员更好地了解DPDK,并使用DPDK构建高性能网络应用程序。该指南提供了详细的DPDK架构、API接口、应用案例和性能调优等方面的介绍,同时也介绍了其他相关技术,例如硬件加速、 NUMA架构、 数据库加速、分布式系统等。 《深入浅出dpdk》PDF版本可以从DPDK社区网站上自由下载,它包含了大量易懂的图表和代码实例,让开发人员更容易理解DPDK的概念和原理。对于想要在高性能数据平面开发方面取得突破的开发人员来说,这份指南是不可或缺的学习资料。 需要注意的是,《深入浅出dpdk》不仅是一份教材,更是一份指导开发人员如何使用DPDK进行数据平面开发的实际指南。开发人员在阅读本指南的同时,也需要具备一定的网络编程基础和C语言编程能力。同时,开发过程中还需要注意DPDK版本的兼容性和网络设备的支持情况。 ### 回答3: DPDK(Data Plane Development Kit)是一种高性能数据面开发工具包,它可以帮助开发人员快速地实现高性能网络应用程序。本篇文章解析的Deep Dive into DPDK的PDF文件是一份帮助初学者深入了解DPDK的指南,其中详细地介绍了DPDK的各种重要概念、特性和使用方法。 首先,这份PDF文件详细介绍了DPDK的架构和工作原理。DPDK采用轮询机制减少了对内核的依赖,从而显著提高了网络数据处理的性能。此外,本文还介绍了DPDK中各种组件的作用和功能,例如EAL(Environment Abstraction Layer)、Mempool、Ring等。这些组件都是DPDK中重要的工具,它们可以帮助开发人员更好地构建高性能应用程序。 其次,本文还介绍了如何使用DPDK来构建网络应用程序。首先,开发人员需要安装DPDK,并正确配置相应环境变量。其次,本文还介绍了如何使用DPDK的API来实现数据包的发送和接收。这些API提供了高效的数据传输方式和内存管理方式,开发人员可以根据自己的需求进行自定义。 此外,本文还介绍了DPDK的一些高级功能,例如NUMA支持、内存优化等。这些功能可以帮助开发人员更好地控制和管理系统资源,从而确保系统的高性能和稳定性。 总之,本文是一份非常实用的DPDK指南,其中介绍了DPDK的各种重要概念、特性和使用方法。初学者可以通过阅读这份文件,快速掌握DPDK的核心知识,为构建高性能应用程序打下牢固的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值