1.1 --> DPDK 技术框架解析

  1. DPDK 技术框架
    技术框架分为 Linux Kernel、User Space 和 应用App 三个部分。
    在这里插入图片描述
  2. 内核态模块
  • KNI 内核网卡接口
    KNI ( Kernel NIC interface 内核网卡接口)是DPDK允许用户态和内核态交换报文的渠道,KNI 模拟虚拟的网口,提供 DPDK 应用程序和 Linux 内核直接同学链接, 即 KNI 接口允许报文从用户态接收后转发到 Linux 内核协议栈中。

  • IGB_UIO
    在前面 《DPDK 实现原理解析》 中,已经介绍 igb_uio 内核模块。
    DPDK 利用 Linux 提供的UIO机制,通过read()感知中断、mmap()实现和网卡设备的通信,在 Linux 内核中安装 igb_uio.ko 模块(代替网卡驱动模块),重设中断回调函数入口参数,当网卡与 igb_uio.ko 绑定后,igb_uio接管网卡,并为 用户态 PMD 提供服务接口。

  1. 用户态模块
  • 3.1 Core Libraries 核心部件库
    核心部件库是 DPDK 面向用户态协议栈程序开发的模块,如:VPP 就是基于 DPDK的核心库接口实现的用户态协议栈应用。想学习此部分内容请参考 《 VPP 快速入门简介 》在这里插入图片描述

  • (3.1.1) EAL (Environment Abstraction Layer 环境抽象层), 对 DPDK 的运行环境进行初始化,包括:HugePage 内存分配、内存/缓冲区/队列分配、原子性无锁操作、NUMA 亲和性、CPU 绑定等,并通过 UIO 或 VFIO 技术将 PCI/PCIe 设备地址映射到用户态,方便用户态的 DPDK 应用程序调用。同时为应用程序提供通用接口,隐藏与底层库、设备交换的相关细节。

  • (3.1.2) MALLOC (堆内存管理组件),为DPDK应用程序提供从 HugePage 内、分配内存的接口,当需要为skb_buf (Socket Buffer 数据包缓冲区)分配大量的小块内存时,可调用此接口。由于堆内存是从 HugePage 内存分配的,所以可以减少 TLB 缺页。堆、是由开发人员主动分配和释放的存储空间,如果开发人员不释放,则程序结束时由 OS 回收,分配方式类似于链表;与堆不同,栈是由操作系统自动分配和释放的存储空间,用于存储函数的参数值、局部变量等。

  • (3.1.3) MBUF (网络报文缓存块管理组件), 为 DPDK 应用程序提供创建和释放、数据报文信息缓存块的接口。 提供两种类型的 MBUF,一种存储一般信息、一种存储时间的报文数据;这些 MBUF 存储在一个内存池中。

  • (3.1.4) MEMPOOL (内存池管理组件),为 DPDK 应用程序和其他组件提供分配内存池的接口,内存池是一个由固定大小的多个内存块组成的内存容器,可用于存储不同的对象实体,如: 数据报文缓存块等。内存池是由一个字符串进行唯一标识,它由一个Ring 缓冲区和一组本地缓存队列组成,每个CPU core 优先从自身的缓存队列中分配内存块,当本地缓存队列减少到一定程度时,开始从内存环缓冲区中申请内存块进行补充。

  • (3.1.5) RING (环缓冲区管理组件), 为DPDK应用程序和其他组件提供一个无锁的多生产者、多消费者的FIFO缓冲区队列。DPDK 基于 Linux 内核的无锁环形缓冲 kfifo 实现一套自己的无锁机制、 RING 环缓存区管理组件,支持单生产者/单消费者、多生产者/多消费者入列出列的操作,在数据传输时、降低性能的同时还能保住数据的同步。

  • (3.1.6) TIMER (定时器组件),提供一些异步周期执行的接口,可以指定某个函数在规定时间内的异步执行,就像LIBC 中的 timer 定时器。但是这里的定时器需要 DPDK 应用程序在主循环中周期调用 rte_timer_manage 来使能定时器,使用起来不是那么方便。

  • 3.2 Platform 操作系统平台相关模块

  • (3.2.1) KNI,主要通过 Linux 内核中的 kni.ko 模块将数据报文从用户态传递给内核态的协议栈处理,以便常规的用户进程可以使用Linux 内核协议栈、处理传统的 Socket 接口报文。

  • (3.2.2) POWER, 让 DPDK 应用程序可以根据收报速率、动态调整CPU频率、或让CPU 进入不同的休眠状态。

  • (3.2.3) IVSHMEM, 模块提供虚拟机与虚拟机间、或虚拟机与主机之间的零拷贝共享内存机制,当 DPDK 应用程序运行时、IVSHMEM 模块会调用 Core Libraries 的 API ,把几个HugePage 内存映射为一个 IVSHMEM 设备池,并通过参数传递给 QEMU ,通过此方法实现虚拟机间的零拷贝共享内存。

  • 3.3 PMD-Natives&Virtual 用户态轮询模式的网卡驱动程序
    以太网轮询模式驱动架构,把以太网驱动从内核移动到应用层,采用同步轮询机制而不是内核态的异步中断机制来提高报文的接收和发送效率。此部分内容请参考 igb_uio 部分内容。

  • 3.4 Classify 报文转发分类算法库
    支持精确匹配 (Exact Match)、最长匹配 (LPM)和 通配符匹配 (ACL)数据报文,并提供常用的包处理的查表操作。

  • 3.5 Qos 调度和流控库
    提供网络服务质量相关的组件,如:限速 (Meter) 和调度 (Scheduler),调度库支持随机早检测、流量整形、严格优先级、和加权随机循环优先级调度等。

  • 3.6 Extensions 扩展内容
    此部分内容待续…

  1. DPDK核心组件、与核心部件库关系

在这里插入图片描述
名词解释:
RTE: run time environment
EAL: environment abstraction layer
PMD: poll mode driver

librte_malloc 堆内存管理器库,提供一组API、用于从 HugePage 内存中创建 memzones 分配内存,而不是在系统用户堆中分配。这有助于改善 Linux 用户空间环境下典型 4KB 页面、而引起的TLB 不命中影响效利问题。

librte_mempool 内存池管理器,负责分配内存中的 Pool 对象。它提供一些可选择的服务,例如:每个 CPU Core 的对象缓存和对齐方式、以确保将填充的对象在所有内存通道上得到均匀分布。

librte_ring 环形队列管理器,在一个大小有限的页表中,Ring数据结构提供了一个无锁的多生产者/多消费者 FIFO API 。 相较于无锁队列,他有一些优势,例如:更容易实现、适应于大容量操作,而且速度更快。 一个 Ring 可以在 Memory Pool manager 中被使用,也可以用于不同 cpu Core 或 processor 之间作为通用的通信机制。

librte_mbuf 网络报文缓冲区管理器,用于分配、释放和操作 MBUFS 数据报文缓冲区,DPDK 应用程序中可以通过接口API、使用这些缓存区来存储信息以及报文数据。

librte_timer 定时器管理器,为 DPDK 应用程序的执行单元、提供定时服务,支持以异步方式执行函数。定时器可以设置周期调用、也可以设置为只调用一次, DPDK 应用程序可以使用 EAL 提供的 HPET 接口、来获取高精度时钟引用,并且能在每个 Core 上更加需要进行初始化。

  1. 库代码

在这里插入图片描述
参考链接:
http://doc.dpdk.org/api/
http://doc.dpdk.org/guides/prog_guide/
https://is-cloud.blog.csdn.net/article/details/105951610

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值