概述
官网一句话介绍,简单明了:
DPDK is the Data Plane Development Kit that consists of libraries to accelerate packet processing workloads running on a wide variety of CPU architectures.
DPDK能够在x86,POWER和ARM等多种处理器上运行,它具有如下特点:
- 基于Open Source BSD License开源
- 在最少CPU时钟周期内实现数据包的收发
- 用于开发类似于tcpdump的快速抓包算法
在诸如路由器、负载均衡、防火墙、视频流、VoIP等应用领域,网络性能、吞吐量和延时在当今的网络通信中越来越重要。DPDK通过极速的包处理速度,使得通信厂商把对性能要求极高的移动基础网络转移到云上成为可能。
DPDK由Intel创建于2010年,并开源许可。在开源社区的卓越贡献下,DPDK现在已经能够支持所有主流的CPU架构。
dpdk编译与安装
下载源码
官网地址:https://www.dpdk.org/,或者直接点击DPDK官方网站
编译
- 解压
tar xf dpdk.tar.gz
cd dpdk
- 使能pcap
make config T=x86_64-native-linuxapp-gcc
sed -ri 's,(PMD_PCAP=).*,\1y,' build/.config
- 编译
make
- 保留大页内存
mkdir -p /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
echo 64 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
dpdk原理分析
环境抽象层
DPDK架构通过创建EAL(Environment Abstraction Layer,环境抽象层)来为不同的工作环境创造函数库集,创建后开发者即可把自己的应用与函数库进行链接。
DPDK的环境抽象层向应用与函数库隐藏了底层环境的细节,因而能扩展到任何处理器上使用。
DPDK的创造的环境抽象层(EAL, Environment Abstraction Layer)主要负责对计算机底层资源(如硬件和内存空间)的访问,并对提供给用户的接口实施了实现细节的封装。其初始化例程决定了如何分配这些资源(PCI设备、计时器、控制台等)。
EAL提供的典型服务包括:
- 加载和启动DPDK:DPDK及其应用程序会被链接为单一应用,因此需要通过某种方式进行加载DPDK。
- 核关联/分配过程:EAL提供了将执行单元分配给特定核并创建执行实例的机制。
- 预留系统内存:EAL为预留不同的内存区域提供便利,例如用于设备交互的物理内存区域。
- 抽象PCI地址:EAL提供了访问PCI地址空间的接口。
- 跟踪和调试功能:日志、堆栈转储等。
- 实用的功能:libc中所没有提供的自旋锁和原子计数器。
- CPU功能识别:在运行时确定CPU是否支持特定功能,确定当前CPU是否支持编译产生的二进制指令集。
- 中断处理:向特定中断源注册/注销回调的接口。
- 时钟功能:用于设置/删除在特定时间运行的回调函数接口。
轮询模式驱动
DPDK使用了轮询(polling)而不是中断来处理数据包。在收到数据包时,经DPDK重载的网卡驱动不会通过中断通知CPU,而是直接将数据包存入内存,交付应用层软件通过DPDK提供的接口来直接处理,这样节省了大量的CPU中断时间和内存拷贝时间。
DPDK包括1Gb,10Gb,40Gb和半虚拟化抽象层的轮询模式驱动(PMD, Poll Mode Driver)。PMD由用户空间的特定的驱动程序提供的API组成,用于对设备和它们相应的队列进行设置。抛弃了基于中断的异步信号发送机制为该架构带来很大的开销节省。避免中断性能瓶颈是DPDK提升数据包处理速度的关键之一。
总结
DPDK具有极高的数据包处理速度,可以用来自定义包处理流程,接替内核实现数据包的收发。
DPDK与代理应用结合可以组成一个完备的网关,实现数据包的深度解析和过滤。
此文只是简单介绍,后面继续学习。