DPDK 简介
DPDK 是 高效处理数据包的一系列函数和驱动。它不同于 Linux 系统以通用性设计为目的,而是专注于网络应用中数据包的高性能处理。
DPDK不使用Linux内核的协议栈处理网络数据,而是在用户空间实现了一套数据平面来进行数据包的收发与处理。在内核看来,DPDK 就是一个普通的用户态进程,它的编译、连接和加载方式和普通程序没有什么两样。
DPDK 源代码的 kernel部分采用GPL2 开源协议, 其他部分采用BSD-3 协议
high-performance packet processing applications
Core
- ring manager (多线程无锁FIFO API) librte_ring
- Memory Pool Manager (内存池管理) librte_mempool
- Network Packet Buffer Manager(网络包管理) libret_mbuf
- 时间 librte_timer
Ethernet Poll Mode Driver 架构 (PMDs)
- 基于用户态轮询, 区别于异步, 基于中断处理
- run-to-completion
- pipe-line
Packet forwarding algorithm
- 包转发算法
- hash
- lpm
net
- ip 协议族 ipv4/ipv6 tcp/udp/sctp/…
- DPDK(虚)
- EAL (Environment Abstraction Layer)
- 内核网络存在的问题 网卡->dma->中断 内核协议栈 ->socket 唤醒
- 中断处理, 内存拷贝, 上下文切换,局部性失效等等
- DPDK 解决的问题
- DPDK 控制层, 数据层
- 多核技术
- NUMA 亲和
- 大页内存
- 无锁技术
- DPDK 基本原理
- 硬件中断—>放弃中断流程
- 用户层通过设备映射取包->进入用户层协议栈->逻辑层->业务层
- 内核态 通过 UIO 能够拦截中断,并重设中断回调行为,从而绕过内核协议栈后续的处理流程
- uio, vfs实现: 抽象文件-> /dev/uioX
- 用户空间实现poll-mode 驱动读取 /dev/uioX
- 大页内存, 无锁环形队列
- 用户空间跳过了内核栈
- 解码 数据链路层的数据
- 分析ip层, 传输层数据