云服务测试DPDK

发布时间 2023-10-13 09:51:22作者: 有梦-

一、DPDK的系统要求

  1.1 x86上的BIOS的设置先决条件

      1.1.1 对于大多数平台,不需要特殊的BIOS设置即可使用基本的DPDK功能;

      1.1.2 为了获得额外的HPET定时器和电源管理功能以及小数据包的高性能,可能需要更改BIOS设置;

  1.2 DPDK编译(Ubuntu22.04)

    1.2.1 所需的工具和库:

      1)General development tools including a supported C compiler such as gcc (version 4.9+) or clang (version 3.4+), and pkg-config or pkgconf to be used when building end-user binaries against DPDK.

apt install build-essential

      用于在 Ubuntu 系统中安装一组基本的编译工具和构建依赖项的命令。 dpkg -l build-essential 用于验证是否安装build-essential。

      2)Python 3.6 or later

sudo apt update
sudo apt install python3

      用于在Ubuntu系统中安装Python3。 python3 --version 用于验证是否安装python3。

      3)Meson (version 0.53.2+) and ninja

pip3 install meson ninja

      Meson 是一个现代的构建系统,用于自动化和简化软件项目的构建过程。Ninja 是一个高效的并行构建系统,用于加速软件项目的构建过程。在项目的构建过程中,Meson 将使用定义的构建配置来生成一个或多个 Ninja 构建文件,然后可以使用 Ninja 来执行这些构建文件,以完成项目的编译、链接等构建任务。

       meson --version  nanja --version 用于验证是否安装这两个软件。

      4)pyelftools (version 0.22+)

apt install python3-pyelftools

      pyelftools 是一个用于解析和操作 ELF(可执行和可链接格式)文件的 Python 库。ELF 文件是一种常见的二进制文件格式,用于表示可执行文件、共享库和目标文件。

       pip show pyelftools 用于验证是否安装该python库。

      5)Library for handling NUMA (Non Uniform Memory Access)

sudo apt update
sudo apt install libnuma-dev

      NUMA(Non-Uniform Memory Access)是一种计算机体系结构,它在多处理器系统中采用了一种灵活的内存访问模型。

       pkg-config --modversion numa 用于验证是否安装libnuma-dev库。(libnuma-dev 提供了开发 NUMA 应用程序所需的工具和接口,使得开发者可以充分利用 NUMA 架构来优化程序的性能。)

    1.2.2 可选工具:

      1)Intel® C++ Compiler (icc):Intel® C++ Compiler(简称 icc)是由英特尔(Intel)提供的用于 C++ 编程语言的编译器。它是针对英特尔处理器架构进行了高度优化的编译器,旨在提高在英特尔处理器上运行的程序的性能。

      2)IBM® Advance ToolChain for Powerlinux:IBM Advance ToolChain for PowerLinux(简称 Advance ToolChain)是一个用于 IBM Power 架构的开发工具链。它包括一套优化的编译器、库和开发工具,旨在为 PowerLinux 平台提供高性能和可靠的开发环境。

 

  1.3 运行DPDK应用程序

    1.3.1 系统软件

      1)内核版本: uname -r 用于查看内核版本(>=4.14)。

      2)glibc:glibc,全称 GNU C Library,是一种用于 Linux 系统的 C 语言标准库。它是 GNU 项目的一部分,也是 Linux 操作系统的核心组件之一(>=2.35)。

      3)内核配置:在 Fedora 操作系统和其他常见发行版(例如 Ubuntu 或 Red Hat Enterprise Linux)中,供应商提供的内核配置可用于运行大多数 DPDK 应用程序。

    1.3.2 Linux中的Hugepage

      1.3.2.1 确认大页数

free -g

      查看总内存(以 GB 为单位)。建议将大页数设置为系统内存的一半。

       

      1.3.2.2 检查大页面的大小(x86_64)

cat /proc/cpuinfo | grep pdpe1gb

      如果看到pdpe1gb,则说明您的系统支持 1 GB 大页面;否则,页面大小可能为 4 MB(待确认)。

      

       若上输出即为支持1GB大页面(Hugepage)。

      1.3.2.3 在启动时设置大页

        /boot/grub2/grub.cfg 是用于 GRUB(Grand Unified Bootloader)引导加载程序的配置文件。GRUB是用于引导多操作系统的引导加载程序,通常用于 Linux 系统。

        1)适用于支持 1 GB 大页面的环境

linux16 /vmlinuz-xxx ... transparent_hugepage=never default_hugepagesz=1G hugepagesz=1G hugepages=140

        linux16:指示 GRUB 使用 16 位内核的命令

        /vmlinuz-xxx:实际的 Linux 内核镜像的路径和文件名(打开 /boot/grub2/grub.cfg 文件,并搜索包含 vmlinuz 的行,通常你会在那里找到内核镜像的路径和名称。)

        transparent_hugepage=never:禁用了透明大页面(Transparent Huge Pages)功能

        default_hugepagesz=1G:将默认的大页面大小设置为1GB      

        hugepagesz=1G:指定系统中巨大页面的大小为1GB

        hugepages=140:指定系统中保留的巨大页面的数量为140个。

        2)适用于不支持1GB大页面的环境

