DPDK — 安装部署

2023-11-18

1、基础环境

1.1、硬件配置

在这里插入图片描述

1.2、操作系统要求

在这里插入图片描述

2、测试环境编译测试过程

2.1、升级GCC版本至GCC-7.3.0

步骤1 升级GCC依赖包设置
编译安装gmp:

cd /home

tar -xvf /home/gmp-6.1.2.tar.bz2

cd /home/gmp-6.1.2

./configure --prefix=/usr/local/gmp-6.1.2

make

make install

编译安装mpfr:

cd /home

tar -zxvf mpfr-3.1.5.tar.gz

cd /home/mpfr-3.1.5

./configure --prefix=/usr/local/mpfr-3.1.5 --with-gmp=/usr/local/gmp-6.1.2

make

make install

编译安装mpc:

cd /home

tar -zxvf mpc-1.0.3.tar.gz

cd /home/mpc-1.0.3

./configure -prefix=/usr/local/mpc-1.0.3 -with-gmp=/usr/local/gmp-6.1.2 -with-mpfr=/usr/local/mpfr-3.1.5

make

make install

安装isl:

cd /home

tar -xvf /home/isl-0.18.tar.bz2

cd /home/isl-0.18

yum -y install gmp-devel

./configure --prefix=/usr/local/isl-0.18 --with-gmp=/usr/local/gmp-6.1.2

make

make install

步骤2 安装gcc 7.3.0

cd /home

tar -zxvf gcc-7.3.0.tar.gz

cd /home/gcc-7.3.0

./configure --prefix=/usr/local/gcc-7.3.0 --enable-languages=c,c++,fortran --enable-shared --enable-linker-build-id --without-included-gettext --enable-threads=posix --disable-multilib --disable-nls --disable-libsanitizer --disable-browser-plugin --enable-checking=release --build=aarch64-linux --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-3.1.5 --with-mpc=/usr/local/mpc-1.0.3 --with-isl=/usr/local/isl-0.18

export LD_LIBRARY_PATH=/usr/local/mpc-1.0.3/lib:/usr/local/gmp-6.1.2/lib:/usr/local/mpfr-3.1.5/lib:/usr/local/gcc-7.3.0/lib64:/usr/local/isl-0.18/lib:/usr/local/lib:/usr/lib:$LD_LIBRARY_PATH

export PATH=/usr/local/gcc-7.3.0/bin:$PATH

./configure --prefix=/usr/local/gcc-9.3.0 --enable-languages=c,c++,fortran --enable-shared --enable-linker-build-id --without-included-gettext --enable-threads=posix --disable-multilib --disable-nls --disable-libsanitizer --disable-browser-plugin --enable-checking=release --build=aarch64-linux --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-3.1.5 --with-mpc=/usr/local/mpc-1.0.3 --with-isl=/usr/local/isl-0.18

export LD_LIBRARY_PATH=/usr/local/mpc-1.0.3/lib:/usr/local/gmp-6.1.2/lib:/usr/local/mpfr-3.1.5/lib:/usr/local/gcc-9.3.0/lib64:/usr/local/isl-0.18/lib:/usr/local/lib:/usr/lib:$LD_LIBRARY_PATH

export PATH=/usr/local/gcc-9.3.0/bin:$PATH

make -j 40

make -j 40 install

gcc -v

步骤3 设置环境变量

在etc/profile文件添加:

vi /etc/profile

export LD_LIBRARY_PATH=/usr/local/mpc-1.0.3/lib:/usr/local/gmp-6.1.2/lib:/usr/local/mpfr-3.1.5/lib:/usr/local/gcc-7.3.0/lib64:/usr/local/isl-0.18/lib:/usr/local/lib:/usr/lib:$LD_LIBRARY_PATH

export PATH=/usr/local/gcc-7.3.0/bin:$PATH

