DPDK 架构和关键技术
概念和术语
随着互联网的高速发展、云产业的快速突起, 基础架构网络逐渐偏向基于通用计算平台或模块化计算平台的架构融合,以支持多样化和大数据下的网络功能, 传统的 PC 机器在分布式计算平台上的优势更为明显。在这些针对海量数据处理或海量用户的服务场景,高性能编程显得尤为重要。 DPDK 应运而生。
DPDK 英文全称为 Data Plane Development Kit,DPDK 是一套源码编程库,或者可以说是一个开源的数据平面开发工具集,可以为 Intel Architecture(IA)处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持,它不同于Linux 系统以通用性设计为目的,而是专注于网络应用中数据包的高性能处理。
DPDK 通过环境抽象层旁路内核协议栈、轮询模式的报文无中断收发、优化内存/缓冲区/队列管理、基于网卡多队列和流识别的负载均衡等多项技术,实现了在 x86 处理器架构下的高性能报文转发能力,目前已经验证可以运行在大多数 Linux 操作系统上,包括 FreeBSD 9.2、Fedora release18、Ubuntu 12.04 LTS、 RedHat Enterprise Linux 6.3 和 Suse Enterprise Linux 11 SP2 等。 DPDK 使 用了 BSD License,极大的方便了企业在其基础上来实现自己的协议栈或者应用。 用户可以在 Linux 用户态空间开发各类高速转发应用,也适合与各类商业化的数据平面加速解决方案进行集成。
英特尔在 2010 年启动了对 DPDK 技术的开源化进程, 于当年 9 月通过 BSD 开 源许可协议正式发布源代码软件包,并于 2014 年 4 在 www.dpdk.org 上正式成立了独立的开源社区平台, 为开发者提供支持。开源社区的参与者们大幅推进了DPDK 的技术创新和快速演进,而今它已发展成为 SDN 和NFV 的一项关键技术。
主要术语:
DPDK:Data Plane Development Kit,DPDK 是一套源码编程库, 可以为 Intel处理器提升基础数据平面功能。
FreeBSD:FreeBSD 是一种 UNIX 操作系统,是由经过 BSD、386BSD 和 4.4BSD 发展而来的 Unix 的一个重要分支。 FreeBSD 为不同架构的计算机系统提供了不 同程度的支持。它是一个自由的(英文 free 也可以说是免费的)类 UNIX 操作系统 (Unix-like),经由 BSD UNIX 由 AT&T UNIX 衍生而来,FreeBSD 由于法律原因不 能称为 UNIX,但由于直接衍生于 BSD UNIX,并且一些原来 BSD UNIX 的开发者后 来转到 FreeBSD 的开发,使得 FreeBSD 在内部结构和系统 API 上和 UNIX 有很大的兼容性。
KNI:Kernel NIC Interface 是 DPDK 提供的一种允许用户空间应用程序访问的 Linux 协议栈的接口,类似于 linux 的TUN/TAP。
UIO:linux Userspace I/O 子系统,是运行在用户空间的 I/O 技术。Linux系统中一般的驱动设备都是运行在内核空间, 而在用户空间用应用程序调用即可, 而 UIO 则是将驱动的很少一部分运行在内核空间, 而在用户空间实现驱动的绝大多数功能。使用 UIO 可以避免设备的驱动程序需要随着内核的更新而更新的问题。
VFIO:Virtual Function I/O 是一套用户态驱动框架, VFIO 由平台无关的接 口层与平台相关的实现层组成, 它提供两种基本服务: 向用户态提供访问硬件设备的接口、向用户态提供配置 IOMMU 的接口。
DPDK架构介绍
DPDK 的组成架构如下图所示,在最底部的内核态(Linux Kernel)DPDK 有 两个模块:KNI 与 IGB_UIO。其中, KNI 提供给用户一个使用 Linux 内核态的协 议栈,以及传统的 Linux 网络工具(如 ethtool, ifconfig)。IGB_UIO(igb_uio.ko 和 kni.ko. IGB_UIO)则借助了 UIO 技术, 在初始化过程中将网卡硬件寄存器映射到用户态。
DPDK 的上层用户态由很多库组成,主要包括核心部件库(Core Libraries)、 平台相关模块(Platform)、网卡轮询模式驱动模块(PMD-Natives&Virtual)、 QoS 库、报文转发分类算法(Classify)等几大类, 用户应用程序可以使用这些
库进行二次开发,下面分别简要介绍。
核心部件库:该模块构成的运行环境是建立在 Linux 上,通过环境抽象层 (EAL)的运行环境进行初始化, 包括: HugePage 内存分配、内存/缓冲区/队列分 配与无锁操作、CPU 亲和性绑定等; 其次, EAL 实现了对操作系统内核与底层网卡 I/O 操作的屏蔽(I/O 旁路了内核及其协议栈) ,为 DPDK 应用程序提供了一 组调用接口,通过 UIO 或 VFIO 技术将 PCI 设备地址映射到用户空间,方便了 应用程序调用, 避免了网络协议栈和内核切换造成的处理延迟。另外, 核心部件还包括创建适合报文处理的内存池、缓冲区分配管理、内存拷贝、以及定时器、环形缓冲区管理等。
平台相关模块:其内部模块主要包括 KNI、能耗管理以及 IVSHMEM 接口。其 中,KNI 模块主要通过 kni.ko 模块将数据报文从用户态传递给内核态协议栈处 理,以便用户进程使用传统的 socket 接口对相关报文进行处理;能耗管理则提 供了一些 API,应用程序可以根据收包速率动态调整处理器频率或进入处理器的 不同休眠状态; 另外,IVSHMEM 模块提供了虚拟机与虚拟机之间, 或者虚拟机与 主机之间的零拷贝共享内存机制,当 DPDK 程序运行时, IVSHMEM 模块会调用核心部件库 API,把几个 HugePage 映射为一个 IVSHMEM 设备池,并通过参数传递给 QEMU,这样,就实现了虚拟机之间的零拷贝内存共享。
轮询模式驱动模块:PMD 相关 API 实现了在轮询方式下进行网卡报文收发, 避免了常规报文处理方法中因采用中断方式造成的响应延迟, 极大提升了网卡收 发性能。此外, 该模块还同时支持物理和虚拟化两种网络接口, 从仅仅支持 Intel 网卡,发展到支持 Cisco、Broadcom、Mellanox、Chelsio 等整个行业生态系统,以及基于 KVM、VMWARE、 XEN 等虚拟化网络接口的支持。
DPDK 还定义了大量 API 来抽象数据平面的转发应用,如 ACL、QoS、流分类 和负载均衡等。并且,除以太网接口外, DPDK 还在定义用于加解密的软硬件加速接口(Extensions)。
总体而言,DPDK 技术具有如下特征:
(1)采用 BSD License,保证了可合法用于商业产品
(2)支持 RedHat、CentOS、Fedora、Ubuntu 等大多数 Linux 系统,已开始进入主流 Linux 发布版本。
(3)DPDK 支持 Run to Completion 和 Pipeline 两种报文处理模式,用户可以依据需求灵活选择,或者混合使用。Run to Completion 是一种水平调度方式,利用网卡的多队列,将报文分发给多个 CPU 核处理,每个核均独立处理到达该队 列的报文,资源分配相对固定, 减少了报文在核间的传递开销, 可以随着核的数 目灵活扩展处理能力;Pipeline 模式则通过共享环在核间传递数据报文或消息,将系统处理任务分解到不同的 CPU 核上处理, 通过任务分发来减少处理等待时延。
(4)DPDK 的库函数和样例程序十分丰富,包括 L2/L3 转发、Hash、 ACL、QoS 等大量示例供用户参考,具体可访问http://dpdk.org/doc/guides/sample_app_ug/index.html
大页技术
x86 处理器硬件在缺省配置下, 页的大小是 4K,但也可以支持更大的页表尺 寸, 例如 2M 或 1G 的页表。使用了大页表功能后, 一个 TLB 表项可以指向更大的 内存区域,这样可以大幅减少 TLB miss 的发生。早期的 Linux 并没有利用 x86 硬件提供的大页表功能,仅在 Linux 内核 2.6.33 以后的版本,应用软件才可以 使用大页表功能,具体的介绍可以参见 Linux 的大页表文件系统(hugetlbfs)特性。
DPDK 则利用大页技术,所有的内存都是从 HugePage 里分配,实现对内存池(mempool)的管理,并预先分配好同样大小的 mbuf,供每一个数据包使用。
轮询技术
为了减少中断处理开销,DPDK 使用了轮询技术来处理网络报文。网卡收到报 文后,直接将报文保存到处理器 cache 中(有 DDIO(Direct Data I/O)技术的 情况下),或者保存到内存中(没有 DDIO 技术的情况下),并设置报文到达的 标志位。应用软件则周期性地轮询报文到达的标志位,检测是否有新报文需要处 理。整个过程中完全没有中断处理过程, 因此应用程序的网络报文处理能力得以极大提升。
CUP亲和技术
CPU 亲和技术,就是将某个进程或者线程绑定到特定的一个或者多个核上执行,而不被迁移到其它核上运行,这样就保证了专用程序的性能。
DPDK 使用了 Linux pthread 库, 在系统中把相应的线程和 CPU 进行亲和性绑定, 然后相应的线程尽可能使用独立的资源进行相关的数据处理。
DPDK的应用模型
DPDK技术应用优势
(1)提供高性能网络处理能力。
(2)友好的商业许可证。
(3)Intel 主推,业界比较认可,产品可靠性和稳定性较高。
(4)主流网卡厂商基本都有支持。
(5)支持 KVM\XEN\Vmware 等主流虚拟化平台。
DPDK初始化和转发流程
在 Host 上运行用户态 EVS,借助于 DPDK 的网卡管理 API 和大页内存,来提升物理网卡收发包性能和处理能力。
虚拟机启动时,在 XML 中配置为 vhost-usr 类型虚拟网卡, qemu 保证vhost-usr 后端驱动可以直接访问大页内存中的报文。
用户态 EVS 和 vhost-user 后端驱动之间通过共享收发队列的内存来传递报文,利用批处理、轮询机制和多核转发提升报文处理能力。
初始化流程
在创建 vswitch 实例时,支持创建用户态 EVS 类型,通过 dpdk 高速数据通道从物理网卡收包,然后批量转发,将报文交给 VM 虚拟网卡后端驱动 vhost-user, 再交给 VM 虚拟网卡;或者从 VM 虚拟网卡后端驱动 vhost-user 收包,然后批量转发,将报文交给物理网卡,物理网卡将报文发送出去。
批量转发流程
初始化完成后,在转发线程内进行轮询,遍历当前线程所服务的每个端口, 尝试接收一组报文,然后对每个报文做转发判断,找到目的端口后暂时存放在该目的端口的缓存数组中,当前端口的这些报文都处理结束后,再处理下一个端口。期间如果某个目的端口的缓存数组已满,则直接刷新发送出去。