EAL

首先必须明白的一点就是, DPDK 是以若干个 lib 的形式提供给应用链接使用,其中最终要的一个 lib 就是 EAL 了, EAL 的全称是(Environment Abstraction Layer, 环境抽象层),它负责为应用间接访问底层的资源,比如内存空间、线程、设备、定时器等。如果把我们的应用比作一个豪宅的主人的话, EAL 就是这个豪宅的管家。

lcore & socket

这两个概念在 DPDK 的代码中随处可见, 注意 这里的 socket 不是网络编程里面的那一套东西,而是 CPU 相关的东西。具体的概念可以参看 Differences between physical CPU vs logical CPU vs Core vs Thread vs Socket 或者其翻译版本 physical CPU vs logical CPU vs Core vs Thread vs Socket(翻译) 。

对我们来说,只要知道可以 DPDK 可以运行在多个 lcore 上就足够了.

DPDK 如何知道有多少个 lcore 呢 ? 在启动时解析文件系统中的特定文件就可以了, 参考函数 eal_cpu_detected

组成模块

  • rte_timer,包装提供内核的Time-Stamp Couter(TSC)时间服务,让异步执行函数成为可能
  • rte_malloc,从memzones中分配大页,相较于4K heap pages,页表项更少,TLB命中率更高。
  • rte_ring,固定大小的环形缓存区,lockless multi-producer, multi-consumer,bulk/burst-enqueue/dequeue的FIFO队列管理API. 其中per-lcore变量通过Thread Local Storage(TLS)提供per-thread local storage.
  • rte_mempool,分区pool,pool使用name标记并使用ring分配objects.
  • rte_mbuf, 用于提供对mbuf(ctrlmbuf + pktmbuf)的管理,mbuf存储在mempool中
  • rte_eal + libc, EAL(Environment Abstration Layer)提供对上述的接口,隐藏App和Lib之间的环境细节。如:Alarm操作、中断处理、CPU特性识别(rte_cpu_get_feature)、Trace和Debug功能、PCI总线访问、原子锁操作、内存分配、Core亲和性、多进程&多线程、librte_hash(包转发算法), librte_lpm (Longest Prefix Match,包转发算法),librte_net)。EAL通过/sys向用户空间呈现PCI信息(/sys/bug/pci)与address space,EAL用igb_uio模块用户空间提供/dev/uidX设备文件,应用就可以使用mmap /dev/uidX到PCI address space。用户空间采用了pthread库。DPDK包括1G和10G的PMDs(Poll Mode Drivers), 及没有异步和中断信息机制的virtio控制器。

内存管理

一个连续的内存块通过rte_memseg来描述,再通过memzone的概念来聚集(可使用rte_eal_get_configuration()来访问)。
使用aligh参数来对齐数据(2的指数倍但不大于64 bytes)。memzone可以保留2MB或1G的大页。
CONFIG_RTE_MALLOC_DEBUG参数可以帮助调试缓存区溢出错误。
librte_malloc用于分配任意大小的内存,在NUMA中,是分配该core所在的NUMA socket还是其它socket上的内存由参数显然决定。常见两个数据结构:

  • malloc_heap, 管理per-socket上的free内存(每个NUMA node上有一个heap结构),numa_socket, mz_count, lock, free_head.
  • malloc_elem,memzone中各种管理对象的通用头部描述,heap, prev, next_free, state, padding, size.

KNI接口

DPDK提供了两种方法与linux kernel协议栈交互: TAP和KNI。KNI(Intel DPDK Kernel NIC Interface)允许用户应用访问Linux控制平面,可以让TUN/TAP设备省去系统调用和数据拷贝(copy_to_user()/copy_from_user())的时间,也可以允许应用使用kernel tcp/ip栈及使用标准的的管理工具如ethtool, ifconfig,tcpdump等(/dev/kni)。

DPDK的运行形式

大部分 DPDK 的代码是以 lib 的形式运行在用户应用的进程上下文.为了达到更高的性能。应用通常都会 多进程 或者 多线程 的形式运行在不同的 lcore 上

多线程的场景:

多进程的场景:

多进程的场景下,多个应用实例如何保证关键信息(比如内存资源)的一致性呢? 答案是不同进程将公共的数据 mmap 同一个文件,这样任何一个进程对数据的修改都可以影响到其他进程。

Primary & Secondary

多进程场景下,进程有两种角色 Primary 或者 Secondary ,正如其名字, Primary 进程可以 create 资源,而 Secondary 进程只能 attach 已存在的资源。一山不容二虎,一个多进程的应用,有且只有一个 Primary 进程,其余都是 Secondary 进程。应用可以通过命令行参数 --proc-type 来指定应用类型。

DPDK的入口

如同 main 函数在应用程序中的地位, rte_eal_init 函数便是 DPDK 梦开始的地方(其实前面的图已经画出来了!),我们来看看它做了什么事。

