dpdk课程学习之公开课基础知识整理(uio,dma,vfio,大内存页理解)

简介: dpdk课程学习之公开课基础知识整理(uio,dma,vfio,大内存页理解)

本文内容仅来源于一次免费试听课,以及自己理解整理,未经过严谨验证,如果有误,请指点。

1:介绍

dpdk是软件,是一个应用程序,是linux环境中的一个进程,是用户层控制的。

dpdk场景:交换机,路由器等以网络传输/网络计算为主的相关业务扩展,多队列网卡,多个网卡,与dpdk配合可以灵活进行各种业务扩展。

2:linux内核当前对网络数据的处理

3:引入dpdk接管网卡数据

3.1:dpdk接管网卡数据,而不是内核处理

由上文可以看到,网络数据通过网卡接收后,由操作系统内核协议栈进行处理(内核协议栈是写死的,用户不可控的)。

dpdk可以实现对数据的接管,网络数据不在走内核,即把数据的控制由内核转移到用户应用层,实现对网卡数据的有效控制。

3.2:dpdk如何实现l网卡数据的接管

理解:dpdk是一个应用程序,运行在操作系统上的一个进程。

实现对网卡数据的接管有以下方案:

1:UIO(Userspace I/O):运行在用户空间的I/O技术(将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能)。

2:dma(映射内存的方式)。

