立聪堂德州十三局店 发表于 2024-8-7 07:38:06

Linux网络编程之dpdk的环境设置详解

一、dpdk是什么?

DPDK(Data Plane Development Kit)是一个高性能的数据平面开发工具包,它为快速数据包处理提供库和驱动程序。DPDK主要用于网络应用中,如网络假造化、网络安全、负载均衡、防火墙和其他网络功能,它旨在提供快速、可扩展的网络数据包处理能力。
DPDK的主要特点包括:

[*]用户空间数据处理:DPDK将网络数据包处理从内核空间转移到用户空间,避免了传统内核空间处理中的上下文切换和系统调用开销,从而提高了处理速度。
[*]高性能:DPDK通过使用优化的数据包处理算法和零拷贝技术,淘汰了数据在内存中的复制次数,提高了数据处理的效率。
[*]可扩展性:DPDK支持多核处理,可以在多个CPU核心上并行处理数据包,提高了系统的可扩展性。
[*]丰富的网络协议支持:DPDK支持多种网络协议,包括TCP、UDP、IP、VLAN、MPLS等。
[*]兼容性:DPDK可以在多种Linux发行版上运行,并且可以与现有的网络应用和框架集成,如Open vSwitch、OpenStack等。
DPDK通常用于以了局景:


[*]网络假造化:在假造化环境中,DPDK可以提高假造交换机和假造路由器的性能。
[*]高性能网络应用:如高速缓存、负载均衡器、防火墙等,DPDK可以提供所需的高性能网络处理能力。
[*]SDN(软件界说网络):在SDN架构中,DPDK可以用于实现快速的数据平面处理,支持网络流量的快速转发和控制。
DPDK是一个开源项目,由Intel发起,并得到了社区的支持和贡献。由于其高性能和机动性,DPDK在需要高速网络处理的场景中得到了广泛的应用。
二、dpdk的环境设置

多队列网卡是什么?

多队列网卡(Multi-Queue NIC)是一种网络接口卡(NIC),它支持将网络流量分发到多个处理队列中,以提高系统的网络处理性能和吞吐量。传统上,单队列网卡只有一个硬件队列用于处理所有的输入和输出流量,这可能会成为瓶颈。通过使用多队列网卡,可以将输入和输出流量分发到差别的硬件队列中,并在多核系统上进行并行处理。这样可以减轻单个队列的负载压力,并充分使用系统资源来提高网络处理效率。
多队列网卡通常需要操作系统和驱动程序的支持才能实现,因为操作系统需要将流量公道地分发到各个队列,并确保数据包按照顺序精确地发送和接收。同时,应用程序也需要针对多队列进行优化,以充分发挥多队列网卡的性能优势。
多队列网卡的关键特性包括:

[*]并行处理:通过多个队列,可以在多个CPU核心上并行处理网络流量,提高网络吞吐量和降低延迟。
[*]负载均衡:操作系统可以根据当前的网络负载和CPU使用情况,动态地调解流量分配,实现负载均衡。
[*]提高可靠性:如果一个队列出现故障或过载,其他队列可以接管其工作,从而提高系统的整体可靠性。
[*]硬件加速:多队列网卡通常配备有硬件加速功能,如TCP卸载(TOE)和假造化支持,进一步优化网络性能。
[*]支持高级网络功能:多队列网卡支持高级网络功能,如假造局域网(VLAN)、网络假造化(NVGRE、VXLAN)和流量监控等。
多队列网卡在数据中央、云计算和高性能计算环境中尤为紧张,它们可以显著提高网络性能,满意这些环境对高网络吞吐量和低延迟的需求。
怎么判定是否为多队列网卡?

cat /proc/interrupts | grep <网卡名>
如果结果只有一行,则不是多队列网卡
https://i-blog.csdnimg.cn/direct/4971e3b7b0264c2ebd6700a94a38da2f.png
怎么修改成多队列网卡?

处理:关闭假造机,找到你假造机的文件夹路径,然后找到假造机名.vmx文件,该文件记载了假造机的统统设置信息,包括网卡信息。其中,我的网卡信息如下:
https://i-blog.csdnimg.cn/direct/fbd250dc5ad942389493fb477c9a92e1.png
修改成如下:
https://i-blog.csdnimg.cn/direct/141cd6696c1e43ffab031ce411f399e5.png
重新打开假造机结果如下:
https://i-blog.csdnimg.cn/direct/752e9725e278476da4c1bb450dd96ca4.png
注意:该设置后,网卡从ens35变成了ens160,这里的原因不明,但是不影响使用。
修改内存设置,使其支持hugepage(巨页)

一般内存的每一页是4k的,修改成成巨页后,可以选择2M大概1G,这里假造机建议选择2M。
修改:
打开这个文件:vim /etc/default/grub
修改如下:
GRUB_CMDLINE_LINUX="find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US default_hugepagesz=1G hugepagesz=2M hugepages=1024"
注:在GRUB_CMDLINE_LINUX反面加 “default_hugepagesz=1G hugepagesz=2M hugepages=1024”这个三个键值对即可。
然后输入:sudo update-grub
再重启假造机即可。
下载dpdk

下载链接:https://core.dpdk.org/download/
我选择的是19.08.2的版本
注:每个版本的差别挺大的,深入发掘一个版本即可。
编译dpdk

