DPDK概述

文章目录

  • 1. DPDK概述
    • 1.1 DPDK 内存管理
    • Mbuf单帧结构:
    • 1.2 DPDK内核驱动 igb_uio驱动
    • 1.3 DPDK源码下载方式
    • 1.4 pktgen源码下载方式
    • 1.5 DPDK相关名词解释


1. DPDK概述

Intel DPDK全称Intel Data Plane Development Kit,是Intel提供的数据平面开发工具集,为Intel architecture(IA)处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持,它不同于Linux系统以通用性设计为目的,而是专注于网络应用中数据包的高性能处理。DPDK应用程序是运行在用户空间上利用自身提供的数据平面库来收发数据包,绕过了Linux内核协议栈对数据包处理过程。Linux内核将DPDK应用程序看作是一个普通的用户态进程,包括它的编译、连接和加载方式和普通程序没有什么两样。DPDK程序启动后只能有一个主线程,然后创建一些子线程并绑定到指定CPU核心上运行
在这里插入图片描述
DPDK 有三大法宝:
①ByPass Kernel : UIO/VFIO
②微架构优化: Cache/DDIO/SIMD
③内存管理: HugePage/mbuf/mempool

1.1 DPDK 内存管理

①hugetlbfs:
在这里插入图片描述
②Mbuf:为了高效访问数据,DPDK将内存封装在Mbuf(struct rte_mbuf)结构体内。
Mbuf主要用来封装网络帧缓存,也可用来封装通用控制信息缓存(缓存类型需使
用CTRL_MBUF_FLAG来指定)。
网络帧元数据的一部分内容由DPDK的网卡驱动写入。这些内容包括VLAN标签、RSS哈希值、网络帧入口端口号以及巨型帧所占的Mbuf个数等。
对于巨型帧,网络帧元数据仅出现在第一个帧的Mbuf结构中,其他的帧该信息为空。

Mbuf单帧结构:

在这里插入图片描述
Mbuf巨型帧结构(有多个segment):在这里插入图片描述
③Mempool:在DPDK中,数据包的内存操作对象被抽象化为Mbuf结构,而有限的rte_mbuf结构对象则存储在内存池Mempool中。内存池使用环形缓存区来保存空闲对象。
rte_mempool 内部管理是基于rte_ring(无锁队列,巧妙运用了CAS)实现的
当一个网络帧被网卡接收时,DPDK的网卡驱动将其存储在一个高效的环形缓存区中,同时在Mbuf的环形缓存区中创建一个Mbuf对象。
为了减少多核访问造成的冲突,引入了local_cache对象缓冲区。该local_cache非硬件上的cache,而是为了减少多核访问ring造成的临界区访问,coreX app会优先访问该local_cache上的对象。

在这里插入图片描述

在这里插入图片描述
④malloc: 通常,这些类型的分配不应该在数据面处理中进行,因为他们比基于池的分配慢,并且在分配和释放路径中使用了锁操作。 但是,他们可以在配置代码中使用。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
struct malloc_heap - 用于在每个插槽上跟踪可用内存空间:数据结构malloc_heap用于管理每个插槽上的可用内存空间。 在内部,每个NUMA节点有一个堆结构,这允许我们根据此线程运行的NUMA节点为线程分配内存。 虽然这并不能保证在NUMA节点上使用内存,但是它并不比内存总是在固定或随机节点上的方案更糟。
struct malloc_elem - 库内部分配和释放空间跟踪的基本要素:数据结构malloc_elem用作各种内存块的通用头结构。 它以三种不同的方式使用,如上图所示:
a).作为一个释放/申请内存的头部 – 正常使用
b).作为内存块内部填充头
c).作为内存结尾标记

1.2 DPDK内核驱动 igb_uio驱动

igb_uio驱动主要做的就是注册一个pci设备。但是igbuio_pci_driver对应的保存pci设备信息的id_table指针为空,这样在内核插入igb_uio驱动时,会找不到匹配的设备,就不会调用igb_uio驱动中的探测probe函数,只会在/sys目录下创建igb_uio相应的目录。

