DPDK 基础知识

DPDK 介绍

DPDK 特点

DPDK 全称 Data Plane  Development Kit,是一个用来进行包处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点:

  • 轮询:在包处理时避免中断上下文切换的开销。
  • 用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化
  • 亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中
  • 降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存多通道交错访问提高内存访问有效带宽
  • 软件调优:cache行对齐,预取数据,多元数据批量操作

DPDK 框架

DPDK

在上图中,核心库Core Libs提供系统抽象、大页内存、缓存池、定时器及无锁环等基础组件。

PMD库,提供全用户态驱动,以便通过轮询和线程绑定得到极高网络吞吐,支持各种本地和虚拟网卡。

Classify库,支持精确匹配,最长匹配和通配符匹配,提供常用包处理的查表操作。

Qos库,提供网络服务质量相关组件,限速和调度。

DPDK 高性能的来源

Compare

在传统的模式中,设备驱动工作在内核中,这样接收数据包只能通过终端的方式。而数据包的量越大,所需要消耗的中断就越多,严重的限制了高性能网络。并且数据在内核态与用户态之间传递时会由于各种各样的原因产生一定的延迟。

在 DPDK 的模式中,数据包的接收是通过轮询设备来实现的,免去了中断的开销,但这样会产生一个新的问题,为了保证实时性,就算没有数据包发来 DPDK 也要一直进行轮询,这样就会浪费资源。可以通过使用中断的机制对设备进行唤醒,一段时间后接收不到数据包后再进行休眠。DPDK 本身作为一个进程运行在用户态,并且绕过内核直接与网卡驱动进行交互,这样便可以降低延迟。此外,运行在用户态还有一个好处就是如果发生意外崩溃,不会影响到内核,提升了健壮性。

DPDK 使用更大的内存页来减少 TLB(Translation Lookaside Buffer) Miss,每一次发生 TLB Miss 时,需要付出 20-30 个 CPU 周期的代价。当页面增大时,发生 TLB Miss 的可能性就会减小。

在多核设备上创建多线程时,每个线程通过 set affinity 来绑定到独立的物理核,这样可以减少线程调度的开销。

Unikraft 下的 DPDK

DPDK 通过 EAL 抽象层与网卡设备直接进行交互。由于 Unikraft 具有启动快、体积小、多平台兼容的优势,可以很好的作为 DPDK 的 EAL 层使用.

Unikraft 作为 EAL 层会直接与 NIC 设备进行交互,将数据包传递给内部正在运行的 DPDK 主体部分,并提供相应的函数接口供其他应用程序进行调用。由于原本的设备驱动都是基于 Linux 内核开发的,我们还需要在 Unikraft 下实现一套新的驱动。