DPDK介绍
DPDK主要功能:利用IA(intel architecture)多核处理器进行高性能数据包处理
Linux下传统的网络设备驱动包处理的动作可以概括如下:
- 数据包到达网卡设备
- 网卡设备依据配置进行DMA操作
- 网卡发送中断,唤醒处理器
- 驱动软件填充读写缓冲区数据结构
- 数据报文到达内核协议栈,进行高层处理
- 如果最终应用在用户态,数据从内核搬移到用户态
- 如果最终应用在内核态,在内核继续进行
频繁的中断会降低系统处理数据包的速度。
DPDK可以很好的在英特尔架构下执行高性能网络数据包处理,主要使用了以下技术:
- 轮询
- 避免中断上下文切换的开销
- 用户态驱动(UIO驱动)
- 规避了不必要的内存拷贝,避免了系统调用。
- 亲和性与独占
- DPDK工作在用户态,线程的调度依然依赖内核,利用线程的CPU亲和性绑定的方式,特定任务可以被指定只在某个核上工作
- 降低访存开销
- 如内存大页,内存多通道的交错访问,NUMA系统的使用
- 软件调优
- 内存对齐,数据预取,避免跨cache行共享
- 利用IA新硬件技术
- 充分挖掘网卡的潜能
UIO驱动简介
UIO提供了用户态驱动开发的框架,主要是由于驱动依赖的内核函数和宏因内核版本变化,导致驱动可能也需要改。所以改为用户态驱动来完成任务。
dpdk中的驱动需要定期检查设备是否有中断产生,并不是用来收发数据。另外通过mmap来操作设备的设备内存。UIO框架本身要处理设备的中断,中断只能在内核态处理,uio的中断处理函数也只是增加中断的计数而已。
mmap可以处理物理内存映射,逻辑内存,内核虚拟内存映射。 UIO也是通过mmap将设备的内存映射到用户空间,当然用户态也可以通过/sys/class/uio/uioX/maps/mapX来实现对设备内存的访问,所以发送和接受数据是通过操作设备的内存来完成的。
DPDK框架简介
- 核心库Core Libs:提供系统抽象,打野内存,缓存池,定时器和无锁环等基础组件
- PMD库:提供全用户态的驱动,以便通过轮询和线程板顶得到极高的网络吞吐
- Classify库:支持精确匹配,最长匹配和通配符匹配,提供常用包处理的查表操作
- QoS库:提供网络服务质量相关组件,如限速和调度
解读简单的示例程序,初步了解DPDK
解读helloworld程序,探究DPDK运行思路
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <sys/queue.h>
#include <rte_memory.h>
#include <rte_launch.h>
#include <rte_eal.h>
#include <rte_per_lcore.h>
#include <rte_lcore.h>
#include <rte_debug.h>
static int
lcore_hello(__attribute__((unused)) void *arg)
{
unsigned lcore_id;
lcore_id = r