3:vfio(Virtual Function I/O):一套支持DMA Remapping和Interrupt Remapping和框架,可以开发用户态驱动,也可以实现设备透传。(简单理解链接:VFIO概述_OnePiece-CSDN博客_vfio

思考了一下,接管网卡数据其实就是让网卡接收到的数据能在应用层识别到的内存中识别。

3.3:网卡的一些基础知识

网卡是插在PCI总线上,一个PCI总线上可以有多个网卡。

dpdk uio绑定网卡,其实就是在PCI这里绑定网卡对应的地址。

想了想数据的交互:应该是硬件/软件中断触发, 与驱动程序适配各内存(队列,ring_buff等结果)交互的过程。

4:dpdk开发框架介绍

4.1:初始环境配置

4.1.1:学习可以使用vmware+操作系统+dpdk
4.1.2:适配环境,配多个网卡(联网和dpdk测试),网卡多队列(虚拟机是vmxnet3),大内存

===》虚拟机配置网络适配器增加网卡,网卡是虚拟出来的。

===》多队列网卡,有多个中断,对应多个队列。

4.1.3:有关环境vmware+linux+dpdk搭建,以及多多列网卡基础知识,可以参考我实践过的:

dpdk预备学习环境准备之多队列网卡认识及测试_yun6853992的博客-CSDN博客_dpdk多队列

dpdk环境搭建及运行helloworld测试_yun6853992的博客-CSDN博客

dpdk测试环境搭建(vmware下ubuntu环境参考上文汇总流程)_yun6853992的博客-CSDN博客

4.1.4:linux操作系统下,/proc/目录是系统启动生效生成的配置文件临时文件夹,可以查看一些相关参数。

查看多队列网卡的情况: cat /proc/interrupts |grep eth0

4.1.5:修改虚拟机网卡支持多队列是在虚拟机目录下vmx文件。
4.1.6:虚拟机下配置大内存页(提高性能,虚拟页地址转为物理地址)

大内存页:虚拟内存转为物理内存的过程中,需要通过页表查找,使用页进行交互。

===》默认交互大小是4k

===》如果提升至2M或1G进行交互,可以减少页表的大小,页表的页数(命中更高),减少缺页中断(能描述更大内存了)

参考理解:Linux HugePages(大内存页) 原理与使用 - 知乎 (zhihu.com)

修改支持大内存页是修改 cat /etc/default/grub,并需要sudo update-grub后重启

虚拟机配置信息是:

default_hugepages=1G hugepagesz=2M hugepages=1024 isolcpus=0-2

这里配置了默认的页的大小为1G,配置了页的大小为2M,页的个数为1024个。

保留1024个2M的页用于虚拟地址的交互。 ===》这块内存我们是不可用的

hugepagesz的参数设置通常是4k,2M,1G

疑问default_hugepages 和hugepagesz 两个参数的区别???,default_hugepages 有什么意义?

net.ifnames=0 biosdevname=0

控制网卡名为传统的eth格式

4.2:./usertools/dpdk-setup.sh脚本对dpdk进行配置

1:根据目标操作系统,生成对应的库。

2:执行43,插入uio模块,用于接管网卡数据(uio绑定网卡对应的PCI上的地址)

==》执行前需要设置环境变量

3:执行44,插入vFIO模块,是用于接管网卡数据的框架(dma+中断)===>个人简单了解后理解

4:执行45,插入kni模块,提供的内核接口,将数据写入内核中,交给内核继续处理网络数据。

6:执行46或47,是设置巨页的个数,默认大小是2M,如果设置为512,则这里巨页用的内存大小为512*2M=1G

===>46和47的差异是页的统一编码和非统一编码。

7:执行49,网卡的绑定,这里会显示系统上已有的网卡,输入vmxnet3(支持多队列)的网卡最前面的一段标识字段(PCI总线上的地址)

===》在绑定前需要确定对应的网卡down,确定绑定成功

===》IGB UIO(IGB是实例,UIO是框架,方法),49的描述就是uio的一个实例绑定。则可以绑定多个

8:执行60,退出。

==》可以基于dpdk已有的库,已经设置的配置进行实例测试

==》dpdk是一个进程,所以重启环境后相关配置会失效。

==》使用ifconfig -a查看相关网卡,发现看不到dpdk绑定的网卡。

4.3:分析dpdk绑定网卡为何能接管数据(理论)

linux中使用struct net_device结构体来描述每一个网络设备,多个网络设备是通过链表的方式链接在一起的,所以ifconfig -a可以查看到相关网卡信息。

ifconfig查到的ethx <=>网卡(虚拟机网络适配器,是vmware工具层的)<=>net_device

dpdk的绑定网卡,会接管网卡中的数据,并且把绑定的网卡从内核net_device 链表中移除。

==》所以该网卡接收到的数据就由dpdk处理,内核无法识别到了

5:汇总

dpdk是一个进程,所有的基础基于接管网卡,接收网卡数据。

dpdk初始化,提供了一些可以配置的入参(如-l 0-3表示运行的cpu -p表示运行的端口 – 表示本进程参数 -表示运行时环境参数设置)

dpdk是一套已经成熟的框架,文档比较齐全,资料比较多。

dpdk的开发生态

===>ovs(Open vSwitch): 持多层数据转发的高质量虚拟交换机

===>VPP: 基于dpdk实现的一套数据控制面的框架,以Plugin插件的形式已经提供了很多的业务功能。

===>**spdk:**存储性能开发套件,优化本地存储io性能。

参考免费课程链接:https://ke.qq.com/course/417774?flowToken=1040954

目录
相关文章
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
66 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
5月前
|
存储 C语言
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
355 1
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
55 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
5月前
|
NoSQL Java Redis
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
84 0
|
5月前
|
缓存 Java
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
50 0
|
5月前
|
编译器 C语言 C++
C语言学习记录——位段(内存分配、位段的跨平台、位段的应用)
C语言学习记录——位段(内存分配、位段的跨平台、位段的应用)
57 0
|
3月前
|
存储 JavaScript 前端开发
学习JavaScript 内存机制
【8月更文挑战第23天】学习JavaScript 内存机制
34 3
|
5月前
|
C语言 C++
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
65 3
|
5月前
|
C语言
C语言学习记录——通讯录(静态内存)
C语言学习记录——通讯录(静态内存)
32 2
|
5月前
|
存储 编译器 C语言
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)一
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)一
60 2