本章节给出了DPDK架构的一个全局概述。

DPDK的主要目的就是为数据面快速报文处理应用程序提供一个简洁完整的框架。用户可以通过代码来理解其中使用的一些技术,构建自己的应用程序或添加自己的协议栈。Alternative ecosystem options that use the DPDK are available。

通过创建环境抽象层(EAL),DPDK框架为每个特殊的环境创建了一组运行库。这个库特定于Intel架构(32或64位),Linux*用户空间编译器或其他特定的平台。这些环境通过一些makefile和配置文件创建。一旦EAL库编译完成,用户可以通过链接这些库来构建自己的应用程序。除了EAL,还有一些其他的库,包括哈希算法、最长前缀匹配、环形缓冲区等。DPDK提供了一些应用程序实例来指导如何使用这些特定来创建自己的应用程序。

DPDK实现了报文处理的RTC模型,在这种模型中,数据面应用程序在调用之前必须预先分配好所有的资源,并作为执行单元运行在逻辑核上。这种模型并不支持调度,且所有的设备通过轮询的方式访问。不使用中断方式的主要原因就是中断处理增加了性能开销。

作为RTC模型的扩展,通过使用Ring在不同逻辑核之间传递报文和消息,也可以实现报文处理的流水线模型(Pipeline)。流水线模型允许操作分阶段进行,在多核代码执行中可能更高效。

2.1.开发环境

DPDK工程创建要求Linux环境及相关的工具链,例如一个或多个编译工具、汇编程序、make工具、编辑器及DPDK组件用到的库。

当指定环境和架构的库编译出来时,这些库就可以用于创建我们自己的数据面处理程序。

创建Linux用户空间应用程序时,需要用到glibc库。对于DPDK应用程序,必须使用两个全局环境变量(RTE_SDK和RTE_TARGET),这两个变量需要在编译应用程序之前配置好:

  1. export RTE_SDK=/home/user/DPDK
  2. export RTE_TARGET=x86_64-native-linuxapp-gcc

也可以参考《DPDK入门指南》来获取更多搭建开发环境的信息。

2.2.环境适配层

环境适配层为应用程序和库提供了通用的接口,隐藏了底层环境细节。EAL提供的服务有:

  • DPDK的加载和启动
  • 多线程和多进程执行方式支持
  • CPU亲和性设置
  • 系统内存分配和释放
  • 原子操作和锁操作
  • 定时器引用
  • PCI总线访问
  • 跟踪调试功能
  • CPU特性识别
  • 中断处理
  • 警告操作
  • 内存管理

EAL更详细的描述请参阅本文档“环境适配层”章节。

2.3.核心组件

核心组件指的是一系列库,用于为高性能包处理程序提供所有必须的元素。核心组件及其之间的关系如下图所示:

Figure 2 1 Core Components Architecture

2.3.1.环形缓冲区管理(librte_ring)

Ring数据结构提供了一个无锁的多生产者,多消费者的FIFO表处理接口。相对于无锁队列来讲,它容易部署,适合大量的操作,而且更快。Ring库在“内存池库(librte_mempool)”中使用,而且,ring还用于不同逻辑核上处理单元之间的通信。

环形缓冲区及其使用可以参考章节“环形缓冲区库”描述。

2.3.2.内存池管理(librte_mempool)

内存池管理的主要职责就是在内存中分配指定数目对象的Pool。每个Pool以名称来唯一标识,并且使用一个Ring来存储空闲的对象节点。它还提供了一些其他的服务,如对象节点的每核缓存备份,及自动对齐以保证对象能够均衡分布到内存通道上。

内存池分配器的具体行为请参考章节“内存池库”描述。

2.3.3.网络报文缓冲区管理(librte_mbuf)

报文缓冲区库提供了创建和销毁报文缓冲区的能力,DPDK应用程序中使用这些缓冲区来存储消息。这些缓冲区通常在程序开始时通过DPDK的内存池库(librte_mempool)申请并存储在内存池中。缓冲区库(librte_mbuf)提供了报文申请和释放的API,通常情况下,消息Buffer用于缓存消息,报文Buffer用于缓存网络报文。

报文缓冲区管理的具体行为请参考章节“缓冲区库”描述。

2.3.4.定时器管理(librte_timer)

这个库位DPDK的执行单元提供了定时器服务,为函数异步执行提供支持。定时器可以设置成周期调用,或者只调用一次。使用EAL提供的接口可以获取高精度时钟,并且能在每个核上根据需要初始化。

具体请参考章节“定时器库”描述。

2.4.以太网轮询模式驱动架构

DPDK的PMD驱动支持1G、10G、40G。 同时DPDK提供了虚拟的以太网控制器,被设计成非异步,基于中断信号的模式。

详细内容参考 章节“轮询模式驱动”描述。

2.5.报文转发算法支持

DPDK提供了哈希(librte_hash)、最长前缀匹配(librte_lpm)算法库用于支持相应的分组转发算法。