export LD_LIBRARY_PATH=/usr/local/mpc-1.0.3/lib:/usr/local/gmp-6.1.2/lib:/usr/local/mpfr-3.1.5/lib:/usr/local/gcc-9.3.0/lib64:/usr/local/isl-0.18/lib:/usr/local/lib:/usr/lib:$LD_LIBRARY_PATH

export PATH=/usr/local/gcc-9.3.0/bin:$PATH
在这里插入图片描述

步骤4 加载环境变量

生效

source /etc/profile

2.2、配置内存大页和系统启动设置

步骤1 修改sysctl.conf增加内存大页设置

vim /etc/sysctl.conf

vm.nr_hugepages = 120
在这里插入图片描述
步骤2 修改系统启动项增加iommu设置

vim /boot/efi/EFI/openEuler/grub.cfg

增加iommu.passthrough=1
在这里插入图片描述
设置完成后重启系统,执行cat /proc/cmdline确认设置是否生效

cat /proc/cmdline

2.3、编译安装DPDK版本19.08.2

步骤1 安装DPDK所需依赖包

安装numa库

yum install  numactl-devel

安装libcap第三方软件,提供pcap.h

yum install  libpcap-devel

步骤2 解压编译dpdk软件包

unzip dpdk-19.08.2.zip

cd dpdk-19.08.2/

打开config/common_base文件中的 Mellanox网卡PMD驱动开关:

vi common_base

在这里插入图片描述
设置 CONFIG_RTE_LIBRTE_MLX5_PMD=y
设置 CONFIG_RTE_LIBRTE_MLX5_DEBUG=y
在这里插入图片描述

export RTE_TARGET=arm64-armv8a-linuxapp-gcc  # 以当前环境CPU架构为准

export RTE_SDK=/root/dpdk-19.08.2

make install T=$RTE_TARGET

如果这里报错,在执行一次步骤1

步骤3 Mellanox网卡驱动安装

(1)Mellanox官网下载对应OS的Mellanox驱动
https://www.mellanox.com/page/products_dyn?product_family=27
(2)配置环境变量,现在rpm包编译使用的cpu核最大个数,否则编译报错

echo %_smp_ncpus_max 16 > ~/.rpmmacros

(3)安装驱动:

 ./mlnx_add_kernel_support.sh -m ./ --without-mlx5_fpga_tools --kmp -v
 
 ./mlnxofedinstall --dpdk --upstream-libs  --add-kernel-support
 
 /etc/init.d/opnibd restart

步骤4 添加dpdk环境变量

vi ~/.bashrc

export RTE_TARGET=arm64-armv8a-linuxapp-gcc # 以当前环境CPU架构为准
export RTE_SDK=/root/dpdk-19.08.2

将dpdk环境变量加入.bashrc文件中
source ~/.bashrc
在这里插入图片描述

2.4 、网卡绑定设置

DPDK会利用自己的igb_uio/vfio驱动来接管传统内核驱动,这样往往会导致一些问题,就是我们一些传统的类unix工具,诸如ifconfig、ip、ethtool等工具无法再查看被DPDK驱动接管的网卡状态。
在传统linux场景下,我向看一下网卡丢包原因、网卡寄存器状态、网卡的feature,通过一个ethtool就可以搞定,但是到了DPDK这里就行不通了,因为上述传统工具实际上都是去内核拿数据,ethtool底层就是用ioctl去读的内核数据,但是现在网卡驱动已经被DPDK驱动接管了,用ethtool再也拿不到信息了。

注意:

Mellanox网卡不需要绑定,Intel && Broadcom需要绑定,Intel && Broadcom需要使用DPDK驱动,绑定成功后在“ip a”下不可见

步骤1加载igb_uio模组

cd usertools/

./dpdk-setup.sh

在这里插入图片描述

./dpdk-devbind.py --status

查看当前网卡状态
如果绑定的网卡状态是Active,需要执行:
ifconfig ethx down 或者 ifdown ethx
在这里插入图片描述
步骤2 绑定被测网口到用户态

