Dpdk安装和研究

7 篇文章 0 订阅
7 篇文章 0 订阅

一、Dpdk研究
1.1.安装环境ubuntu2204
1.2.安装准备工作:
1.2.1.apt-get install build-essential
1.2.2.apt-get install python3.8
1.2.3.apt-get install python3-pip
1.2.4.pip3 install meson ninja --user
1.2.5.apt install python3-pyelftools
1.2.6.apt-get install libnuma-dev
1.2.7.apt install ninja-build
1.2.8.apt install meson

1.3.编译示例应用程序
cd build
###编译helloworld范例
meson configure -Dexamples=helloworld
ninja

###编译所有的范例
meson configure -Dexamples=all
ninja
sudo ninja install

1.4.运行helloworld
在这里插入图片描述
在这里插入图片描述

1.5.查看helloworld源码:
在这里插入图片描述
在这里插入图片描述

Hello World: 一个简单的DPDK应用程序,用于初始化和配置DPDK环境。

这是一个最简单的程序了,一般所有的新的语言或者框架出来都会有一个“Hello World”,这个就是DPDK的。程序中首先使用rte_eal_init来对主线程和子线程进行创建初始化,通过管道实现它们之间的通信。然后使用RTE_LCORE_FOREACH_SLAVE宏来实现对CPU核的遍历(Master除外),而rte_eal_remote_launch就是实现的具体的函数。rte_eal_mp_wait_lcore可以理解为一种主从线程之间的同步的机制,主线程会等待所有的子线程进入等待状态后,才可以进行消息的通信。

hello_world这个例子简单展示了通过spdk来向NVM指定地址写入一段数据,然后再根据地址读出的过程,将其简单包装复用一下可以用作读写。

1.6.源码目录结构
在DPDK源码中主要的目录如下:

其中主要目录:
app:是DPDK应用程序的源码,包括测试应用代码
lib:库源码
drivers:DPDK轮询驱动代码
config:平台编译配置
usertools:DPDK提供给用户的一些工具
buildtools:编译配置脚本
devtools:设置管理脚本
mk:Makefile的相关脚本
kernel:内核相关的源码

1.7.核心部件库
DPDK主要有六个核心组件:

1、 环境抽象层(EAL):为DPDK其他组件和应用程序提供一个屏蔽具体平台特性的统一接口,环境抽象层提供的功能主要有:DPDK加载和启动;支持多核和多线程执行类型;CPU核亲和性处理;原子操作和锁操作接口;时钟参考;PCI总线访问接口;跟踪和调试接口;CPU特性采集接口;中断和告警接口等。
2、 堆内存管理组件(Malloc lib):堆内存管理组件为应用程序提供从大页内存分配对内存的接口。当需要分配大量内存小块时,使用这些接口可以减少TLB缺页。
3、 环缓冲区管理组件(Ring lib):环缓冲区管理组件为应用程序和其他组件提供一个无锁的多生产者多消费者FIFO队列API:Ring。Ring是借鉴了Linux内核kfifo无锁队列,可以无锁出入对,支持多消费/生产者同时出入队。
4、 内存池管理组件(Mem pool lib):为应用程序和其他组件提供分配内存池的接口,内存池是一个由固定大小的多个内存块组成的内存容器,可用于存储相同对象实体,如报文缓存块等。内存池由内存池的名称来唯一标识,它由一个环缓冲区和一组核本地缓存队列组成,每个核从自己的缓存队列分配内存块,当本地缓存队列减少到一定程度时,从内存缓冲区中申请内存块来补充本地队列。
5、网络报文缓存块管理组件(Mbuf lib):提供应用程序创建和释放用于存储报文信息的缓存块的接口,这些MBUF存储在内存池中。提供两种类型的MBUF,一种用于存储一般信息,一种用于存储报文信息。
6、 定时器组件(Timer lib):提供一些异步周期执行的接口(也可以只执行一次),可以指定某个函数在规定的时间异步的执行,就像LIBC中的timer定时器,但是这里的定时器需要应用程序在主循环中周期调用rte_timer_manage来使定时器得到执行。定时器组件的时间参考来自EAL层提供的时间接口。
除了以上六个核心组件外,DPDK还提供以下功能:

1) 以太网轮询模式驱动(PMD)架构:把以太网驱动从内核移到应用层,采用同步轮询机制而不是内核态的异步中断机制来提高报文的接收和发送效率。
2)报文转发算法支持:Hash 库和LPM库为报文转发算法提供支持。
3) 网络协议定义和相关宏定义:基于FreeBSD IP协议栈的相关定义如:TCP、UDP、SCTP等协议头定义。
4)报文QOS调度库:支持随机早检测、流量整形、严格优先级和加权随机循环优先级调度等相关QOS 功能。
5)内核网络接口库(KNI):提供一种DPDK应用程序与内核协议栈的通信的方法、类似普通Linux的TUN/TAP接口,但比TUN/TAP接口效率高。每个物理网口可以虚拟出多个KNI接口。

