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层, 传输层数据