DPDKDataPlaneDevelopmentKit数据平面开发套件
背景
因特网和其他互联网必须承载的通信量在持续增长和变化。如今,实时响应的万维网的广泛使用和音频、图像、视频的使用增长,驱动了服务质量需求的增长。为了应对这种增长,TCP/IP体系结构发展了
QoS(服务质量)以支持各种类型的拥有各种服务质量需求的通信量。数据平面(Data Plane)是QoS框架的三平面之一,承担了通信中分组的队列管理,排队调度,拥塞避免等直接在数据流上进行操作的机制,对提高网络通信的效率起着至关重要的作用。
[2]
在此基础上,人们期望用更低的成本和更短的产品开发周期来提供多样的网络单元与丰富的功能,如应用处理、控制处理、包处理、信号处理等。为了适应这一新的产业趋势,基于Intel x86架构的DPDK面世了。
综述
DPDK是一个
linux基金会的开源项目。
[3]
开发DPDK的主要目的,是在数据平面应用中为快速的数据包处理提供一个简单而完善的架构。在理解此工具集之后,开发人员可以以此为基础进行新的原型设计,或简单地为我所用。
[4]
DPDK架构通过创建EAL(Environment Abstraction Layer,环境抽象层)来为不同的工作环境创造函数库集,创建后开发者即可把自己的应用与函数库进行链接。该架构也包含跟踪调试,
PCIe总线接入等功能,并有相关样例帮助开发者学习如何使用这些功能。
工作环境
DPDK的环境抽象层向应用与函数库隐藏了底层环境的细节,因而能扩展到任何处理器上使用。就操作系统来说,它提供了对Linux和
FreeBSD的支持。
工作原理
DPDK使用了轮询(polling)而不是中断来处理数据包。在收到数据包时,经DPDK重载的网卡驱动不会通过中断通知CPU,而是直接将数据包存入内存,交付应用层软件通过DPDK提供的接口来直接处理,这样节省了大量的CPU中断时间和内存拷贝时间。
[4]
关键技术
环境抽象层
DPDK的创造的环境抽象层(EAL, Environment Abstraction Layer)主要负责对计算机底层资源(如硬件和内存空间)的访问,并对提供给用户的接口实施了实现细节的封装。其初始化例程决定了如何分配这些资源(PCI设备、计时器、控制台等)。
EAL提供的典型服务包括:
加载和启动DPDK:DPDK及其应用程序会被链接为单一应用,因此需要通过某种方式进行加载DPDK。
核关联/分配过程:EAL提供了将执行单元分配给特定核并创建执行实例的机制。
预留系统内存:EAL为预留不同的内存区域提供便利,例如用于设备交互的物理内存区域。
抽象PCI地址:EAL提供了访问PCI地址空间的接口。
跟踪和调试功能:日志、堆栈转储等。
实用的功能:libc中所没有提供的自旋锁和原子计数器。
CPU功能识别:在运行时确定CPU是否支持特定功能,确定当前CPU是否支持编译产生的二进制指令集。
中断处理:向特定中断源注册/注销回调的接口。
时钟功能:用于设置/删除在特定时间运行的回调函数接口。
轮询模式驱动
DPDK包括1Gb,10Gb,40Gb和半虚拟化抽象层的轮询模式驱动(PMD, Poll Mode Driver)。PMD由用户空间的特定的驱动程序提供的
API组成,用于对设备和它们相应的队列进行设置。抛弃了基于中断的异步信号发送机制为该架构带来很大的开销节省。避免中断性能瓶颈是DPDK提升数据包处理速度的关键之一。
DPDK环境为数据包处理应用考虑了两种模型:运行至完成(run-to-completion)模型和管道(pipeline)模型。在运行至完成模型中,一个API向某个特定端口的接收描述符环轮询以接收数据包。接着这个数据包在同一个核上被处理,之后被一个发送用API放到端口的传输描述符环上;在管道模型中,一个核心会通过API对一个或多个端口的接收描述符环进行轮询,数据包通过环被接收和传递给另一个核心,然后在这个核心上被处理,之后可能被发送用API放到端口的传输描述符环上。
运行至完成是一个同步模型,每个指派给DPDK的逻辑核心执行如下所示的循环:
通过PMD接收用API来提取输出数据包
根据转发,一一处理收到的数据包
通过PMD发送用API发送输出数据包
相反,管道模型是一个异步模型,有的逻辑核心只执行数据包提取,而有的只执行处理,收到的数据包在这些逻辑核心之间通过环来传递。提取核心执行如下的循环:
通过PMD接收用API来提取输出数据包
通过队列提供数据包给处理核心
处理核心执行如下的循环:
从队列中提取数据包
根据重传(如果被转发)处理数据包
为了避免不必要的中断性能瓶颈,执行环境禁止任何异步通知机制的使用。在任何需要或合适的时候,异步通信都应尽可能采用环的方式。
在多核环境中避免锁竞争是一个重要的问题。为了处理这个问题,PMD被设计为可以尽可能地在单核私有资源下工作。例如,PMD为每个核心每个端口提供一个单独的队列。同样的,每个端口的接收队列只会被指派给唯一一个逻辑核心并接收它的轮询。
以上是 DPDKDataPlaneDevelopmentKit数据平面开发套件 的全部内容, 来源链接: utcz.com/z/519274.html