1.8.技术优点

 通过UIO技术将报文拷贝到应用空间处理,规避不必要的内存拷贝和系统调用,便于快速迭代优化。
 通过大页内存HUGEPAGE,降低cache miss(访存开销),利用内存多通道交错访问提高内存访问有效带宽,即提高命中率,进而提高cpu访问速度。
 通过CPU亲和性,绑定网卡和线程到固定的core,减少cpu任务切换。特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中。
 通过无锁队列,减少资源竞争。cache行对齐,预取数据,多元数据批量操作。
 通过轮询可在包处理时避免中断上下文切换的开销。

1.8.1.UIO(Linux Userspace I/O)
提供应用空间下驱动程序的支持,也就是说网卡驱动是运行在用户空间的,减下了报文在用户空间和应用空间的多次拷贝。
UIO技术将设备驱动分为用户空间驱动和内核空间驱动两部分,内核空间驱动主要负责设备资源分配、UIO设备注册以及小部分中断响应函数,驱动的大部分工作在用户空间的驱动程序下完成。通过UIO框架提供的API接口将UIO的驱动注册到内核,注册完成后将生成存有设备物理地址等信息的map文件,用户态进程访问该文件将设备对应的内存空间地址映射到用户空间,即可直接操作设备的内存空间,UIO技术使得应用程序可以通过用户空间驱动直接操作设备的内存空间,避免了数据在内核缓冲区和应用程序缓冲区的多次拷贝,提供数据处理效率。
在这里插入图片描述

在这里插入图片描述

1.8.2.DMA
DPDK(Data Plane Development Kit)是一个用于数据平面应用程序的开源框架,它允许用户以高效、可扩展和可编程的方式处理网络数据包。DPDK使用了一些优化技术,如轮询模式和DMA(Direct Memory Access)技术,来提高数据包处理速度和降低CPU的占用率。

下面是DPDK接管网卡并与DMA一起工作的详细流程:
DPDK初始化:首先,在启动DPDK应用程序之前,需要进行初始化。在初始化过程中,DPDK会执行设备初始化、内存分配、线程创建等操作。
网络设备选择:然后,在初始化完成后,需要选择要接管的网络设备。这可以通过调用DPDK API函数来实现。
网络设备配置:接着,需要对选定的网络设备进行配置。例如设置MAC地址、IP地址、子网掩码等参数。
DMA通道分配:为了实现零拷贝技术,需要为每个网络端口分配一个DMA通道。该通道将连接网卡和系统内存,并使得数据能够直接从网卡缓冲区传输到系统内存中而不经过CPU。
接收队列设置:然后,在DMA通道分配完成之后,需要设置接收队列(RX Queue)。该队列将作为数据包缓冲区,并且在DPDK应用程序中处理数据包时使用。
数据包接收:当网络设备接收到数据包后,它会将数据存储在RX队列中,并通过DMA通道将其传输到系统内存。此时,DPDK应用程序可以直接从内存中读取数据,而无需经过CPU拷贝。
应用程序处理:一旦DPDK应用程序获取了数据包,在进行任何其他操作之前,需要先对其进行验证和解析等操作。
数据包发送:最后,在完成必要的处理后,DPDK应用程序可以将数据包发送回网络端口。此时,可以使用TX队列来暂存待发送的数据包,并通过DMA通道将其传输到网卡缓冲区中。
总的来说,DPDK通过使用DMA技术实现了高效的零拷贝数据包传输方式。这样就减少了CPU的干预和拷贝操作,并提高了整个系统的性能和效率。

在这里插入图片描述

在这里插入图片描述

1.8.3.TLB
大页技术

处理器的内存管理包含两个概念:物理内存和虚拟内存。Linux 操作系统里面整个物理内存按帧(frames)来进行管理,虚拟内存按照页(page)来进行管理。

内存管理单元(MMU)完成从虚拟内存地址到物理内存地址的转换。内存管理单元进行地址转换需要的信息保存在一个叫页表(page table)的数据结构里面,页表查找是一种极其耗时的操作。为了减少页表的查找过程,Intel 处理器实现了一块缓存来保存查找结果,这块缓存被称为 TLB(Translation Lookaside Buffer),它保存了虚拟地址到物理地址的映射关系。所有虚拟地址在转换为物理地址以前,处理器会首先在 TLB 中查找是否已经存在有效的映射关系,如果没有发现有效的映射,也就是 TLB miss,处理器再进行页表的查找。页表的查找过程对性能影响极大,因此需要尽量减少 TLB miss 的发生。x86 处理器硬件在缺省配置下,页的大小是 4K,但也可以支持更大的页表尺寸,例如2M 或 1G 的页表。
使用了大页表功能后,一个 TLB 表项可以指向更大的内存区域,这样可以大幅减少 TLB miss 的发生。早期的 Linux 并没有利用x86 硬件提供的大页表功能,仅在 Linux 内核 2.6.33 以后的版本,应用软件才可以使用大页表功能,具体的介绍可以参见 Linux 的大页表文件系统(hugetlbfs)特性

