[dpdk] 读开发指南(1)

该文档是随着对于文档的阅读进度,不断增加的阅读笔记。主要内容以大纲为主,以及记录帮助记忆的内容。

在之后的实际应用中,也不随着不断的深入理解,逐渐丰富各大纲下面的内容。

1. 前期准备:设置两个环境变量。

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

2. dpdk提供的环境抽象层:

  • DPDK loading and launching                        DPDK与应用程序一起被链接为一个可执行程序。
  • Support for multi-process and multi-thread execution types
  • Core affinity/assignment procedures             提供CPU绑定能力。
  • System memory allocation/de-allocation       可以预留物理内存,用于设备交互。
  • Atomic/lock operations                                   libc中未提供的操作,自旋锁,原子计数等。
  • Time reference
  • PCI bus access                                              提供访问PCI物理空间的接口。
  • Trace and debug functions                             提供调试功能,日志,调用栈,panic等。
  • CPU feature identification                               运行时CPU特性感知。
  • Interrupt handling
  • Alarm operations
  • Memory management (malloc)

2.1  DPDK程序运行在用户态,同时使用用户态 PCI 驱动 UIO,使用mmap将设备内存映射入用户态。

2.2 使用大页内存。

  基于大页内存,可以在应用程序中,完成大页内存的申请分配与预留。

  XEN dom0 不支持大页,需要使用 rte_dom0_mm 详见文档

需要进一步详细跟紧和了解的技术细节:TSC(CPU Time-Stamp Counter),HPET kernel API, mmap

2.3 初始化流程,多核心调度与处理。

  初始化过程中的资源分配是线程不安全的。但是初始化完成之后,资源便可以在各线程中安全的同时使用了。

2.4 除了多线程,还支持多进程。

2.5 提供程序日志API,可以替换系统syslog和console日志,用于程序的日志输出。

  rte_panic 用于调试

2.6 用户态网卡中断响应

  突然莫名冒出来个缩写 DPDK PMD。 PMD是啥?

2.7 Memory Segments and Memory Zones

  为每一个文件描述符分配连续的内存空间,并按照cache line size 或 hugepage 对齐。

2.8 多线程

  每个core只绑定一个pthread

  控制电源管理,开启最大性能。

  控制单核内多线程上下文切换。

2.9 cgroup control  不懂啊,学啊

  原文档例:

mkdir /sys/fs/cgroup/cpu/pkt_io
mkdir /sys/fs/cgroup/cpuset/pkt_io

echo $cpu > /sys/fs/cgroup/cpuset/cpuset.cpus

echo $t0 > /sys/fs/cgroup/cpu/pkt_io/tasks
echo $t0 > /sys/fs/cgroup/cpuset/pkt_io/tasks

echo $t1 > /sys/fs/cgroup/cpu/pkt_io/tasks
echo $t1 > /sys/fs/cgroup/cpuset/pkt_io/tasks

cd /sys/fs/cgroup/cpu/pkt_io
echo 100000 > pkt_io/cpu.cfs_period_us
echo  50000 > pkt_io/cpu.cfs_quota_us

2.10 Malloc

  dpdk提供类似系统调用的malloc函数 rte_malloc(), 一般在程序运行过程中,这个malloc会比基于pool的malloc慢很多,且有锁。 可以在配置相关的代码中使用,而不要的数据处理的单代码中使用。

  内存大小使用2的幂将支持自动对齐,并且会基于numa优化,在对应node中分配。但是并不保证一定在这个node上?!?!?!(没看懂,请参见原文档,并欢迎联系我指导我)

2.10.1 内部数据结构 malloc_heap

  很简单,一个链表指向所有未分配的内存。已使用的内存在free()时会被重新联入链表。

2.10.2  内部数据结构 malloc_elem

  使用场景一:作为所有内存块(分配/未分配)的头。

  使用场景二:padding header

  使用场景三:end of memseg marker

3. 核心组件:

3.1 librte_ring 多读多写的无锁队列结构。可以被 librte_mempool 所使用。

  无优先级概念,任何入队(出队)操作都不比其他入队(出队)操作拥有更高的优先级。

3.2 librte_mempool 内存对象池,提供cpu cache对齐,内存对齐等能力。

3.3 librte_mbuf 内存申请释放管理。

3.4 librte_timer 就是timer呗

3.5 网卡驱动,论询方式,不使用异步中断。

3.6 包转发算法,Hash LPM(Longest Profix Match)

3.7 librte_net 协议栈,包头结构等。

4. RING LIBRARY

  • FIFO
  • Maximum size is fixed, the pointers are stored in a table
  • Lockless implementation
  • Multi-consumer or single-consumer dequeue
  • Multi-producer or single-producer enqueue
  • Bulk dequeue - Dequeues the specified count of objects if successful; otherwise fails
  • Bulk enqueue - Enqueues the specified count of objects if successful; otherwise fails
  • Burst dequeue - Dequeue the maximum available objects if the specified count cannot be fulfilled
  • Burst enqueue - Enqueue the maximum available objects if the specified count cannot be fulfilled

The advantages of this data structure over a linked list queue are as follows:

  • Faster; only requires a single Compare-And-Swap instruction of sizeof(void *) instead of several double-Compare-And-Swap instructions.
  • Simpler than a full lockless queue.
  • Adapted to bulk enqueue/dequeue operations. As pointers are stored in a table, a dequeue of several objects will not produce as many cache misses as in a linked queue. Also, a bulk dequeue of many objects does not cost more than a dequeue of a simple object.

The disadvantages:

  • Size is fixed
  • Having many rings costs more in terms of memory than a linked list queue. An empty ring contains at least N pointers.

其他特点:

  1. 使用唯一的名字标示。

  2. 水位警戒线,超过警戒线,调用者会被告知。

  3. debug调试。基于单核的计数信息。

