目录
DPDK-概述
DPDK是什么
DPDK特点
DPDK的优劣
DPDK架构
DPDK框架
环境适配层EAL
核心组件
以太网轮询驱动架构PMD
报文转发算法支持
网络协议库(librte_net)
DPDK-概述
DPDK是什么
Intel? DPDK全称Intel Data Plane Development Kit,是intel提供的数据平面开发工具集,为Intel architecture(IA)处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持,它不同于Linux系统以通用性设计为目的,而是专注于网络应用中数据包的高性能处理。(主要就是做包转发)
具体体现在DPDK应用程序是运行在用户空间上利用自身提供的数据平面库来收发数据包,绕过了Linux内核协议栈对数据包处理过程。
DPDK: 在IA上做高效包处理
发挥core性能唯一原则: 让数据更接近于core 接近core的--->就是cache
核心目标:把数据移到cache里面 (cache容量有限)
现在的cache在20M以上: 大的好处 可以拿出一部分位做包 [英特尔数据直接IO技术(Intel DDIO)]
(包可以不经过内存,所有的操作都在cache中完成)
prefetch系列指令作用: 影响指令快慢一个比较重要的因素--->数据能不能提前ready
最好的情况: 在处理下一条指令时候 下一条指令的数据已经走到cache中
memory: 有多个channel
如何完整利用内存channel的带宽?
CPU:切换开销大 压榨性能: 不切换
UIO: 在用户态可以做配置
在IA平台上 所有的设备都是PCIe设备 所以IA上基本只有route port
对于PCIe设备: 配置 怎么驱动
一个PCIe设备有一串数字(序列)标记这个设备
UIO: 就是把bar的address 通过mmap映射的用户空间,让用户空间可以访问寄存器
DPDK特点
- 1) 轮询:在包处理时避免中断上下文切换的开销,
- 2) 用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化
- 3) 亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中
- 4) 降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存多通道交错访问提高内存访问有效带宽
- 5) 软件调优:cache行对齐,预取数据,多元数据批量操作
DPDK的优劣
优点: 缺点:
- 性能高 无网络协议栈
- 用户态开发 开发困难,周期长
- 死后易重启
DPDK核心技术如下:
- 通过UIO技术将报文拷贝到应用空间处理
- 通过大页内存,降低cache miss ,提高命中率,进而cpu访问速度
- 通过CPU亲和性,绑定网卡和线程到固定的core,减少cpu任务切换
- 通过无锁队列,减少资源竞争
DPDK架构
- EAL(Environment Abstraction Layer)即环境抽象层,为应用提供了一个通用接口,隐藏了与底层库与设备打交道的相关细节。EAL实现了DPDK运行的初始化工作,基于大页表的内存分配,多核亲缘性设置,原子和锁操作,并将PCI设备地址映射到用户空间,方便应用程序访问。
- Buffer Manager API通过预先从EAL上分配固定大小的多个内存对象,避免了在运行过程中动态进行内存分配和回收来提高效率,常常用作数据包buffer来使用。
- Queue Manager API以高效的方式实现了无锁的FIFO环形队列,适合与一个生产者多个消费者、一个消费者多个生产者模型来避免等待,并且支持批量无锁的操作。
- Flow Classification API通过Intel SSE基于多元组实现了高效的hash算法,以便快速的将数据包进行分类处理。该API一般用于路由查找过程中的最长前缀匹配中,安全产品中根据Flow五元组来标记不同用户的场景也可以使用。
- PMD则实现了Intel 1GbE、10GbE和40GbE网卡下基于轮询收发包的工作模式,大大加速网卡收发包性能。
DPDK框架
- Core Libs: 提供系统抽象、大页内存、缓存池、定时器及无锁环等基础组件
- PMD库: 提供全用户态驱动,以便通过轮询和线程绑定得到极高网络吞吐,支持各种本地和虚拟网卡。
- Classify库:支持精确匹配,最长匹配和通配符匹配,提供常用包处理的查表操作。
- Qos库: 提供网络服务质量相关组件,限速和调度。
各组件之间依赖关系:
环境适配层EAL
EAL提供的典型服务有:
- DPDK的加载和启动:DPDK和指定的程序链接成一个独立的进程,并以某种方式加载
- CPU亲和性和分配处理:DPDK提供机制将执行单元绑定到特定的核上,就像创建一个执行程序一样。
- 系统内存分配:EAL实现了不同区域内存的分配,例如为设备接口提供了物理内存。
- PCI地址抽象:EAL提供了对PCI地址空间的访问接口
- 跟踪调试功能:日志信息,堆栈打印、异常挂起等等。
- 公用功能:提供了标准libc不提供的自旋锁、原子计数器等。
- CPU特征辨识:用于决定CPU运行时的一些特殊功能,决定当前CPU支持的特性,以便编译对应的二进制文件。
- 中断处理:提供接口用于向中断注册/解注册回掉函数。
- 告警功能:提供接口用于设置/取消指定时间环境下运行的毁掉函数。
初始化和运行
核心组件
- 环形缓冲区管理(librte_ring):Ring数据结构提供了一个无锁的多生产者,多消费者的FIFO表处理接口。
- 内存池管理(librte_mempool):内存池管理的主要职责就是在内存中分配指定数目对象的POOL。
- 网络报文缓冲区管理(librte_mbuf):提供了创建、释放报文缓存能力,DPDK程序中可能使用这些报文缓存来存储消息
- 定时器管理(librte_timer) :这个库位DPDK执行单元提供了定时服务,为函数异步执行提供支持
以太网轮询驱动架构PMD
DPDK的PMD驱动支持1G、10G、40G。 同时DPDK提供了虚拟的以太网控制器,被设计成非异步,基于中断的模式
报文转发算法支持
DPDK提供了哈希(librte_hash)、最长前缀匹配的(librte_lpm)算法库用于支持包转发。 详细内容查看 Hash Library 和 LPM Library 。
网络协议库(librte_net)
这个库提供了IP协议的一些定义,以及一些常用的宏。 这些定义都基于FreeBSD IP协议栈的代码,并且包含相关的协议号,IP相关宏定义,IPV4和IPV6头部结构等等。