在这里插入图片描述
变量igbuio_intr_mode_preferred表示中断的模式,它由igb_uio驱动模块的参数intr_mode决定,有MSIX中断和Legacy中断两种模式,默认的是MSIX中断模式(我们修改成了默认是MSI模式
那么何时调用igb_uio驱动中的probe函数?在下面的测试说明中有提到,进行加密设备绑定(bind)时会进行probe。
进行设备bind时igb_uio驱动做了什么?
记录设备的资源:igb_uio驱动也会遍历PCI设备的BAR空间,但是它不会直接使用功能BAR空间的物理地址,而是调用ioremap函数将物理地址映射为虚拟地址,驱动在内核态读写操作映射出来的虚拟地址
注册一个uio设备:在Linux上的驱动设备一般都是运行在内核态的,提供接口函数给用户态函数调用即可。而新引入的UIO技术,则是将驱动的大部分事情移到了用户态。前面讲到probe函数会记录设备的资源,具体而言就是PCI设备BAR空间的物理地址、大小等信息记录下来传给用户态。除了记录BAR空间资源信息,uio框架还会在内核态实现中断处理相关的初始化工作。

内核uio驱动框架
①背景: 通常一些非标准设备的驱动被实现为字符驱动。这些驱动使用了很多内核内部函数和宏。而这些内部函数和宏是变化的。这样驱动的编写者必须编写一个完全的内核驱动,而且一直维护这些代码。而且这些驱动进不了主内核源码。于是就出现了用户空间I/O框架(Userspace I/O framework)

②原理:UIO(Userspace I/O)是运行在用户空间的I/O技术。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能。
在这里插入图片描述

a).开发运行在内核的UIO模块,因为硬中断只能在内核处理
b).通过/dev/uioX读取中断
c).通过mmap和外设共享内存

在这里插入图片描述

1.3 DPDK源码下载方式

①DPDK官网: http://core.dpdk.org/download/
②DPDK git仓库(该仓库只能clone): git://dpdk.org/dpdk-stable
③某github主仓库(该仓库可以导入成私有仓库,便于git管理):https://github.com/chaudron/dpdk-stable

1.4 pktgen源码下载方式

DPDK pktgen官网: git://dpdk.org/apps/pktgen-dpdk

1)下载后,查看pktgen-dpdk的git tag,切换到与dpdk版本对应的tag

$ git tag

我测试用的dpdk版本是18.11, 经编译对比测试,dpdk18.11选用pktgen-3.7.2最为合适

$ git checkout pktgen-3.7.2

2)切换到tag pktgen-3.7.2后, 直接输入make即可

3)编译好后,生成的app/x86_64-native-linuxapp-gcc/pktgen就是我们要的发包工具

在这里插入图片描述
注:pktgen编译可能需要的前提步骤如下:

$ pip3 install --user meson
$ pip3 install --user ninja

Ubuntu16.04安装lua5.3

$ sudo apt install liblua5.3-dev
$ sudo apt remove liblua5.3-dev #若要删除的话

1.5 DPDK相关名词解释

DPDK: Data Plane Development Kit: 数据平面开发工具包
EAL: Environment Abstraction Layer: 环境抽象层/环境适配层
NIC: Network Interface Cards: 网卡
PMD: Poll Mode Driver: (基于用户态的)轮询模式驱动
UIO: Userspace I/O: 运行在用户空间的I/O技术
RTE: RunTime Environment: 运行环境?
SDK: Software Development Kit: 软件开发工具包
另外关于SEC snoop ICV含义:
ICV: Integrity Check Value: 完整性检查值, 用于内部进行hash计算,并比较计算结果是否与预期值相同(正确: job output ring status返回0, 错误:返回其它值:0x2000004a)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十三章 Nest Middleware

在上一章我们了解到Nest 并不直接依赖Express 可以切换到别的http 请求处理库 创建项目: nest new middleware-test -p npm创建 middleware : nest g middleware test --no-spec --flat这时候可以看到 req 和 res 的类型都是为 any类型 所以并不知道使…

算法力扣刷题记录 二十八【225. 用队列实现栈】

前言 栈和队列篇。 记录 二十八【225. 用队列实现栈】 一、题目阅读 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void p…

centos7 安装redis

在 CentOS 7 上配置 Redis 5 的步骤如下: 1. 安装依赖 Redis 是由 C 语言开发的,因此在安装之前需要确保服务器已经安装了 gcc。你可以通过以下命令查看是否已经安装: gcc -v 如果没有安装,可以通过以下命令安装: yu…

实验四 SQL的数据定义语句

题目 通过SQL语句创建名为ecommerce1的数据库:CREATE DATABASE ecommerce1 2、在数据库ecommerce1中练习模式的创建和删除语句(如给用户li创建一个学生管理模式“S-T”)(需要先添加一个用户li) 3、在数据库ecommerce1中…

7月4号直播预告 | 全国产EtherCAT运动控制器ZMC432HG及其EtherCAT总线使用

EtherCAT运动控制边缘控制器是工业互联网的关键组件之一,结合丰富的运动控制功能、实时数据采集、处理和本地计算等,具备高度灵活的可编程性和出色的运动控制性能,为运动控制协同工业互联网应用带来巨大市场潜力,同时也使其成为企…

【必会面试题】快照读、当前读是什么?如何理解