/* Launch threads, called at application init(). */
int
rte_eal_init(int argc, char **argv)
{thread_id = pthread_self();rte_eal_cpu_init();eal_parse_args(argc, argv);rte_config_init();rte_eal_intr_init();rte_mp_channel_init();rte_eal_memzone_init();rte_eal_memory_init();rte_eal_malloc_heap_init()eal_thread_init_master(rte_config.master_lcore);RTE_LCORE_FOREACH_SLAVE(i) {/* create a thread for each lcore */ret = pthread_create(&lcore_config[i].thread_id, NULL,eal_thread_loop, NULL);.....}/** Launch a dummy function on all slave lcores, so that master lcore* knows they are all ready when this function returns.*/rte_eal_mp_remote_launch(sync_func, NULL, SKIP_MASTER);rte_eal_mp_wait_lcore();......
}

原文链接:https://www.codercto.com/a/59815.html

DPDK 初识DPDK(十五)相关推荐

  1. 《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)

    Table of Contents Open vSwitch(OVS)中的DPDK性能加速 174.虚拟交换机简介 175.OVS简介 176.DPDK加速的OVS 177.OVS的数据通路 178. ...

  2. [系统安全] 四十五.APT系列(10)Metasploit后渗透技术信息收集、权限提权和功能模块详解

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  3. 【DPDK】dpdk样例源码解析之五:dpdk-rss

    本篇文章介绍DPDK-RSS相关的功能,RSS是网卡提供的分流机制,简单讲就是一个HASH值,如果使用DPDK收包,开启RSS后,会根据配置项将数据包分流到不同的收包队列,用来是实现负载均衡. 通过D ...

  4. 【Visual C++】游戏开发五十五 浅墨DirectX教程二十二 水乳交融的美学:alpha混合技术

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/15026917 作者:毛星 ...

  5. 【DPDK】DPDK 入门介绍

    博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 文章目录 DPDK 入门介绍 网络IO的处境和趋势 Linux + x86网络IO瓶颈 DPDK的基本原理 DPDK旁 ...

  6. 2021年大数据HBase(十五):HBase的Bulk Load批量加载操作

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的Bulk Load批量加载操作 一.Bulk L ...

  7. 2021年大数据Hadoop(二十五):YARN通俗介绍和基本架构

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 YARN通俗介绍和基本架构 Yarn通俗介绍 Yarn基本 ...

  8. 2021年大数据Hadoop(十五):Hadoop的联邦机制 Federation

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Hadoop的联邦机制 Federation 背景概述 F ...

  9. 十五天精通WCF——第六天 你必须要了解的3种通信模式

    十五天精通WCF--第六天 你必须要了解的3种通信模式 原文:十五天精通WCF--第六天 你必须要了解的3种通信模式 wcf已经说到第六天了,居然还没有说到这玩意有几种通信模式,惭愧惭愧,不过很简单啦 ...

最新文章

  1. AspNetPager 样式以及使用(漂亮)
  2. css样式之 direction
  3. java用一张一元票换一分,java测试试卷一
  4. 用asp.net还原与恢复sqlserver数据库(转)
  5. OpenMP参考链接
  6. python自动答题软件_广东开放大学(广开)线上作业自动答题python-selenium
  7. C# 制作指示灯(经典)
  8. Codeforces Round #345 (Div. 1) D. Zip-line 上升子序列 离线 离散化 线段树
  9. 时序动作定位:Rethinking the Faster R-CNN Architecture for Temporal Action Localization(TAL-Net)
  10. 哪些NPM仓库更易遭供应链攻击?研究员给出了预测指标
  11. Python3——使用exec和eval执行字符串及计算其结果
  12. OpenCR介绍以及自制OpenCR
  13. Java支付宝APP支付-统一收单交易退款
  14. Latex学习笔记——总篇(入门、图片、表格、数学公式、伪代码、代码块、参考文献)
  15. 使用开源的协同办公OA项目,实现规范高效的公文管理
  16. 启明云端分享|IDO-SOM3568:可用于轻量级人工智能应用
  17. 《Python编程快速上手——让繁琐工作自动化》第2版的中文版上市了
  18. maven 打包跳过单元测试
  19. 【Vue学习笔记】尚硅谷Vue2.0+Vue3.0全套教程丨vue.js从入门到精通
  20. 期货开户加一分高交返靠谱吗?

热门文章

  1. python3版本之间的区别-python3.6与3.4版本的区别是什么?
  2. python表白-python3实现表白神器
  3. 下列不属于python第三方库的是-python后端开发工程师考证试题
  4. python语言程序设计嵩天-Python语言程序设计基础(第2版)嵩天课后答案
  5. python和java哪个-Python和Java两门编程语言,学习哪个更好?
  6. python财务报表分析-用Python爬取东方财富网上市公司财务报表
  7. python语言怎么用-在python语言中,如何使用注释
  8. 为什么叫python编程-为什么建议大家学习Python编程呢?老男孩Python入门
  9. python的none是什么-Python中的None与Null(空字符)的区别
  10. python使用os和shutil模块进行文件创建,删除,移动,复制,重命名