2.概述
本章节给出了DPDK架构的一个全局概述。
DPDK的主要目的就是为数据面快速报文处理应用程序提供一个简洁完整的框架。用户可以通过代码来理解其中使用的一些技术,构建自己的应用程序或添加自己的协议栈。Alternative ecosystem options that use the DPDK are available。
通过创建环境抽象层(EAL),DPDK框架为每个特殊的环境创建了一组运行库。这个库特定于Intel架构(32或64位),Linux*用户空间编译器或其他特定的平台。这些环境通过一些makefile和配置文件创建。一旦EAL库编译完成,用户可以通过链接这些库来构建自己的应用程序。除了EAL,还有一些其他的库,包括哈希算法、最长前缀匹配、环形缓冲区等。DPDK提供了一些应用程序实例来指导如何使用这些特定来创建自己的应用程序。
DPDK实现了报文处理的RTC模型,在这种模型中,数据面应用程序在调用之前必须预先分配好所有的资源,并作为执行单元运行在逻辑核上。这种模型并不支持调度,且所有的设备通过轮询的方式访问。不使用中断方式的主要原因就是中断处理增加了性能开销。
作为RTC模型的扩展,通过使用Ring在不同逻辑核之间传递报文和消息,也可以实现报文处理的流水线模型(Pipeline)。流水线模型允许操作分阶段进行,在多核代码执行中可能更高效。
2.1.开发环境
DPDK工程创建要求Linux环境及相关的工具链,例如一个或多个编译工具、汇编程序、make工具、编辑器及DPDK组件用到的库。
当指定环境和架构的库编译出来时,这些库就可以用于创建我们自己的数据面处理程序。
创建Linux用户空间应用程序时,需要用到glibc库。对于DPDK应用程序,必须使用两个全局环境变量(RTE_SDK和RTE_TARGET),这两个变量需要在编译应用程序之前配置好:
export RTE_SDK=/home/user/DPDK
export RTE_TARGET=x86_64-native-linuxapp-gcc
也可以参考《DPDK入门指南》来获取更多搭建开发环境的信息。
2.2.环境适配层
环境适配层为应用程序和库提供了通用的接口,隐藏了底层环境细节。EAL提供的服务有:
- DPDK的加载和启动
- 多线程和多进程执行方式支持
- CPU亲和性设置
- 系统内存分配和释放
- 原子操作和锁操作
- 定时器引用
- PCI总线访问
- 跟踪调试功能
- CPU特性识别
- 中断处理
- 警告操作
- 内存管理
EAL更详细的描述请参阅本文档“环境适配层”章节。
2.3.核心组件
核心组件指的是一系列库,用于为高性能包处理程序提供所有必须的元素。核心组件及其之间的关系如下图所示:
2.3.1.环形缓冲区管理(librte_ring)
Ring数据结构提供了一个无锁的多生产者,多消费者的FIFO表处理接口。相对于无锁队列来讲,它容易部署,适合大量的操作,而且更快。Ring库在“内存池库(librte_mempool)”中使用,而且,ring还用于不同逻辑核上处理单元之间的通信。
环形缓冲区及其使用可以参考章节“环形缓冲区库”描述。
2.3.2.内存池管理(librte_mempool)
内存池管理的主要职责就是在内存中分配指定数目对象的Pool。每个Pool以名称来唯一标识,并且使用一个Ring来存储空闲的对象节点。它还提供了一些其他的服务,如对象节点的每核缓存备份,及自动对齐以保证对象能够均衡分布到内存通道上。
内存池分配器的具体行为请参考章节“内存池库”描述。
2.3.3.网络报文缓冲区管理(librte_mbuf)
报文缓冲区库提供了创建和销毁报文缓冲区的能力,DPDK应用程序中使用这些缓冲区来存储消息。这些缓冲区通常在程序开始时通过DPDK的内存池库(librte_mempool)申请并存储在内存池中。缓冲区库(librte_mbuf)提供了报文申请和释放的API,通常情况下,消息Buffer用于缓存消息,报文Buffer用于缓存网络报文。
报文缓冲区管理的具体行为请参考章节“缓冲区库”描述。
2.3.4.定时器管理(librte_timer)
这个库位DPDK的执行单元提供了定时器服务,为函数异步执行提供支持。定时器可以设置成周期调用,或者只调用一次。使用EAL提供的接口可以获取高精度时钟,并且能在每个核上根据需要初始化。
具体请参考章节“定时器库”描述。
2.4.以太网轮询模式驱动架构
DPDK的PMD驱动支持1G、10G、40G。 同时DPDK提供了虚拟的以太网控制器,被设计成非异步,基于中断信号的模式。
详细内容参考 章节“轮询模式驱动”描述。
2.5.报文转发算法支持
DPDK提供了哈希(librte_hash)、最长前缀匹配(librte_lpm)算法库用于支持相应的分组转发算法。
详细内容查看章节“哈希算法” 和“最长前缀匹配” 。
2.6.网络库(librte_net)
这个库包括IP协议的一些定义及常见的宏定义。这些定义都是基于FreeBSD*中IP协议栈的代码,包括协议号(用于IP头部)、IP相关的宏、IPv4/IPv6头部结构体以及TCP、UDP和STCP头部结构体。