概述
DPDK的设计目标是设计一个能够开发一个快速高效的数据平面应用的简单而完整的框架。用户能够自由地在DPDK的基础上构建他们自己的协议栈或其他系统。
基于以上这些现实,DPDK在架构设计、数据包处理以及平台的优化上做了很多相适应的优化和改进。DPDK在设计上采取一种简单的原则,所有的模块设计都围绕EAL这个核心来进行,通过EAL提供的同一接口,DPDK将各种硬件和实现上的差异对用户隐藏。DPDK的实现上还使用了run-to-completion这样一种模式,即从一条数据的接收到数据的处理都在一个核心上完成。这种策略的主要设计原因在于可以明显的减少因为大量的中断处理导致数据处理性能的下降。同时还支持另一种并发的模式,及某个核心接收的数据由另一个核心处理,这种模式用到了一种无锁循环队列的技术,也避免了锁机制带来的性能开销。这些具体将在以后的章节细讲。
这儿将主要讲述DPDK的多核编程策略和内存管理策略。
核心模块组成
上图展示了DPDK最核心的几个模块以及它们之间的基本关系,其中的每个模块都将在以后的章节逐一讲到,我们先从环境抽象层(EAL)说起。
环境抽象层
环境抽象层(EAL)的作用是提供访问底层资源(硬件或内存等)的通用接口,基于这点,现行的DPDK设计上提供在EAL模块提供了如下实现:
- 加载和初始化
- 分配核心
- 系统内存保留
- PCI地址空间抽象
- 跟踪和Debug接口
- 常用的工具函数,如自旋锁
- CPU特性接口
- 中断处理机制
- 闹钟机制
加载和初始化
这个功能实现我们从一个图开始讲起,如下图所示,
上图描述了在调用rte_eal_init,rte_eal_remote_launch,以及rte_eal_mp_wait_lcore接口后所发生的事情,在rte_eal_init_里,对内存,log机制,pci等完成了必要的初始化,接着调用rte_eal_remote_launch为每个core分配任务,rte_eal_mp_wait_lcore则等待每个core的任务结束。对于初始化部分我们在对EAL的其它部分实现时讲到,这儿我们先看看是怎么为每个CPU分配任务的。