DPDK安装及使用

DPDK 介绍

    DPDK 是由 6WIND,Intel 等多家公司开发,主要基于 Linux 系统运行,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。

    DPDK 使用了轮询(polling)而不是中断来处理数据包。在收到数据包时,经 DPDK 重载的网卡驱动不会通过中断通知 CPU,而是直接将数据包存入内存,交付应用层软件通过 DPDK 提供的接口来直接处理,这样节省了大量的 CPU 中断时间和内存拷贝时间。

    关于更多 DPDK 介绍,请登录官网 https://www.dpdk.org/

  • DPDK 官方在 20.11 版本及以后将不再支持 make 编译, 官方提供 meson 和 ninja工具替换 make 工具。 详情请参考官方文档。
  • DPDK20.02 版本官方源码包, 关闭了 IGB_UIO 模块。 在编译前需要将根路径的./config/common_base 文件里的 CONFIG_RTE_EAL_IGB_UIO 参数修改成 y,保存后再编译。vim ./config/common_base

1.环境配置及依赖工具

1.1 BIOS 配置

     大多数平台,部署 DPDK 不需要更改 BIOS 配置。但是,如果使能 UEFI 安全启动方式,则 Linux 内核会禁止 uio 模块加载,进而无法挂载 igb_uio.ko 模块。在这种情况下可以使用 vfio 模块代替 igb_uio/uio_pci_generic 模块。

1.2  DPDK 源码编译

 必要的软件工具:

yum groupinstall "Development Tools" -y  //For RHEL/Fedora

apt install -y build-essential  //For Ubuntu/Debian

Python 3.5+  //用来安装 meson and ninja (20.11 及以后版本需要使用)

Python 2.7+/3.2+  //用来执行 DPDK 源码中包含脚本

Meson (version 0.47.1+) and ninja  //大部分 Linux 系统中自带安装,python 安装命令:pip3 install meson ninja

yum install kernel-devel-$(uname -r)  //安装内核开发包For RHEL/Fedora

apt install linux-headers-$(uname -r) //安装内核开发包 For Ubuntu/Debian

管理 NUMA 的库:

yum install -y numactl-devel  //For RHEL/Fedora

apt install -y libnuma-dev  //For Ubuntu/Debian

解压DPDK

tar -xJf  dpdk-18.11.tar.xz  //将dpdk-18.11.tar.xz copy至系统文件夹 赋予权限 需使用root用户登录

设置 RTE_SDK 参数

root@nic-MS-7917:/dpdk-18.11/# export RTE_SDK=`pwd` //或者设置DPDK绝对路径

设置 RTE_TARGET 参数

root@nic-MS-7917:/dpdk-18.11/# export RTE_TARGET=x86_64-native-linuxapp-gcc   //x86 架构选择 x86_64-native-linuxapp-gcc;ARM 平台选择arm64-armv8a-linuxapp-gcc;龙芯平台需要交叉编译。