./dpdk-devbind.py --bind=igb_uio 0000:bd:00.0 0000:bd:00.1

./dpdk-devbind.py --status

在这里插入图片描述
绑定成功

2.5 、使用testpmd进行压力测试

该工具所在位置

cd /home/dpdk-stable-19.08.2/arm64-armv8a-linuxapp-gcc/build/app/test-pmd

备注:列出部分命令行参数意义,详细意义可以在DPDK官网获取。

参数 说明
-c 指定参与转发的CPU核掩码
-n 指定系统内存通道个数
-w 指定参与DPDK转发的网口的PCIE地址
–rxd/txd 指定转发使用的网口队列深度
–txq/rxq 指定参与转发的网卡队列数
–nb-cores 指定实际参与转发的cpu核数
-i 交互模式启动程序
在这里插入图片描述
开始测试
./testpmd -l 2-11 -n 4 -- -i --rxq=1 --txq=1 --rxd=4096 --txd=4096 --nb-cores=2 --burst=64 --mbuf-size=2048 --total-num-mbufs=20480 --mbcache=512

在这里插入图片描述
出现报错信息:testpmd: No probed ethernet devices
(1)如果你使用的是 Intel 的网卡,那么上述的步骤当然没有问题。但笔者使用了华为的网卡,所以还需要做一些适配的工作,需要安装华为方提供的网卡驱动。
(2)还有一种可能是内存不足造成的,绑定网卡后,导致大页内存分配不足,扩大内存就好了。

解决后:

testpmd> show port stats all

testpmd> set fwd txonly

testpmd> start

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

2.6 、网卡解绑

查看网卡状态:

./dpdk-devbind.py --status

在这里插入图片描述
进行解绑:

./dpdk-devbind.py  -u 0000:01:00.1

./dpdk-devbind.py  -u 0000:01:00.0

再次查看网卡状态:

./dpdk-devbind.py --status

在这里插入图片描述
发现该网卡在Other里,无法正常使用

解绑后,需要再重新绑会原来的驱动,该卡原来的驱动是mlx5_core,执行:

./dpdk-devbind.py  -b mlx5_core 0000:01:00.0
./dpdk-devbind.py  -b mlx5_core 0000:01:00.1

查看网卡状态,恢复正常:

./dpdk-devbind.py --status

在这里插入图片描述

2.7 、运行例子

执行example/下的例子要先绑定网卡。

Helloworld,testpmd,skeleton的测试例子就不说了,l3fwd还不懂怎么构建拓扑,这里

详细说一下l2fwd二层转发的例子:

模型
在这里插入图片描述
这里用二张网卡测试,以上面的模型收发包。

运行:./build/l2fwd -c 0x50 -n 4 – -p 0x0c -q 1

参数分为两部分,以 – 分隔,前面部分是配置EAL环境的,后面是程序的参数

-c 0x50 是指用4,6两个核,-n 4指的是用4个内存通道。0x50是core的16进制掩码。

-p 0x0c 是指网卡的16进制掩码,即2,3两个口。

-q 1 是用一个无锁队列。