详细内容查看章节“哈希算法” 和“最长前缀匹配” 。

2.6.网络库(librte_net)

这个库包括IP协议的一些定义及常见的宏定义。这些定义都是基于FreeBSD*中IP协议栈的代码,包括协议号(用于IP头部)、IP相关的宏、IPv4/IPv6头部结构体以及TCP、UDP和STCP头部结构体。

原文链接:http://www.jianshu.com/p/3a843bb24333

 
  1.  
  2. 作者:半天妖
    链接:http://www.jianshu.com/p/3a843bb24333
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

DPDK编程指南 2.概述的更多相关文章

  1. Linux平台上DPDK入门指南

    1. 简介 本文档包含DPDK软件安装和配置的相关说明.旨在帮助用户快速启动和运行软件.文档主要描述了在Linux环境下编译和 运行DPDK应用程序,但是文档并不深入DPDK的具体实现细节. 1.1. ...

  2. 索引器(C# 编程指南)

    原文地址:https://msdn.microsoft.com/zh-cn/library/6x16t2tx(VS.80).aspx 索引器允许类或结构的实例按照与数组相同的方式进行索引.索引器类似于 ...

  3. C#泛型(C#_编程指南)CSDN学习整理笔记

    1.1. 泛型概述 2.0版C#语言和公共语言运行时(CLR)中增加了泛型.泛型将类型参数的概念引入.NETFramework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定 ...

  4. 物联网操作系统HelloX应用编程指南

    HelloX操作系统应用编程指南 HelloX应用开发概述 可以通过三种方式,在HelloX操作系统基础上开发应用: 1.        以内部命令方式实现应用,直接编译链接到HelloX的内核she ...

  5. Apache Spark 2.2.0 中文文档 - Spark 编程指南 | ApacheCN

    Spark 编程指南 概述 Spark 依赖 初始化 Spark 使用 Shell 弹性分布式数据集 (RDDs) 并行集合 外部 Datasets(数据集) RDD 操作 基础 传递 Functio ...

  6. Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南 | ApacheCN

    Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Inp ...

  7. Structured Streaming Programming Guide结构化流编程指南

    目录 Overview Quick Example Programming Model Basic Concepts Handling Event-time and Late Data Fault T ...

  8. 《JavaScript面向对象编程指南》读书笔记②

    概述 <JavaScript面向对象编程指南>读书笔记① 这里只记录一下我看JavaScript面向对象编程指南记录下的一些东西.那些简单的知识我没有记录,我只记录几个容易遗漏的或者精彩的 ...

  9. 《JavaScript面向对象编程指南》读书笔记①

    概述 JavaScript快忘完了,想看一本专业书拾遗,所以看了这本<JavaScript面向对象编程指南>. 个人觉得这本书讲的很透彻很易懂,一些原来有疑惑的地方在这本书里面豁然开朗,看 ...

随机推荐

  1. python之MongoDB学习

    import pymongo as pm # 获取连接 client = pm.MongoClient('localhost', 27017) # 端口号是数值型 # 连接数据库 db = clien ...

  2. java 如何将实体bean和map互转化 (利用Introspector内省)

    // 将一个map对象转化为bean public static void transMap2Bean(Map<String, Object> map, Object obj) { try ...

  3. JS给html控件赋值

    <html> <head> <title> JS给html控件赋值 </title> <script language="javascr ...

  4. ubuntu14.04 编译安装CPU版caffe

      本文,试图中一个干净的ubuntu14.04机器上安装caffe的cpu版本. http://blog.csdn.net/sinat_35188997/article/details/735304 ...

  5. 四.mysql演示银行转账

    代码演示: #conding:utf8 import pymysql import sys class TransferMoney(object): def __init__(self,conn): ...

  6. WTForms In Flask(WTForms在Flask中的应用)

    WTForms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 安装wtforms : pip3/pip install wtforms 用户登录/注册示例 项 ...

  7. R-CNN for Small Object Detection

    R-CNN for Small Object Detection 文章方法概括 这篇文章主要讨论针对小目标的目标检测 文章为了证明:对传统R-CNN style的方法进行改进,可以用于小目标检测,并且 ...

  8. MySQL按时间查找

    RecentMutations表的结构如图,现在的需求是需要查找到2017年09月08日前10天的变体总数: SQL语句:SELECT SUM(MutantNumber) FROM RecentMut ...

  9. knockout 学习使用笔记------绑定值时赋值失败

    在使用knockout绑定值的时候,发现无论怎么赋值都赋值失败,最后检查前端页面才发现,同一个属性绑定值的时候,绑定了两次,而在js中进行属性绑定的时候是双向绑定的,SO,产生了交互影响.谨记之. 并 ...

  10. Spring.Net+NHibernate+Castle学习网站

    1.刘冬  http://www.cnblogs.com/GoodHelper/archive/2009/10/16/1584243.html 2.学习资料 http://www.cnblogs.co ...