打patch(沐创和网迅等国产网卡

网迅芯片:
复制网迅patch文件到dpdk-18.11/drivers/net/netswift
cd dpdk-18.11/drivers/net/netswift
patch -p1 < 20220809.patch

沐创芯片:
git apply ../tsrn10-pmd/19.11/0001-net-tsrn10-add-PMD-skeleton.patch 

编译 DPDK 目标环境

make -j 4 install T=$RTE_TARGET

cd examples/l2fwd    //编译l2fwd、l3fwd

make

  CC main.o

  LD l2fwd

  INSTALL-APP l2fwd

  INSTALL-MAP l2fwd.map

 挂载 IGB_UIO 模块

[root@localhost dpdk-18.11]# modprobe uio

[root@localhost dpdk-18.11]# insmod x86_64-native-linuxapp-gcc/kmod/igb_uio.ko  //insmod 

1.3 绑定网卡设备到 IGB_UIO

注意:待绑定设备必须卸载物理驱动或者网络连接保持 down 的状态

[root@localhost dpdk-18.11]#./usertools/dpdk-devbind.py -b igb_uio 01:00.0 01:00.1 //pcie设备编号

[root@localhost dpdk-18.11]#./usertools/dpdk-devbind.py -s //查看绑定状态

1.4 配置大页内存(也可写入grub)

echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages  //X86
echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages //飞腾
echo 4096 > /sys/kernel/mm/hugepages/hugepages-524288kB/nr_hugepages(大页划分)

[root@localhost /]# mkdir -p /mnt/huge

[root@localhost /]# mount -t  hugetlbfs  nodev  /mnt/huge

[root@localhost /]# grep HugePages_ /proc/meminfo

HugePages_Total:    1024

HugePages_Free:    1024

HugePages_Rsvd:        0

HugePages_Surp:        0   

2. DPDK测试脚本

4核4口

./l2fwd -l 2,3,4,5 -n 2 --socket-mem 1024 --file-prefix pg0 -- -q 1 -p 0xf -T 5 --no-mac-updating 

4核8口

./l2fwd -l 2,3,4,5 -n 2 --socket-mem 1024 --file-prefix pg0 -- -q 2 -p 0xff -T 5 --no-mac-updating 

2核2口

./l2fwd  -l 2,3 -n 2 --socket-mem 1024 --file-prefix pg0 -- -q 1 -p 0x3 -T 5 --no-mac-updating 

5核10口

./l2fwd  -l 1,2,3,4,5,6 -n 2 --socket-mem 1024 --file-prefix pg0 -- -q 2 -p 0x3ff -T 5 --no-mac-updating 

2核4口

./l2fwd -l 2,3 -n 1 --socket-mem 1024 --file-prefix pg0 -- -q 2 -p 0xf -T 5 --no-mac-updating 

3. testpmd下portlist参数调整网口转发顺序

参考官网说明4. Testpmd Runtime Functions — Data Plane Development Kit 19.11.13 documentation

4.5.12. set portlist

Set the list of forwarding ports:

testpmd> set portlist (x[,y]*)

For example, to change the port forwarding:

testpmd> set portlist 0,2,1,3

testpmd> show config fwd

io packet forwarding - ports=4 - cores=1 - streams=4

Logical Core 3 (socket 0) forwards packets on 4 streams:

RX P=0/Q=0 (socket 0) -> TX P=2/Q=0 (socket 0) peer=02:00:00:00:00:01

RX P=2/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00

RX P=1/Q=0 (socket 0) -> TX P=3/Q=0 (socket 0) peer=02:00:00:00:00:03

RX P=3/Q=0 (socket 0) -> TX P=1/Q=0 (socket 0) peer=02:00:00:00:00:02

testpmd启动

./testpmd -l 1-5 -- -i 

4. 海光平台特殊设置

需要关闭IOMMU

修改/etc/default/grub, 编辑GRUB_CMDLINE_LINUX选项:

GRUB_CMDLINE_LINUX=“amd_iommu=off”

更新grub

grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg   //UEFI启动

grub2-mkconfig -o /boot/grub2/grub.cfg  //legacy模式启动

5. 为了防止性能波动可做CPU隔离设置

修改/etc/default/grub, 编辑GRUB_CMDLINE_LINUX选项:添加如下内容:

default_hugepagesz=2M hugepagesz=2M hugepages=1024 isolcpus=1-5 nohz_full=1-5 rcu_nocbs=1-5

更新grub

grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg   //UEFI启动

grub2-mkconfig -o /boot/grub2/grub.cfg  //legacy模式启动

6. vfio-pci使用方法

加载用户态驱动并将我们的卡绑到dpdk 用户态,vfio-pci 或者使用igb_uio ,一般vfio-pci需要开启VT,并设置iommu,建议直接使用默认的igb_uio用户态驱动,igb_uio基本所有平台都支持。

    vfio-pci使用如下:
        modprobe vfio
        modprobe vfio-pci
        usertools/dpdk-devbind.py --force --bind=vfio-pci 0000:07:00.0 0000:07:00.1


7. 21.11之后版本l2fwd需要加参数-P,否则不转发

### 如何在 IntelliJ IDEA 中创建 Spring Boot 项目 #### 准备工作 为了顺利创建一个 Spring Boot 项目,在开始之前需要确认已经安装并配置好了以下环境: - **Java JDK**:确保本地已安装适合的 Java 版本。 - **IntelliJ IDEA**:推荐使用 Ultimate 版本,因为它内置了对 Spring 的支持[^1]。 --- #### 创建 Spring Boot 项目的具体步骤 1. 打开 IntelliJ IDEA 并点击 `File` -> `New` -> `Project...` 来启动新建项目向导。 2. 在弹出的新建项目窗口中,选择左侧列表中的 `Spring Initializr`。这一步是基于官方提供的模板服务自动生成基础结构[^1]。 3. 配置 Maven 或 Gradle 构建工具的相关参数: - **Group**: 定义 Maven 工程的 GroupId,通常为公司域名反写形式(如 com.example)。 - **Artifact**: 输入模块名作为 ArtifactId,注意不能包含大写字母[^2]。 - **Name**: 自定义项目名称。 - **Package Name**: 自动生成的基础包路径。 - **Packaging**: 默认选择 jar 包即可,因为 Spring Boot 内嵌 Tomcat 支持通过命令行直接运行 jar 文件。 4. 如果国内网络访问速度较慢,可以选择替换默认的初始化 URL 地址为阿里云镜像站点 https://start.aliyun.com/,从而提高下载效率[^3]。 5. 进入依赖管理界面后勾选所需的 Starter Dependencies,对于基本 Web 应用只需添加 `Spring Web` 即可完成核心功能引入。 6. 点击下一步直至最终生成完毕,此时应该能看到标准目录布局下的 src/main/java 和 resources 子文件夹[^1]。 7. 编辑器会自动加载 pom.xml (如果是 Maven) 或 build.gradle (如果是 Gradle),其中列出了所有必要的库版本号等信息。 8. 启动应用程序类上的 main 方法验证是否成功部署到内存中的服务器实例上。 --- ```java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` --- #### 常见问题排查 如果按照以上流程操作仍然遇到异常情况,则可以从以下几个角度入手解决: - 检查互联网连接状态良好与否; - 更改仓库源至更稳定的地址比如阿里的开源镜像站; - 查看日志输出定位具体的错误提示语句进一步分析原因所在。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值