由于网卡是由DPDK接管的,是没有IP地址的,所以是以MAC地址通信。确定好各自的源MAC和目的MAC,类似于二层交换机的功能。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DPDK — 安装部署 的相关文章

  • 如何查明 Ubuntu 上安装了哪个版本的 GTK+?

    我需要确定 Ubuntu 上安装了哪个版本的 GTK 男人似乎不帮忙 这个建议 https stackoverflow com a 126145 会告诉您安装了哪个 2 0 的次要版本 不同的主要版本将具有不同的包名称 因为它们可以在系统上
  • numpy 未定义符号:PyFPE_jbuf

    我正在尝试使用一百万首歌曲数据集 为此我必须安装 python 表 numpy cython hdf5 numexpr 等 昨天我设法安装了我需要的所有内容 在使用 hdf5 遇到一些麻烦之后 我下载了预编译的二进制包并将它们保存在我的 b
  • 如何获取 linux 实用程序 tail 的源代码?

    这个命令确实非常有用 但是我可以在哪里获取源代码以查看内部发生的情况 thanks tail 实用程序是 Linux 上 coreutils 的一部分 源压缩包 ftp ftp gnu org gnu coreutils coreutils
  • gethostbyname() 或 getnameinfo() 如何在后台工作?

    How gethostbyname or getnameinfo 在后台工作 include
  • gentoo crontab:为什么这个简单的 crontab 不起作用?

    我使用 GENTOO 发行版 crontab e 35 12 root php5 home www cron php 当我手动运行时 php5 php5 home www cron php 这有效 它向我发送了一封电子邮件 然后我检查日期
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 在 LINUX 上使用 Python 连接到 OLAP 多维数据集

    我知道如何在 Windows 上使用 Python 连接到 MS OLAP 多维数据集 嗯 至少有一种方法 通常我使用 win32py 包并调用 COM 对象进行连接 import win32com client connection wi
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 设置 Apache POI 的路径

    我想创建 Excel 文件并使用 java 程序在该文件中写入数据 That is here http www techbrainwave com p 554我在 java 文件所在的位置提取了 Apache POI 并将该路径包含在路径变
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • Elasticsearch 无法写入日志文件

    我想激活 elasticsearch 的日志 当我运行 elasticsearch 二进制文件时 我意识到我在日志记录方面遇到问题 无法加载配置 这是输出 sudo usr share elasticsearch bin elasticse
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最

