《Linux开源网络全栈解析》——学习笔记——DPDK

高性能数据平面——DPDK

DPDK的广泛应用很好地证明了IA多核处理器可以解决高性能数据包处理的需求。其核心思想可以归纳成以下几个方面:

轮询模式:DPDK轮询网卡是否有网络报文的接收或发送,这样避免了传统网卡驱动的中断上下文的开销,当报文吞吐量大的时候,性能及延时的改善十分明显。

用户动态驱动:用用户动态驱动的开发框架在用户态操作设备及数据包,避免了不必要的用户态和内核态之间的数据拷贝和系统调用。

降低访问存储开销:高性能数据包处理意味着处理器需要频繁访问数据包。显然降低访问存储开销可以有效地提高性能。DPDK使用大页降低TLB未命中率,保持缓存对齐避免处理器之间缓存交叉访问,利用预取等指令提高缓存的访问率。

亲和性和独占:利用线程的CPU亲和绑定方式,将特定的线程指定在固定的核上工作,可以避免线程在不同核之间频繁切换带来的开销,提高可扩展性,更好地达到并行处理,提高吞吐量的目的。

批处理:DPDK使用批处理概念,一次处理多个包,降低了一个包处理的平均开销。

利用IA心硬件技术:IA的新指令、新特性都是DPDK挖掘数据包处理性能的源泉。比如利用vector指令并行处理多个报文,原子指令避免开销等。

软件调优:软件调优散布在DPDK代码的各个角落,包括利用threshhold的提高PCI带宽的使用率,避免Cache Miss(缓存不命中)以及Branch Mispredicts(分支预测错误)的发生等。

充分挖掘外部设备性能:以网卡为例一些网卡的功能,例如RSS、Flow director、TSO等技术可以被用来加速网络的处理。

开发模型

基于上面的技术特点,DPDK建议用户使用两种开发模型:

Run-to-Completion模型:指一个报文从收到、处理结束,再发送出去,都是由一个核处理,一气呵成。该模型的初衷是避免核间通信带来的性能下降。在该模型下,每个执行单元在多核处理系统中分别运行在各自的逻辑核上,也就是多个核上执行一样的逻辑程序。为了可线性扩展吞吐量,可以利用网卡的硬件分流机制,如RSS,把报文分配到不同的硬件网卡队列上,每个核针对不同的队列轮询,执行一样的逻辑程序,从而提高单位时间处理的网络量。

Pipeline模型:虽然Run-to-Completion模型有许多优势,但是针对单个报文的处理始终集中在一个CPU核,无法利用其他CPU核,并且程序逻辑的耦合性太强,可扩展性有限。Pipeline模型的引入正好弥补了这个缺点,它指报文处理像流水线上一样经过多个执行单元。每个执行单元分别运行在不同CPU核上,各个执行单元之间通过环形队列相连接。这样的设计可以将报文的处理分为多步,将不同的工作交给不同的模块,使得代码的可扩展性更强。

实现框架

DPDK由一系列用于包处理的软件库组成,能够支持多种类型设备,包括以太网设备、加密设备、事件驱动设备等,这些设备以PMD的形式存在于DPDK中,并提出了一系列用于硬件加速的软件接口。

核心库(Core Libraries):是DPDK程序的基础,包括系统抽象内存管理,无锁环、缓存池等。

流分类(Packet Classification):支持精确匹配、最长匹配和通配符匹配,提供常用的包处理查表操作。

软件加速库(Accelerated SW Libraries):一些常用的包处理软件库的集合,比如IP分片、报文重组、排序等。

Stats:提供用于查询或通知统计数据的组件。

QoS:提供网络服务质量相关组件,比如限速(Meter)和调度(Scheduler)。

数据包分组架构(Packet Framework):提供了搭建复杂的多核Pipeline模型的基础组件。

核心库

核心库是DPDK程序的核心也是基础,几乎所有基于DPDK开发的程序都依赖它。核心库包括系统抽象层、内存管理、无环锁、缓存池等。

系统抽象层屏蔽了各种特异环境,为开发者提供了一套统一的接口,包括DPDK的加载/启动;支持多进程和多线程;核亲和/绑定操作;系统内存的管理;总线的访问,设备的加载;CPU特性的抽象;跟踪及调试函数;中断处理;Alarm处理。

无锁环、MemPool及Mbuf的管理也是DPDK的核心所在。

DPDK的rte_ring结构提供了一个支持多生产者和消费者的无锁环。它是一个先进先出(FIFO)队列,简单且高速,支持成批进队列和出队列。它已用于Memory Pool的管理,同时也可以作为不同执行单元间的通信方式。

DPDK的rte_mempool是负责管理队列从内存中分配mempool的库。mempool是一个对象池。mempool中还引入了Object Cache(对象缓存)的概念,用于加速对象的分配和释放过程。

DPDK的rte_mbuf则提供了一种数据结构,它可用于封装网络帧缓存或控制消息缓存。rte_mbuf以ring的形式存在于MemPool中。


版权声明:本文为qq_41976997原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。