接前一篇文章:零知识学习之DPDK与RDMA(1)—— 认识DPDK(1)
本文内容参考:
《Linux高性能网络详解 从DPDK、RDMA到XDP》 刘伟著 人民邮电出版社
https://blog.51cto.com/u_15301988/5181201
特此致谢!
一、认识DPDK
3. DPDK体系结构
DPDK为需要快速处理数据包的数据平面应用提供了一个简单、完整的框架。该框架通过创建环境抽象层(environment abstraction layer,EAL),为特定环境提供一组库。这里提到的特定环境,指的是CPU体系结构(比如32位或64位x86处理器)、GCC编译器或某些特定平台。这些环境通过使用meson文件和配置文件来指定。一旦创建了EAL(环境抽象层),用户就可以与该库链接以执行自己的应用程序。
DPDK也提供了EAL之外的其它库,比如哈希(hash)、最长前缀匹配(LPM)库等。此外,DPDK代码中的示例应用程序可以帮助用户了解如何使用DPDK提供的各种功能。
DPDK为处理数据包实现了一个“运行到完成”(run to completion)的模型,在执行数据平面处理逻辑之前,必须先分配所有资源,然后以逻辑核上执行单元(线程)的形式运行。该模型不支持调度器,以轮询的方式访问所有设备。处理数据包时不使用中断,主要原因是中断处理会产生较大的性能开销。
(1)核心组件
DPDK中的核心组件是一组库,这些库为应用程序提供了高性能处理数据包所需的所有元素。DPDK的核心组件(库)以及它们之间的依赖关系如下图所示。库的名称中rte前缀的意思是运行时环境(run time environment)。具体到代码编译后生成的库文件,还要在名称前加上lib,比如librte_mbuf。
1)环形缓冲器(librte_ring)
环形缓冲器(ring manager)使用环形队列,在有限大小的表中,提供了无锁的多生产者、多消费者的先进先出队列(FIFO)以及操作队列的API。与普通无锁队列相比,它有一些优势,比如易实现、适合批量操作、速度快等。
内存池管理器就使用了此模块提供的机制。
另外,环形队列还可用作逻辑核间或单个逻辑核上连接在一起的执行块之间的通用通信机制。
2)内存池管理器(librte_mempool)
内存池管理器(memory pool manager)负责分配内存中的对象池。池(pool)由名称标识,并使用环(ring)管理空闲(free)的对象。它还提供了一些可选服务,例如每个核的对象缓存和对齐协助(填充对象,使对象在所有DDR通道上均匀分布)。
3)网络数据包缓存管理(librte_mbuf)
此库提供了创建和销毁数据缓存的功能,这些数据缓存被DPDK应用程序用来保存网络数据包。数据缓存在DPDK启动时作为一个整体被创建,存储在mempool中。librte_mbuf库提供了API来分配/释放mbuf,mbuf适用于操作存储数据包的缓存的数据结构。
4)时间管理器(librte_timer)
该库为DPDK执行单元提供定时器服务和异步执行函数的功能。它可以提供周期性函数调用,也可以提供一次性函数调用。它使用环境抽象层提供的定时器接口以获取精确的时间基准,并可以根据需要在每个核上启动。
5)环境抽象层(librte_eal)
环境抽象层负责访问底层资源,如硬件和内存空间。它提供了一组通用接口,可以对应用程序和其它库隐藏环境细节,使得应用程序不需要知道当前运行的环境上使用了什么样的CPU,编译时用的什么编译器等。
环境抽象层提供的服务包括:
- DPDK的加载和启动;
- 支持多进程和多线程执行;
- 设置处理器核的亲和性(affinity)或任务分配(创建执行实例);
- 系统内存的分配/释放;
- 原子/锁操作;
- 时间基准(time reference);
- PCI总线访问;
- 跟踪和调试功能;
- CPU特征识别;
- 中断处理(注册/撤销针对某个中断源的处理函数);
- 警告(alarm)操作(设置/删除在特定时间运行的回调函数);
- 内存分配(malloc)。