当前位置: 首页 > news >正文

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

文章目录

  • 一、dpdk是什么?
  • 二、dpdk的环境配置
    • 多队列网卡是什么?
    • 怎么判断是否为多队列网卡?
    • 怎么修改成多队列网卡?
    • 修改内存配置,使其支持hugepage(巨页)
    • 下载dpdk
    • 编译dpdk

一、dpdk是什么?

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

  1. 用户空间数据处理:DPDK将网络数据包处理从内核空间转移到用户空间,避免了传统内核空间处理中的上下文切换和系统调用开销,从而提高了处理速度。
  2. 高性能:DPDK通过使用优化的数据包处理算法和零拷贝技术,减少了数据在内存中的复制次数,提高了数据处理的效率。
  3. 可扩展性:DPDK支持多核处理,可以在多个CPU核心上并行处理数据包,提高了系统的可扩展性。
  4. 丰富的网络协议支持:DPDK支持多种网络协议,包括TCP、UDP、IP、VLAN、MPLS等。
  5. 兼容性:DPDK可以在多种Linux发行版上运行,并且可以与现有的网络应用和框架集成,如Open vSwitch、OpenStack等。
    DPDK通常用于以下场景:
  • 网络虚拟化:在虚拟化环境中,DPDK可以提高虚拟交换机和虚拟路由器的性能。
  • 高性能网络应用:如高速缓存、负载均衡器、防火墙等,DPDK可以提供所需的高性能网络处理能力。
  • SDN(软件定义网络):在SDN架构中,DPDK可以用于实现快速的数据平面处理,支持网络流量的快速转发和控制。
    DPDK是一个开源项目,由Intel发起,并得到了社区的支持和贡献。由于其高性能和灵活性,DPDK在需要高速网络处理的场景中得到了广泛的应用。

二、dpdk的环境配置

多队列网卡是什么?

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

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

怎么判断是否为多队列网卡?

cat /proc/interrupts | grep <网卡名>
如果结果只有一行,则不是多队列网卡
在这里插入图片描述

怎么修改成多队列网卡?

处理:关闭虚拟机,找到你虚拟机的文件夹路径,然后找到虚拟机名.vmx文件,该文件记录了虚拟机的一切配置信息,包括网卡信息。其中,我的网卡信息如下:
在这里插入图片描述
修改成如下:
在这里插入图片描述
重新打开虚拟机结果如下:
在这里插入图片描述
注意:该配置后,网卡从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
----------------------------------------------------------
[1] arm64-armada-linuxapp-gcc
[2] arm64-armada-linux-gcc
[3] arm64-armv8a-linuxapp-clang
[4] arm64-armv8a-linuxapp-gcc
[5] arm64-armv8a-linux-clang
[6] arm64-armv8a-linux-gcc
[7] arm64-bluefield-linuxapp-gcc
[8] arm64-bluefield-linux-gcc
[9] arm64-dpaa2-linuxapp-gcc
[10] arm64-dpaa2-linux-gcc
[11] arm64-dpaa-linuxapp-gcc
[12] arm64-dpaa-linux-gcc
[13] arm64-octeontx2-linuxapp-gcc
[14] arm64-octeontx2-linux-gcc
[15] arm64-stingray-linuxapp-gcc
[16] arm64-stingray-linux-gcc
[17] arm64-thunderx2-linuxapp-gcc
[18] arm64-thunderx2-linux-gcc
[19] arm64-thunderx-linuxapp-gcc
[20] arm64-thunderx-linux-gcc
[21] arm64-xgene1-linuxapp-gcc
[22] arm64-xgene1-linux-gcc
[23] arm-armv7a-linuxapp-gcc
[24] arm-armv7a-linux-gcc
[25] i686-native-linuxapp-gcc
[26] i686-native-linuxapp-icc
[27] i686-native-linux-gcc
[28] i686-native-linux-icc
[29] ppc_64-power8-linuxapp-gcc
[30] ppc_64-power8-linux-gcc
[31] x86_64-native-bsdapp-clang
[32] x86_64-native-bsdapp-gcc
[33] x86_64-native-freebsd-clang
[34] x86_64-native-freebsd-gcc
[35] x86_64-native-linuxapp-clang
[36] x86_64-native-linuxapp-gcc
[37] x86_64-native-linuxapp-icc
[38] x86_64-native-linux-clang
[39] x86_64-native-linux-gcc
[40] x86_64-native-linux-icc
[41] x86_x32-native-linuxapp-gcc
[42] x86_x32-native-linux-gcc----------------------------------------------------------Step 2: Setup linux environment
----------------------------------------------------------
[43] Insert IGB UIO module
[44] Insert VFIO module
[45] Insert KNI module
[46] Setup hugepage mappings for non-NUMA systems
[47] Setup hugepage mappings for NUMA systems
[48] Display current Ethernet/Baseband/Crypto device settings
[49] Bind Ethernet/Baseband/Crypto device to IGB UIO module
[50] Bind Ethernet/Baseband/Crypto device to VFIO module
[51] Setup VFIO permissions----------------------------------------------------------Step 3: Run test application for linux environment
----------------------------------------------------------
[52] Run test application ($RTE_TARGET/app/test)
[53] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)----------------------------------------------------------Step 4: Other tools
----------------------------------------------------------
[54] List hugepage info from /proc/meminfo----------------------------------------------------------Step 5: Uninstall and system cleanup
----------------------------------------------------------
[55] Unbind devices from IGB UIO or VFIO driver
[56] Remove IGB UIO module
[57] Remove VFIO module
[58] Remove KNI module
[59] Remove hugepage mappings[60] Exit Script

