Linux网络编程之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版本的全部环境配置。

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

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值