目录
第1章 DPDK概述
1.1 什么是DPDK
1.2 DPDK的作用
1.3 DPDK的背景
第2章 Linux内核和应用程序处理网络数据包的过程
2.1 Linux网络数据包的处理流程
2.2 传统Linux内核Socket通信的问题
第3章 DPDK的架构与原理
3.1 DPDK的基本思想
3.2 DPDK替代Linux网络协议栈
3.3 DPDK总体架构与主要组件
3.2 用查询替代中断
DPDK是一个linux基金会的开源项目。
数据平面开发套件(DPDK ,Data Plane Development Kit)是由6WIND,Intel等多家公司开发,主要基于Linux系统运行,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。
DPDK 可以将数据包处理性能最多提高十倍。在单个英特尔® 至强® 处理器上获得超过 80 Mbps 的吞吐量,在双处理器配置中则可将该其提高一倍。因此,电信和网络设备制造商(TEM 和 NEM)可降低开发成本,使用更少的工具和为团队提供支持,并加快上市速度。
DPDK是INTEL公司开发的一款高性能的网络驱动组件,旨在为数据面应用程序提供一个简单方便的,完整的,快速的数据包处理解决方案,主要技术有用户态、轮询取代中断、零拷贝、网卡RSS、访存DirectIO等。
数据平面开发套件 (DPDK)-英特尔® 官网
开发DPDK的主要目的,是在数据平面应用中为快速的数据包处理提供一个简单而完善的架构。在理解此工具集之后,开发人员可以以此为基础进行新的原型设计,或简单地为我所用。
DPDK架构通过创建EAL(Environment Abstraction Layer,环境抽象层)来为不同的工作环境创造函数库集,创建后开发者即可把自己的应用与函数库进行链接。
该架构也包含跟踪调试,PCIe总线接入等功能,并有相关样例帮助开发者学习如何使用这些功能。
因特网和其他互联网必须承载的通信量在持续增长和变化。如今,实时响应的万维网的广泛使用和音频、图像、视频的使用增长,驱动了服务质量需求的增长。为了应对这种增长,TCP/IP体系结构发展了QoS(服务质量)以支持各种类型的拥有各种服务质量需求的通信量。
数据平面(Data Plane)是QoS框架的三平面之一,承担了通信中分组的队列管理,排队调度,拥塞避免等直接在数据流上进行操作的机制,对提高网络通信的效率起着至关重要的作用。 [2]
在此基础上,人们期望用更低的成本和更短的产品开发周期来提供多样的网络单元与丰富的功能,如应用处理、控制处理、包处理、信号处理等。为了适应这一新的产业趋势,基于Intel x86架构的DPDK面世了。目前,也支持ARM架构。
关于通过Linux内核和socket接口收发网络数据包的详情,请参考:
https://blog.csdn.net/HiWangWenBing/article/details/127160102
(1)需要通过中断服务程序处理数据,海量数据的中断会影响内核整体的调度效率。
(2)Linux内核网络通信,需要进行多少数据包的拷贝:网卡-》中断服务程序队列-》内核sk buffer -》用户空间。多少的内存拷贝会导致高速网络数据的实时性受到极大的影响。
(3)要经历多次的内存数据拷贝
可以优化成:物理链路 =》 用户空间buffer (一次DMA内存拷贝)
(4)每次的内存拷贝,不仅仅增加数据处理的延时,还占用CPU的计算资源,导致整个CPU的有效的计算能力的下降。
为此,针对高速数据处理、实时性要求高的业务场景,一种称为FastPath的机制应运而生 ,FastPath能够旁路Linux内核的网络协议栈,直接在应用程序和底层的硬件驱动之间建立专用数据处理通道,并尽量减少内存的拷贝。
DPDK就是这样的一种FastPaht方案。
2.3 Linux用户空间设备驱动UIO的框架
UIO(Userspace I/O)是运行在用户空间的I/O技术。
Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能!
使用UIO可以避免设备的驱动程序需要随着内核的更新而更新的问题!
DPDK在Linux内核空间,一方面,绕过了Linux内核协议栈架构,另一方面借助了Linux UIO架构,实现了硬件设备驱动与用户空间程序之间高效的数据传输。也就是说,DPDA把网络设备看成了普通的硬件IO设备,按照设备文件的方式收发数据包,而不是按照网络socket的方式收发数据包。
更多UIO信息,请参考:
https://blog.csdn.net/HiWangWenBing/article/details/127263776
(1)旁路Linux内核TCP/IP协议栈
(2)使用UIO驱动框架挂接网卡驱动程序,在用户空间直接操作网卡硬件设备。
(3)使用专用的CPU核收发数据
(4)采用查询的方式替代中断的方式检测硬件设备是否ready
(1)用UIO driver替代NIC Kernel Driver (网卡内核驱动)
(2)用UIO Framework替代TCP/IP协议栈
(3)用DPDK PMD替代Socket lib
(4)用UIO文件设备接口替代socket接口
(5)用基于DPDK接口的应用程序替代基于socket接口的应用程序
备注:
UIO是Linux原生的IO设备驱动程序框架。
DPDK主要有六个核心组件:
1、 环境抽象层(EAL):为DPDK其他组件和应用程序提供一个屏蔽具体平台特性的统一接口,环境抽象层提供的功能主要有:DPDK加载和启动;支持多核和多线程执行类型;CPU核亲和性处理;原子操作和锁操作接口;时钟参考;PCI总线访问接口;跟踪和调试接口;CPU特性采集接口;中断和告警接口等。
2、 堆内存管理组件(Malloc lib):堆内存管理组件为应用程序提供从大页内存分配对内存的接口。当需要分配大量内存小块时,使用这些接口可以减少TLB缺页。
3、 环缓冲区管理组件(Ring lib):环缓冲区管理组件为应用程序和其他组件提供一个无锁的多生产者多消费者FIFO队列API:Ring。Ring是借鉴了Linux内核kfifo无锁队列,可以无锁出入对,支持多消费/生产者同时出入队。
4、 内存池管理组件(Mem pool lib):为应用程序和其他组件提供分配内存池的接口,内存池是一个由固定大小的多个内存块组成的内存容器,可用于存储相同对象实体,如报文缓存块等。内存池由内存池的名称来唯一标识,它由一个环缓冲区和一组核本地缓存队列组成,每个核从自己的缓存队列分配内存块,当本地缓存队列减少到一定程度时,从内存缓冲区中申请内存块来补充本地队列。
5、 网络报文缓存块管理组件(Mbuf lib):提供应用程序创建和释放用于存储报文信息的缓存块的接口,这些MBUF存储在内存池中。提供两种类型的MBUF,一种用于存储一般信息,一种用于存储报文信息。
6、 定时器组件(Timer lib):提供一些异步周期执行的接口(也可以只执行一次),可以指定某个函数在规定的时间异步的执行,就像LIBC中的timer定时器,但是这里的定时器需要应用程序在主循环中周期调用rte_timer_manage来使定时器得到执行。定时器组件的时间参考来自EAL层提供的时间接口。
DPDK使用了轮询(polling)而不是中断来处理数据包。
在收到数据包时,经DPDK重载的网卡驱动不会通过中断通知CPU来接收、处理,而是直接通过DMA将数据包存入应用程序可以直接访问的内存,数据交付给用应用层软件,需要通过DPDK提供的接口来直接处理,这样节省了大量的CPU中断时间和内存拷贝时间。
(1)中断模式:
网卡硬件收到包触发CPU中断,进行中断服务程序处理。
通过挂接中断服务程序到中断向量表,当有数据到来时,直接触发CPU进入中断处理程序。
中断的优点:
缺点:
(2)查询模式:
网卡驱动持续检查网卡是否有数据包到来,一旦有数据,直接接收、处理。
即查询SOC状态寄存器中的接收缓冲器状态位,再对数据进行处理;
优点:
缺点:
备注:
DPDK采用的查询的方式进行数据的收发,因此通常需要专用的CPU Core,避免“大量的空查询”或海量高负载实时数据对非实时性数据造成的性能上的影响。