1.9.DPDK、网卡、用户应用程序、内核之间的关系
 PMD:Pool Mode Driver,轮询模式驱动,通过非中断,以及数据帧进出应用缓冲区内存的零拷贝机制,提高发送/接受数据帧的效率。
 流分类:Flow Classification,为N元组匹配和LPM(最长前缀匹配)提供优化的查找算法。
 环队列:Ring Queue,针对单个或多个数据包生产者、单个数据包消费者的出入队列提供无锁机制,有效减少系统开销。
 MBUF缓冲区管理:分配内存创建缓冲区,并通过建立MBUF对象,封装实际数据帧,供应用程序使用。
 EAL:Environment Abstract Layer,环境抽象(适配)层,PMD初始化、CPU内核和DPDK线程配置/绑定、设置HugePage大页内存等系统初始化。

1.10.术语:
1.10.1.EAL:Environment Abstract Layer,环境抽象(适配)层,PMD初始化、CPU内核和DPDK线程配置/绑定、设置HugePage大页内存等系统初始化。
1.10.2.DMA(Direct Memory Access)技术
1.10.3.UIO(Linux Userspace I/O)
1.10.4.TLB(Translation Lookaside Buffer)

1.11.自己编译并运行helloworld
1.11.1.编译时要加上 -lrte_eal

1.11.2.修改ld.so.conf并使之生效
在这里插入图片描述

root@magma:/tmp# cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
/usr/local/lib/x86_64-linux-gnu
root@magma:/tmp# ldconfig
root@magma:/tmp# gcc -o test1 test1.c -lrte_eal
root@magma:/tmp# ./test1

1.11.2.1.否则会出现以下错误:
/test1: error while loading shared libraries: librte_eal.so.23: cannot open shared object file: ……

ldd test1,查看链接的库文件

1.12.参考链接:
https://core.dpdk.org/doc/quick-start/
https://doc.dpdk.org/api/
https://blog.csdn.net/tour_de_france/article/details/125818233
https://blog.csdn.net/fpcc/article/details/129187514
https://blog.csdn.net/hellozhxy/article/details/120710527
https://zhuanlan.zhihu.com/p/547625974

1.13.Ubuntu2204虚拟机没法上网,原因是没有安装network-nanager
apt-get install network-manager

1.14.Dpdk-testpmd运行
在这里插入图片描述

1.15.查看网络驱动:

在这里插入图片描述

在这里插入图片描述

1.16.网卡使用dpdk驱动(每次重启都需要重新加载驱动):
1.16.1.卸载并绑定网卡eth3
modprobe uio
insmod /data/f-stack/dpdk/build/kernel/linux/igb_uio/igb_uio.ko
insmod /data/f-stack/dpdk/build/kernel/linux/kni/rte_kni.ko carrier=on
/usr/local/bin/dpdk-devbind.py --status
ifconfig eth3 down
/usr/local/bin/dpdk-devbind.py --bind=igb_uio eth3

在这里插入图片描述
在这里插入图片描述

1.16.2.设置大页内存:
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

1.16.3.使用大页内存:
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge/
echo 0 > /proc/sys/kernel/randomize_va_space

cat /proc/sys/kernel/randomize_va_space

在这里插入图片描述

1.16.4.运行helloworld
在这里插入图片描述

1.16.5.dpdk-testpmd示例
在这里插入图片描述

1.17.insmod命令简介
insmod是Linux中一条命令,其作用是将一个新模块插入到内核中。在Linux系统中,模块的作用就像是扩展,可以为已安装的内核提供一些新的功能,而insmod命令就是用来加载这些模块的。

当我们需要加载新模块时,insmod命令就可以用来执行这个操作。当模块被加载成功后,也可以通过其他命令来查看已有的模块,例如lsmod。

1.17.1.insmod命令的使用方法
使用insmod命令加载模块时,需要遵循一定的格式,即:insmod [选项] 模块文件名 [模块参数]。下面对这个格式的各个部分进行解释:

选项:

-f:强制将模块加载到内核中。
-s:安静模式,减少输出的信息。
-v:详细模式,列出加载过程中的详细信息。
-f  不检查kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。
-k  将模块设置为自动卸除。
-m  输出模块的载入信息。
-o<模块名称>  指定模块的名称,可使用模块文件的文件名。
-p  测试模块是否能正确地载入kernel。
-s  将所有信息记录在系统记录文件中。
-v  执行时显示详细的信息。
-x  不要汇出模块的外部符号。
-X  汇出模块所有的外部符号,此为预设值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_45555543

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值