目录 1. 当前读(Current Read)2.快照读(Snapshot Read)3.总结流程图 快照读和当前读是MySQL数据库的重要机制,也是高频的面试题。首先我们要知道以下几个概念。 缓存机制:缓存是系统中用于存储经常访问的数据的内存空间…

中英双语介绍美国的州:北达科他州(North Dakota)

中文版 北达科他州简介 北达科他州(North Dakota)位于美国中西部的北部,以其广袤的草原、丰富的农业资源和石油产业而闻名。以下是对北达科他州的详细介绍,包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 北达…

ID3算法决策树

步骤: 先计算出信息量;信息熵;信息增量; 再比较信息增量的大小,确定分类依据。 信息量: 信息熵: 信息增益:

Android View滑动冲突解决方案

文章目录 前言1. 滑动冲突2. 解决方案2.1 外部解决法2.2 内部拦截法 参考资料 前言 本文需要读者对View事件分发的流程有基本的了解,如果还未完全理解事件分发流程的,需要先学习相关部分内容,这部分可以参考我的上一个博客: And…

Postman使用教程

传统接口风格 RESTful风格 使用Postman完成测试用例目标: Postman教程 (1)准备工作,下载Postman新建 (2)登录接口调试-获取验证码 (3)登录接口调试-登录 (4)…

线程的联合

当前线程邀请调用方法的线程优先执行,在调用方法的线程执行结束之前,当前线程不能再次执行。线程A在运行期间,可以调用线程B的join()方法,让线程B和线程A联合。这样,线程A就必须等待线程B执行完毕后,才能继…

Mysql查询IFNULL和想象的不一样

select sum(ifnull(a,0)) aaa,ifnull(sum(a),0) bbb from (select g.goodsid a from goods g where g.goodsid 601 ) tmp #注意 goodsid 601 的不存在 ​​​ 返回的结果和想象中不同,解释如下 在您SQL查询中,创建了一个子查询(别名为tmp&a…

【深度解析】滑动窗口:目标检测算法的基石

标题:【深度解析】滑动窗口:目标检测算法的基石 目标检测是计算机视觉领域的一个核心任务,旨在识别图像中所有感兴趣的目标,并确定它们的位置和大小。滑动窗口方法作为目标检测中的一种传统技术,虽然在深度学习时代逐…

Linux 操作系统详解

前言 Linux 是一个强大且开源的操作系统,以其稳定性、灵活性和安全性广受欢迎。它在个人计算机、服务器、嵌入式系统以及超级计算机等多个领域得到广泛应用。本文将从多个角度深入探讨 Linux 的历史、架构和主要特性,为初学者和专业人士提供全面的理解和…

Linux_管道通信

目录 一、匿名管道 1、介绍进程间通信 2、理解管道 3、管道通信 4、用户角度看匿名管道 5、内核角度看匿名管道 6、代码实现匿名管道 6.1 创建子进程 6.2 实现通信 7、匿名管道阻塞情况 8、匿名管道的读写原子性 二、命名管道 1、命名管道 1.1 命名管道通信 …

国内外大模型集合

为了满足日益增长的AI需求,我们精心打造了一站式大模型导航网站,旨在成为连接您与全球顶尖人工智能模型的桥梁。无论您是科研工作者、开发者还是对AI充满好奇的探索者,这里都有您所需。 国内大模型精选 通义千问 —— 阿里巴巴集团倾力打造…

某业帮六月校招后端笔试

题目一 解题思路 签到题,dp就行。 题目二 解题思路 这个比较烦人,需要处理额外的引号和括号。用DFS,对于每个间隙,插入与不插入都搜一遍。 题目三 解题思路: 双指针,左右各一个指针,对比长度&…

OpenLCA、GREET、R语言的生命周期评价方法、模型构建

原文链接:OpenLCA、GREET、R语言的生命周期评价方法、模型构建教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608240&idx6&sn1b5758206d500399fe7cc69e800f61fe&chksmfa826657cdf5ef413d31557941a1c5db5cc84bba8d0f408c469e05a4118c…

#LinuxC高级 笔记一

linux命令 什么是嵌入式? 以应用为中心,以计算机技术为基础,软件硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统 计算机系统组成? 硬件、软件 操作系统? ios windows harmo…

k8s_集群搭建_k8s管理前端_dashboard安装部署---分布式云原生部署架构搭建017

然后再去安装一下一个dashboard,有了这个以后,操作k8s集群就不用 一直敲命令了 可以看到上面的命令拿过来,然后 执行就可以了 然后如果执行慢,可以直接先去下载,使用wget,然后再去 也可以在浏览器访问,把内容拿到,然后 下面是内容: # Copyright 2017 The Kubernetes Author…