随机推荐

  • 【Python】教你写一个一键上传git的脚本(打包成exe)

    本篇博客来教你用Python写一个简单的git自动上传脚本 前言 为什么需要一个这样的东西 有的时候 我的学习代码其实没啥好commit的 写一个自动上传的脚本 就可以自动执行完所有的命令 而不需要自己手动进行git三板斧操作 项目代码已开
  • unplugin-vue-components 源码原理分析

    unplugin vue components 是一款按需自动导入Vue组件的库 支持 Vue2 和 Vue3 同时支持组件和指令 使用此插件库后 不再需要手动导入组件 插件会自动识别按需导入组件以及对应样式 我们只需要像全局组件那样使用即
  • 【笔记】SemGCN

    一 论文总结 1 1 核心贡献 提出了一种改进的图卷积操作 称为语义图卷积 SemGConv 它源自cnn 其关键思想是学习图中暗示的边的信道权值 然后将它们与核矩阵结合起来 这大大提高了图卷积的能力 其次 我们引入了SemGCN 其中Se
  • Unity PlayerPrefs(数据持久化)

    PlayerPrefs Unity3D中的数据持久化是以键值的形式存储的 可以看作是一个字典 Unity3D中值是通过键名来读取的 当值不存在时 返回默认值 目前Unity3D中只支持int string float三种数据类型的读取 参考
  • android开发工具!Android性能优化常见问题,灵魂拷问

    前言 今年上半年其实就已经有了换工作的想法 奈何疫情原因和岗位缩减 加之信心不足 到六月底投递了百度的Android岗位 本以为像我这种非211 985没工作经验的渣渣只能被直接pass 结果却意外的收到了电话 真是受宠若惊 经过电面 技术
  • 51单片机入学第八课——8*8点阵屏

    文章目录 LED点阵屏 点阵屏电路图 74HC595芯片 串入并出 使用方法 编程 点亮一个点 显示汉字 PCtoLCD 2002 编写代码 总结 LED点阵屏 LED点阵屏和数码管工作都是是靠二极管发光 但工作原理与矩阵键盘有些类似 在后
  • springboot2.0整合logback日志(详细)

    一 近期自己的项目想要一个记录日志的功能 而springboot本身就内置了日志功能 然而想要输入想要的日志 并且输出到磁盘 然后按天归档 或者日志的切分什么的 自带的日志仅仅具有简单的功能 百度了一番 总结如下 适合大多数的应用场景 二
  • python线程池ThreadPoolExecutor使用

    假设我们必须多线程任务创建大量线程 由于线程太多 因此可能会有很多性能问题 这在计算上会是最昂贵的 一个主要问题可能是吞吐量受限 我们可以通过创建一个线程池来解决这个问题 一个线程池可以被定义为一组预先实例化和空闲的线程 它们随时可以开始工
  • 微信小程序请求库的封装方法

    1 文档地址 微信官方文档 wx request网络请求 2 项目使用 根目录下新建utils gt request js 作为请求通用库 接口地址 const DEV URL http localhost 22667 const PROD
  • 常用python程序

    压缩文件 import zipfile import os def zipDir dirpath outFullName 压缩指定文件夹 param dirpath 目标文件夹路径 param outFullName 压缩文件保存路径 xx
  • linux环境用opencv读取图片,基于Linux下OpenCV的人脸识别模块设计

    金笑雪 张琳琳 高丹 张黎 摘 要 近年来 图像识别技术正在向更加直观 可靠的方向发展 其中人脸识别技术具有极高的研究价值 应用得也最为广泛 通过对Linux系统下OpenCV的研究 利用OpenCv Python3 4设计出一个图像识别系
  • OpenWRT添加模块(一)Makefile和Config.in

    第一次接触到openwrt 真是被毁三观啊 不要说makefile 连源代码在哪里都找不到 知道嵌入式系统水深 没想到迈出第一步就没过了脖子 好在旁边有人指点 直接在芯片厂商提供的既有代码上做二次开发 项目进展倒也完全满足了前期计划的目标
  • Linux基础笔记

    第一章 一 网络配置 网络三要素 ip地址 子网掩码 255 255 255 0 网关 ifconfig 查看网络 hostname 查看本机名称 hostname 更改主机名 etc hosts 网络映射配置文件 etc sysconfi
  • 【使用TensorRT自带的plugin】

    0 背景 在之前的文章TensorRT的plugin实现中介绍了 如何从零实现一个TensorRT的plugin 这篇文章来介绍如何使用TensorRT自带的plugin 将其添加到Network Definition中加速我们的模型 自T
  • js延时案例

    例子 setTimeout function gift css display block 3000 js延迟函数delay的使用 const delay ms gt new Promise resolve reject gt setTim
  • Unity 场景烘焙原理

    一 基础四种烘焙方式 1 静态灯光下静态物体烘焙 2 静态灯光下动态物体烘焙 3 动态灯光下静态物体烘焙 4 动态灯光下动态物体烘焙 二 实现方法 1 静态灯光下静态物体烘焙设置如下 灯光类型设置为Baked模式 模型预设右上角设置为Sta
  • 用Python实现链表

    摘要 在C C 语言中 常用结构体 指针来实现链表 而在Python语言中 使用类 class 来实现链表 一 创建节点 Node 链表由多个节点 Node 组成 而每个节点都有两要素组成 1 value 该节点的值 2 next 指向下一
  • 3-1.vue的组件component:组件的基本使用

    3 1 vue的组件component 组件的基本使用标题 vue组件的作用 组件的含义其实就是对一些功能进行封装 vue的项目开发都是以组件化的形式去开发的 一个项目一般都是划分成多个组件 然后拼接而成的 1 代码展示 最原始的实现方式
  • 蛇形方阵

    题目描述 给出一个不大于 9 的正整数 n 输出 n n 的蛇形方阵 从左上角填上 1 开始 顺时针方向依次填入数字 如同样例所示 注意每个数字有都会占用 3 个字符 前面使用空格补齐 输入 4 输出 1 2 3 4 12 13 14 5
  • DPDK — 安装部署

    1 基础环境 1 1 硬件配置 1 2 操作系统要求 2 测试环境编译测试过程 2 1 升级GCC版本至GCC 7 3 0 步骤1 升级GCC依赖包设置 编译安装gmp cd home tar xvf home gmp 6 1 2 tar