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…

实验四 SQL的数据定义语句

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

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

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

ID3算法决策树

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

Postman使用教程

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

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_管道通信

目录 一、匿名管道 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…

登 Cell 子刊!清华大学张强锋课题组开发 SPACE 算法,组织模块发现能力领先同类工具

多细胞生物中的细胞尽管共享相同的基因组,但因其内部基因调控网络的差异以及与周围微环境中相邻细胞的外部信号交流,使得它们在形态、基因表达和功能上展现出显著的多样性。为了将细胞类型信息与其在组织内的空间位置相关联,空间转录组学 (Sp…

Vue86-Vuex中的getters属性

一、getters的使用 1-1、index.js中getters的书写 计算属性computed靠return获得返回值! 1-2、组件中getters的调用 state是数据源,getters是拿着数据源里的东西进行一番加工。像极了:data和computed 二、小结

vue 启动项目报错Syntax Error: Error: PostCSS received undefined instead of CSS string

启动vue项目然后报错如下图 这个是跟node版本有关系 因为要开发不同的项目使用不同的node版本,所以就用nvm切换,所以导致了node-sass编译问题 执行这个命令就可以 npm install node-sass or npm rebuild node-sass node-sass对于node高版本和低版本切…

智能胎教仪,科技与教育的融合-N9301胎教仪语音方案

随着科学技术的不断进步,人们对婴幼儿教育的认知也日趋成熟和全面。其中,胎教作为一种重要的早期教育方式,近年来备受瞩目。而胎教仪语音芯片的研发,正是为了满足这一需求,为胎儿的健康成长提供更加便捷的胎教方案。 一…

Tomcat服务部署安装

一、Tomcat基础 1.Tomcat简介 Tomcat服务器是一个免费的开放源代码的Web应用服务器,Tomcat虽然和Apache或者Nginx这些Web服务器一样,具有处理HTML页面的功能,然而由于其处理静态HTML的能力远不及Apache或者Nginx,所以Tomcat通常…

“LNMP环境搭建实战指南:从零开始配置CentOS 7下的Nginx、MySQL与PHP“

目录 1.前言 2.准备工作 2.1.环境信息 2.2.关闭SELinux和firewalld 3.安装Nginx 3.1.运行以下命令,安装Nginx 3.2.运行以下命令,查看Nginx版本 4.安装MySQL 4.1.更新秘钥 4.2.配置MySQL的YUM仓库 4.3.安装MySQL 4.4.查看MySQL版本 4.5.启动…

Springboot+Vue3开发学习笔记《1》

SpringbootVue3开发学习笔记《1》 博主正在学习SpringbootVue3开发,希望记录自己学习过程同时与广大网友共同学习讨论。 一、前置条件 博主所用版本: IDEA需要破解,破解工具链接容易挂,关注私聊我单发。 Spring Boot是Spring提…