里面给了很多用户可以选择的选项,在这里,步骤一我选择的是[39] 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[3]: *** [/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[2]: *** 
[/home/user/dpdk/dpdk-stable-19.08.2/mk/rte.sdkroot.mk:65: config] Error 2 make[1]: *** 
[/home/user/dpdk/dpdk-stable-19.08.2/mk/rte.sdkinstall.mk:60: pre_install] Error 2 make: *** 
[/home/user/dpdk/dpdk-stable-19.08.2/mk/rte.sdkroot.mk:77: install] Error 2

这说明是该操作该文件夹的权限不够,直接使用sudo chmod 777 /home/user/dpdk/dpdk-stable-19.08.2/ 即可

后面在执行一次39,然后进去代码编译,第一次很比较久,需要耐心等待。

如果编译中,出现下面的问题:
在这里插入图片描述
说明你的内核版本不匹配。我使用的时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,查看网卡信息:
在这里插入图片描述
接着让你选择PIC地址,我选择eth1,理由是eth0是用来通过ssh协议连接到xshell的,而且已经处于active状态,我们选择的网卡必须是没有工作的,否则要实现down下来:ifconfig eth0 down
在这里插入图片描述
然后60退出。
以上就是dpdk19版本的全部环境配置。

都看到这了,还不给个免费的赞支持一下?

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 自动化测试与手动测试的区别!
  • 时光不等人:java每日一练
  • python入门基础篇(一)
  • string.format()拼接参数
  • SpringBoot3里的文件上传
  • 将本地的业务写成成可供RPC远程调用的方法
  • 电脑添加虚拟网卡与ensp互联,互访
  • redis面试(五)删除策略和淘汰策略
  • Excel列名转换
  • 54、PHP 实现希尔排序
  • 选择 websim网站:一个用自然语言快速构建生成功能齐全的网站
  • 8月4号分析:CSGO市场行情如何,给几个操作建议
  • C++——string类及其使用
  • TeleVis:基于NLP的新冠新闻舆情可视化项目
  • YOLOv8改进 | 注意力机制 | 反向残差注意力机制【内含创新技巧思维】
  • ----------
  • @angular/forms 源码解析之双向绑定
  • GitUp, 你不可错过的秀外慧中的git工具
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • isset在php5.6-和php7.0+的一些差异
  • Java 网络编程(2):UDP 的使用
  • JS数组方法汇总
  • MySQL的数据类型
  • node-glob通配符
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • React 快速上手 - 07 前端路由 react-router
  • Redis在Web项目中的应用与实践
  • 阿里研究院入选中国企业智库系统影响力榜
  • 解析 Webpack中import、require、按需加载的执行过程
  • 如何用vue打造一个移动端音乐播放器
  • 手机端车牌号码键盘的vue组件
  • 线性表及其算法(java实现)
  •  一套莫尔斯电报听写、翻译系统
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • hi-nginx-1.3.4编译安装
  • ​ArcGIS Pro 如何批量删除字段
  • ​低代码平台的核心价值与优势
  • # include “ “ 和 # include < >两者的区别
  • #Linux(帮助手册)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $refs 、$nextTic、动态组件、name的使用
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (3) cmake编译多个cpp文件
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (二十四)Flask之flask-session组件
  • (四)库存超卖案例实战——优化redis分布式锁
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转) Face-Resources
  • (转)C#调用WebService 基础
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)详解PHP处理密码的几种方式
  • .describe() python_Python-Win32com-Excel
  • .Net Core 中间件与过滤器