云服务测试DPDK
一、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 ninja --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)。 ldd --version 用于查看glibc相关信息。
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,则不存在巨大页面(若无根用户权限,则执行 sudo bash -c 'echo 0 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages' )。
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
的子目录中,包括build.ninja文件。
<options>选项允许你在构建项目之前配置构建过程的各种方面,例如启用/禁用特定功能、指定安装路径等。
-- build.ninja文件会根据Meson的配置信息编译DPDK,编译主要包含如下步骤:
-- 1)生成头文件和库文件
-- 2)链接DPDK的库文件和可执行文件
-- 编译完成后会在 build 目录下生成如下文件:
-- 1)头文件: include/ 目录下
-- 2)库文件: lib/ 目录下
-- 3)可执行文件: bin/ 目录下
cd build // 进入该目录
ninja // 使用ninja安装DPDK
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 环境已成功初始化,并且示例程序在多个核心上运行并输出了相应的信息。