本章节给出了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),这两个变量需要在编译应用程序之前配置好:

export RTE_SDK=/home/user/DPDK
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

 

作者:半天妖
链接: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全栈开发-第6天 is&==

    1.小数据池 2.id 3.decode和encode 小数据池 #小数据池:不要死磕就行#python为了简化,搞出来的一个东西 ID (1)# id()函数可以帮我们查看一个变量的内存地址# a= ...

  2. Storm-源码分析汇总

    Storm Features Storm 简介 Storm Topology的并发度 Storm - Guaranteeing message processing Storm - Transacti ...

  3. python split(),os.path.split()和os.path.splitext()函数用法

    https://blog.csdn.net/T1243_3/article/details/80170006   # -*- coding:utf-8 -*- """ @ ...

  4. You must reset your password using ALTER USER

    mac mysql error You must reset your password using ALTER USER statement before executing this statem ...

  5. 【转】HTTP缓存机制

    前言 Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个基础环节,同时对于有志成为前端架构师的同学来说是必备的知识技能.但是对于很多前端同 ...

  6. 【我的Android进阶之旅】Android Studio查看Logcat时,如果一行Log太长如何换行显示?

    使用Android Studio一段时间了,还有很多小技巧没有掌握.今天又发现了一个比较好用的小技巧,这里分享出来. 1.Android Studio默认显示效果 比如我们用Logcat来查看打印的L ...

  7. golang的极简流式编程实现

    传统的过程编码方式带来的弊端是显而易见,我们经常有这样的经验,一段时间不维护的代码或者别人的代码,突然拉回来看需要花费较长的时间,理解原来的思路,如果此时有个文档或者注释写的很好的话,可能花的时间会短 ...

  8. Python3.6写socket程序

    Python进行Socket程序编写使用的主要模块就是 socket 模块,在这个模块中可以找到 socket()函数,该函数用于创建套接字对象.套接字也有自己的方法集,这些方法可以实现基于套接字的网 ...

  9. 分页和Cookie、Session

    分页和Cookie.Session 分页 自定义分页 函数班 from django.shortcuts import render # Create your views here. data = ...

  10. LeetCode:简化路径【71】

    LeetCode:简化路径[71] 题解参考天码营:https://www.tianmaying.com/tutorial/LC71 题目描述 给定一个文档 (Unix-style) 的完全路径,请进 ...