首先设置环境变量:
export RTE_SDK=/home/user/dpdk/dpdk-stable-19.08.2/ (注意,该路径取决于你的dpdk路径)
export RTE_TARGET=x86_64-native-linux-gcc
这个只是一次性的,为了永久生效,可以vim ~/.bashrc 反面加上前面的两句,这样每次开启终端都会设置export
解压好dpdk源码后,进入到usertools文件夹,执行dpdk设置的交互脚本文件:./dpdk-set
------------------------------------------------------------------------------
RTE_SDK exported as /home/user/dpdk/dpdk-stable-19.08.2
------------------------------------------------------------------------------
----------------------------------------------------------
Step 1: Select the DPDK environment to build
----------------------------------------------------------
arm64-armada-linuxapp-gcc
arm64-armada-linux-gcc
arm64-armv8a-linuxapp-clang
arm64-armv8a-linuxapp-gcc
arm64-armv8a-linux-clang
arm64-armv8a-linux-gcc
arm64-bluefield-linuxapp-gcc
arm64-bluefield-linux-gcc
arm64-dpaa2-linuxapp-gcc
arm64-dpaa2-linux-gcc
arm64-dpaa-linuxapp-gcc
arm64-dpaa-linux-gcc
arm64-octeontx2-linuxapp-gcc
arm64-octeontx2-linux-gcc
arm64-stingray-linuxapp-gcc
arm64-stingray-linux-gcc
arm64-thunderx2-linuxapp-gcc
arm64-thunderx2-linux-gcc
arm64-thunderx-linuxapp-gcc
arm64-thunderx-linux-gcc
arm64-xgene1-linuxapp-gcc
arm64-xgene1-linux-gcc
arm-armv7a-linuxapp-gcc
arm-armv7a-linux-gcc
i686-native-linuxapp-gcc
i686-native-linuxapp-icc
i686-native-linux-gcc
i686-native-linux-icc
ppc_64-power8-linuxapp-gcc
ppc_64-power8-linux-gcc
x86_64-native-bsdapp-clang
x86_64-native-bsdapp-gcc
x86_64-native-freebsd-clang
x86_64-native-freebsd-gcc
x86_64-native-linuxapp-clang
x86_64-native-linuxapp-gcc
x86_64-native-linuxapp-icc
x86_64-native-linux-clang
x86_64-native-linux-gcc
x86_64-native-linux-icc
x86_x32-native-linuxapp-gcc
x86_x32-native-linux-gcc

----------------------------------------------------------
Step 2: Setup linux environment
----------------------------------------------------------
Insert IGB UIO module
Insert VFIO module
Insert KNI module
Setup hugepage mappings for non-NUMA systems
Setup hugepage mappings for NUMA systems
Display current Ethernet/Baseband/Crypto device settings
Bind Ethernet/Baseband/Crypto device to IGB UIO module
Bind Ethernet/Baseband/Crypto device to VFIO module
Setup VFIO permissions

----------------------------------------------------------
Step 3: Run test application for linux environment
----------------------------------------------------------
Run test application ($RTE_TARGET/app/test)
Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)

----------------------------------------------------------
Step 4: Other tools
----------------------------------------------------------
List hugepage info from /proc/meminfo

----------------------------------------------------------
Step 5: Uninstall and system cleanup
----------------------------------------------------------
Unbind devices from IGB UIO or VFIO driver
Remove IGB UIO module
Remove VFIO module
Remove KNI module
Remove hugepage mappings

Exit Script


内里给了很多用户可以选择的选项,在这里,步调一我选择的是 x86_64-native-linux-gcc
在Option中输入39即可。
遇到以下错误:
mkdir: cannot create directory ‘/home/user/dpdk/dpdk-stable-19.08.2/x86_64-native-linux-gcc’:
Permission denied make: *** [/home/user/dpdk/dpdk-stable-19.08.2/mk/rte.sdkconfig.mk:68:
/home/user/dpdk/dpdk-stable-19.08.2/x86_64-native-linux-gcc] Error 1 make: ***
Error 2 make: ***
Error 2 make: ***
Error 2
这说明是该操作该文件夹的权限不够,直接使用sudo chmod 777 /home/user/dpdk/dpdk-stable-19.08.2/ 即可
反面在执行一次39,然后进去代码编译,第一次很比较久,需要耐心等待。
如果编译中,出现下面的题目:
https://i-blog.csdnimg.cn/direct/a5a4637ab76d4fdca53889b18125c552.png
说明你的内核版本不匹配。我使用的时ubuntu23,这个dpdk是19的,以是内核版本过高,导致编译失败。
以是我不得不去下载一个低版本的ubuntu系统。
后来我换成了ubuntu16版本的,内核是4.4.420,这才编译成功。
言归正传,编译成功后,再执行43,插入igb_uio模块,具体请看:https://zhuanlan.zhihu.com/p/483868843
输入45,插入KNI模块
46和47是内存的设置。有关解析请看:http://t.csdnimg.cn/ZAvko
这里46和47我都设置成了512
然后输入49,查看网卡信息:
https://i-blog.csdnimg.cn/direct/35858846ac2e4eb08b35f46f638a8dda.png
接着让你选择PIC地点,我选择eth1,理由是eth0是用来通过ssh协议连接到xshell的,而且已经处于active状态,我们选择的网卡必须是没有工作的,否则要实现down下来:ifconfig eth0 down
https://i-blog.csdnimg.cn/direct/4a10d8ca04fa410cabfe9bcc46f4064b.png
然后60退出。
以上就是dpdk19版本的全部环境设置。
都看到这了,还不给个免费的赞支持一下?

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Linux网络编程之dpdk的环境设置详解