使用场景:

  1. 应用程序间通信交互。

  2. 由 mempool allocate。

操作原理(无锁原理):

  略。有一本书<<深入浅出dpdk>>,已读过,补充了CPU等知识后,记得回来复看。

补充阅读:

  http://lwn.net/Articles/340400/

5. Mempool Library

  A memory pool is an allocator of a fixed-sized object。 默认使用 rte_ring, 言外之意也可以用别的。还提供其他功能:a per-core object cache and an alignment helper to ensure that objects are padded to spread them equally on all DRAM or DDR3 channels.

5.1 支持debug功能,提供基于core的计数。

5.2 内存对齐

  命令行指定 channel数,rank数?

5.3 local cache

   compare-and-set (CAS) operation. CPU指令?

5.4 Mempool handlers

  使用外部的内存管理系统,代替dpdk。

6. Mbuf Library

  提供内存的alloc和free能力。

6.1 Packet Buffers

  一种已经设计好的,用于存储网络包的内存数据结构。

6.2 Meta information

  内存中会存储各种包内容相关的信息。值得一提的时发包的时候,可以将一部分内容委派给网卡进行硬件计算。

6.3 Direct and Indirect buffers

  简单理解indirect buffer 是对 Dierct buffer的引用。通过特定的API,进行引用的创建和传递。

6.4 Debug

  Mbuf相关的操作都会开启严格的检验,严格类型,脏数据等。

(未完待续。。。)

时间: 2024-10-02 03:40:05

[dpdk] 读开发指南(1)的相关文章

智捷公开课马上开始了-欢迎大家一起讨论学习-第一系列读《Swift开发指南(修订版) 》看Swift视频教程

引用: 智捷课堂携手51CTO学院.图灵教育联合举办iOS线上培训就业班系列体验公开课. 分享移动开发.移动设计方向最新,最热,最抢眼技术热点以及设计经验.我们每周将最少举办一次公开课,同时会提前安排公开课进度.关于公开课内容,我们将选择时下热门技术与大家分享,同时我们也希望能与大家进行交流,并搜集大家想了解的热点与大家分享. 直播时间1月16日至2月10日,每周二.周四晚8:00-9:30. 直播方式Q%Q群直播亲们可以根据自己关注的热点,选择加入相应的Q#Q群: iOS技术直播Q%Q群: 3

读《asp.net MVC4开发指南(黄保翕编著)》笔记

在刚刚过去的中秋节中,利用了两天的碎片时间把黄保翕编著的<asp.net MVC4 开发指南>看了遍,笔记如下,欢饮在开发MVC的同学一起来探讨: 1.社区 2.开源程序 3.易测试性 4.reflector 工具 5.ASP.NET 生命周期 6.注释加TODO标记,就会出现在任务列表里面 7.代码段管理器 8.扩展和更新 9.Json.net 10.Razor语法来写view,@html 11.model.controller.action的属性 12.model binder 和 少用r

转:Oculus Unity Development Guide开发指南(2015-7-21更新)

http://forum.exceedu.com/forum/forum.php?mod=viewthread&tid=34175 Oculus Unity Development Guide开发指南转载请保留原始地   http://t.cn/RAblKoh Oculus/GearVR开发者群 302294234 Welcometo the Unity Development GuideIntroduction简介Welcometo the Oculus Unity Developer Gui

融云IM 基础服务开发指南WebIMLib API 示例 【干货】

Web SDK API 示例 简介 融云 Web SDK API 用法及常见异常总结,为了方便刚接触融云 Web SDK 开发者朋友们写下此文档,希望可以帮到你们. 说明: 1.函数参数中使用 [] 为可选参数(数组除外). 2.**** => **** 在本文档中表示为示例代码和结果,例:1+2 => 3. 初始化 初始化 SDK 执行初始化需要在开发者后台新建应用得到 AppKey 和 token,初始化代码: RongIMLib.RongIMClient.init(appkey,[dat

Boost程序库完全开发指南——深入C++“准”标准库(第3版)

内容简介  · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Boost 社区开发并维护,使用了许多现代C++编程技术,内容涵盖字符串处理.正则表达式.容器与数据结构.并发编程.函数式编程.泛型编程.设计模式实现等许多领域,极大地丰富了C++的功能和表现力,能够使C++软件开发更加简捷.优雅.灵活和高效. <Boost程序库完全开发指南——深入C++“准”标准库(

Vista/Win7 UAC兼容程序开发指南

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

Linux 汇编语言开发指南

一.简介 作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能.就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分.由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能. 大多数情况下 Linux 程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在 L

开发指南专题二:JEECG微云高速开发平台JEECG框架初探

开发指南专题二:JEECG微云高速开发平台JEECG框架初探 2.JEECG框架初探 2.1演示系统 打开浏览器输入JEECG演示环境界址:http://demo.jeecg.org:8090/能够看到如图21所看到的的登录界面., 图21演示系统登录界面 点击[登陆]button,进入演示系统的主界面,如图22所看到的. 图22演示系统主界面 在JEECG演示系统中的功能模块包含系统管理.流程管理.业务申请.业务办理.经常使用功能演示等.当中,用户管理.流程设计器的界面截图如图23和图24所看

Knockout应用开发指南

第一章:入门 1.Knockout简介 (Introduction) Knockout是一个轻量级的UI类库,通过应用MVVM模式使JavaScript前端UI简单化. Knockout有如下4大重要概念: 声明式绑定 (Declarative Bindings):使用简明易读的语法很容易地将模型(model)数据关联到DOM元素上. UI界面自动刷新 (Automatic UI Refresh):当您的模型状态(model state)改变时,您的UI界面将自动更新. 依赖跟踪 (Depend