linux16 /vmlinuz-xxx ... transparent_hugepage=never hugepages=1024

        参数含义同上

      1.3.2.4 在运行时设置大页(单节点系统)

        1)默认大小的页面

echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

        将值 1024 写入 /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages 文件来配置系统中可用的 2MB 巨大页面的数量。

        若值为0,则不存在巨大页面。

echo 0 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

        2)除默认大小页面以外的页面,需要手动创建挂载点

mkdir /mnt/huge
mount -t hugetlbfs pagesize=1GB /mnt/huge

        为这些大页面大小(例如1GB页面)手动创建挂载点。 umount /mnt/huge 将挂载在 /mnt/huge 目录下的hugetlbfs卸载掉。

      1.3.2.4 验证配置的大页

cat /proc/meminfo | grep Huge

      用于查看系统中关于Huge Pages的一些基本信息,比如总的Huge Pages数量、空闲的Huge Pages数量等。

      

      **1GB必须要在grub中设置,开机分配,在运行时是无法修改默认配置**

二、从源代码编译DPDK目标

  1、下载、解压DPDK并浏览源代码

wget https://fast.dpdk.org/rel/dpdk-20.11.9.tar.xz

  DPDK目录包含的文件:

    doc:DPDK文档

    license:DPDK许可证信息

    lib:DPDK库的源代码

    drivers:DPDK轮询模式驱动程序的源代码

    app:DPDK应用程序的源代码

    examples:DPDK应用示例源码

    config、buildtools:框架相关的脚本和配置

    usertools:DPDK应用程序最终用户使用的使用程序脚本

    devtools:DPDK开发人员使用的脚本

    kernel:某些操作系统所需的内核模块

tar xf dpdk-20.11.9.tar.xz

  2、利用 meson 和 ninja 配置、编译和安装DPDK

meson setup <options> build

    使用 meson 配置构建过程,并将构建输出放在一个名为 build 的子目录中。

    <options>选项允许你在构建项目之前配置构建过程的各种方面,例如启用/禁用特定功能、指定安装路径等。

cd build
ninja
meson install
ldconfig

    ninja: 这是一个构建系统,用于管理项目的构建过程。运行此命令将开始构建软件。通常,它会在 "build" 目录中查找构建脚本(例如 build.ninja)并执行所需的构建任务。

    meson install: 这个命令将安装你构建的软件。它会将文件复制到系统目录中,以使软件可以在系统中正常运行。

    ldconfig: 这是一个动态链接库管理器,用于更新共享库的缓存以反映新安装的库。在安装新的共享库后,需要运行此命令,以便系统知道在哪里找到它们。

     (自DPDK 20.11之后,usertools目录中删除了已弃用的dpdk-setup.sh脚本)

  3、编译测试例程

cd build

  进入build这一目录

meson configure -Dexamples=helloworld

  用于配置 Meson 构建系统,使其只构建 helloworld 示例应用程序,而不构建其他示例。

ninja 

  ninja 是一个强大而高效的构建工具,特别适用于大型项目和对构建速度有要求的场景。

sudo ./examples/dpdk-helloworld

  运行DPDK示例程序

    

    EAL: Detected 40 lcore(s):DPDK 检测到了系统中的 40 个逻辑核心。

    EAL: Detected 2 NUMA nodes:DPDK 检测到了系统中的 2 个 NUMA 节点(非一致性内存访问)。

    EAL: Detected static linkage of DPDK:DPDK 检测到静态链接。

    EAL: Multi-process socket /var/run/dpdk/rte/mp_socket:DPDK 正在使用多进程的套接字。

    EAL: Selected IOVA mode 'PA':DPDK 选择了 IOVA(IO虚拟地址)模式为 'PA'(物理地址)。

    EAL: No available hugepages reported in hugepages-1048576kB:DPDK 发现系统中没有可用的 1GB 大页内存(在设备运行时配置)。

    EAL: Probing VFIO support...:DPDK 正在尝试检测 VFIO(Virtual Function I/O)支持。

    EAL: VFIO support initialized:VFIO 支持已成功初始化。

    EAL: No legacy callbacks, legacy socket not created:DPDK 未使用遗留的回调函数,因此未创建遗留套接字。

    程序输出了一系列的 hello from core X,表明程序在不同的 CPU 核心上运行并打印了相应的信息。

  表明 DPDK 环境已成功初始化,并且示例程序在多个核心上运行并输出了相应的信息。