赞
踩
目录
4.4. Building for an aarch64 SoC on an aarch64 build machine
4.5. Supported SoC configuration
第5章 Cross compiling DPDK for RISC-V
6.1. Binding and Unbinding Network Ports to/from the Kernel Modules
7.1. Compiling a Sample Application
7.2. Running a Sample Application(hello world)
7.3. Additional Sample Applications
8.2. Linux-specific EAL parameters
本文是在理解DPDK原理的基础之上,探讨针对特定的硬件系统,如何下载、编译、配置、部署DPDK开源软件。
Getting Started Guide for Linux — Data Plane Development Kit 22.07.0 documentation
本文档包含安装和配置数据平面开发工具包(DPDK)软件的说明。
它旨在让客户快速启动和运行。
本文档描述了如何在Linux应用程序(Linux)环境中编译和运行DPDK应用程序,而不深入讨论细节。
(1)发布说明:
提供特定于发行版的信息,包括支持的功能、限制、修复的问题、已知问题等。此外,还以常见问题解答格式提供常见问题的答案。
(2)Linux入门指南(本文档):
介绍如何安装和配置DPDK;旨在让用户快速启动并运行该软件。
(3)程序员指南:
描述:
(4)API参考:
提供有关DPDK函数、数据结构和其他编程构造的详细信息。
(5)示例应用程序用户指南:
描述一组示例应用程序。
每章都描述了一个示例应用程序,该应用程序展示了特定的功能,并提供了有关如何编译、运行和使用示例应用程序的说明。
(6)驱动程序员参考指南:
提供特定类别内每个驱动的详细信息。以下各项都有单独的指南:
本章介绍编译DPDK所需的软件包。
对于大多数平台,使用基本DPDK功能不需要特殊的BIOS设置。然而,对于附加的HPET计时器和电源管理功能,以及小数据包的高性能,可能需要更改BIOS设置。
有关所需更改的更多信息,请参阅启用其他功能部分。
(1)所必须的工具和库:
不同系统上所需的设置命令和安装的软件包可能不同。
有关Linux发行版和测试版本的详细信息,请参阅DPDK发行说明。
dnf groupinstall "Development Tools"
apt install build-essential
apk add alpine-sdk bsd-compat-headers libexecinfo-dev
备注:
RHEL-7提供的pkg-config 0.27无法正确处理Libs.private部分,导致静态链接的应用程序无法正确链接。构建应用程序时,请改用更新版本的pkg-config或pkgconf。
meson
& ninja-build
packages in most Linux distributionspip3 install meson ninja
pyelftools
(version 0.22+) =》解析ELF格式内容
dnf install python-pyelftools
pip3 install pyelftools
apt install python3-pyelftools
apk add py3-elftools
numactl-devel
in RHEL/Fedora;libnuma-dev
in Debian/Ubuntu;numactl-dev
in Alpine Linux备注:请确保将最新补丁应用于第三方库和软件,以避免任何已知漏洞。
(2)可选的工具和库
(3)其他的工具和库
许多DPDK组件(如库和轮询模式驱动程序(PMD))都有附加的依赖项。对于DPDK构建,将自动检测是否存在这些依赖项,以适当启用或禁用相关组件。
在每种情况下,都需要相关的库开发包(-devel或-dev)来构建DPDK组件。
备注:对于轮询模式驱动程序,可以在相关DPDK指南文档中的驱动程序文档中找到每个驱动程序的附加依赖项。
要运行DPDK应用程序,可能需要在目标计算机上进行一些自定义。
2.3.1 操作系统软件
2.3.2 在Linux环境中使用Hugepages
页表是一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。
用固定大小的页(Page)来描述逻辑地址空间,用相同大小的页框(Frame)来描述物理内存空间,由操作系统实现从逻辑页到物理页框的页面映射,同时负责对所有页的管理和进程运行的控制。
用于数据包缓冲区的大内存池分配需要Hugepage支持(如前一节所述,必须在运行的内核中启用HUGETLBFS选项)。通过使用大页面分配,性能得到了提高,因为需要的页面更少,因此翻译查找缓冲区(TLB,高速翻译缓存)更少,从而减少了将虚拟页面地址转换为物理页面地址所需的时间。如果没有大页面,标准4k页面大小的TLB未命中率会很高,从而降低性能。
(1)Reserving Hugepages for DPDK Use:为DPDK保留巨页的支持。
巨幅页面的保留可以在运行时执行。这是通过echo /sys/kernel/目录中nr_hugepages文件所需的巨大页面数来实现的,该文件对应于特定的页面大小(以千字节为单位)。
对于单节点系统,要使用的命令如下(假设需要1024个2MB页面 = 总共2G的内存空间):
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
2M的页面一共有1024个,总物理内存有:2G。
在NUMA机器上,上面的命令通常会在所有NUMA节点上平均划分巨大页面的数量(假设所有NUMA结点上都有足够的内存)。但是,也可以使用/sys/devices/目录中的nr_hugepages文件在单个NUMA节点上明确保留页面:
- echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
- echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
The tool dpdk-hugepages.py can be used to manage hugepages.
(2)Using Hugepages with the DPDK:使用巨页
要使1GB大小的巨大页面可供DPDK使用,必须执行以下步骤:
mkdir /mnt/huge mount -t hugetlbfs pagesize=1GB /mnt/huge
通过在/etc/fstab文件中添加以下行,可以在重新启动后使装载点持久化:
nodev /mnt/huge hugetlbfs pagesize=1GB 0 0
首先,解压缩存档并移动到解压缩的DPDK源目录:
- tar xJf dpdk-<version>.tar.xz
- cd dpdk-<version>
可以使用meson和ninja工具在您的系统上配置、构建和安装DPDK。
3.2.1 DPDK Configuration
(1)To configure a DPDK build use:
meson <options> build
(2)配置完成后,要在系统范围内构建并安装DPDK,请执行以下操作:
- cd build
- ninja
- ninja install
- ldconfig
3.2.2. Adjusting Build Options
DPDK有许多编译选项,可以作为构建配置过程的一部分进行调整。
通过在已配置的构建文件夹中运行meson configure,可以列出这些选项。
其中许多选项来自“meson”工具本身,可以在meson网站上看到。
3. Compiling the DPDK Target from Source — Data Plane Development Kit 22.07.0 documentation
3.2.3. Building 32-bit DPDK on 64-bit Systems
要在64位操作系统上构建DPDK的32位版本,应将-m32标志传递给编译器和链接器,以强制生成32位对象和二进制文件。
这可以通过在环境中设置CFLAGS和LDFLAGS来完成,也可以通过使用-Dc_args=-m32和-Dc_link_args=-m32将值传递给meson来完成。为了正确识别和使用任何依赖项包,还必须将pkg配置工具配置为在相应的目录中查找32位库的.pc文件。这可以通过将PKG_CONFIG_LIBDIR设置为适当的路径来完成。
对于Debian/Ubuntu系统,等效命令为:
- PKG_CONFIG_LIBDIR=/usr/lib/i386-linux-gnu/pkgconfig \
- meson -Dc_args='-m32' -Dc_link_args='-m32' build
3.2.4. Building Applications Using Installed DPDK
DPDK提供pkg配置文件libdpdk.pc
下面显示了一个简化的示例片段,其中目标二进制名称存储在变量$(APP)中,该构建的源存储在$(SRCS-y)中。
- PKGCONF = pkg-config
-
- CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
- LDFLAGS += $(shell $(PKGCONF) --libs libdpdk)
-
- $(APP): $(SRCS-y) Makefile
- $(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS)
本章介绍如何在x86构建计算机上交叉编译aarch64的DPDK,以及如何在aarch64构建计算机上编译32位aarch32 DPDK。
虽然可以直接在目标环境中编译,实际上,也可以通过x86进行交叉编译,后者是一个更加通用的方法。交叉编译可以使用aarch64交叉编译器GNU工具链或LLVM/clang工具链。
4.1.1. NUMA library
4.1.2. Meson prerequisites
4.2.1. Get the cross toolchain
4.2.2. Augment the GNU toolchain with NUMA support
4.2.3. Cross Compiling DPDK with GNU toolchain using Meson
4.3.1. Obtain the cross tool chain
4.3.2. Unzip and add into the PATH
4.3.3. Cross Compiling DPDK with LLVM/Clang toolchain using Meson
4.3.4. Cross Compiling DPDK with LLVM/Clang toolchain using Meson on Ubuntu 18.04
meson soc_build -Dplatform=<target_soc>
用支持的soc之一替换<target_soc>
- generic: Generic un-optimized build for armv8 aarch64 execution mode.
- generic_aarch32: Generic un-optimized build for armv8 aarch32 execution mode.
- armada: Marvell ARMADA
- bluefield: NVIDIA BlueField
- centriq2400: Qualcomm Centriq 2400
- cn9k: Marvell OCTEON 9
- cn10k: Marvell OCTEON 10
- dpaa: NXP DPAA
- emag: Ampere eMAG
- ft2000plus: Phytium FT-2000+
- graviton2: AWS Graviton2
- kunpeng920: HiSilicon Kunpeng 920
- kunpeng930: HiSilicon Kunpeng 930
- n1sdp: Arm Neoverse N1SDP
- n2: Arm Neoverse N2
- stingray: Broadcom Stingray
- thunderx2: Marvell ThunderX2 T99
- thunderxt88: Marvell ThunderX T88
- thunderxt83: Marvell ThunderX T83
SoC配置是实施者和CPU部件号配置以及SoC特定配置的组合:
- soc_<name> = {
- 'description': 'SoC Description', # mandatory
- 'implementer': <implementer_id>, # mandatory
- 'part_number': <part_number>, # mandatory
- 'numa': false, # optional, specify for non-NUMA SoCs
- 'enable_drivers': 'common/*,bus/*', # optional, comma-separated list of
- # drivers to build, wildcards are accepted
- 'disable_drivers': 'crypto/*', # optional, comma-separated list of
- # drivers to disable, wildcards are accepted
- 'flags': [
- ['RTE_MAX_LCORE', '16'],
- ['RTE_MAX_NUMA_NODES', '1']
- ] # optional, list of DPDK options that will be added
- # or overwritten
- }
不同的PMD硬件可能需要不同的内核驱动程序才能正常工作。
根据所使用的PMD,应加载相应的内核驱动程序,并将网络端口/网卡绑定到该驱动程序。
(1)加载VFIO或UIO总线驱动。
(2)把网卡驱动绑定或挂载到VFIO或UIO总线驱动上。
网卡设备可通过PCI或PCIe总线外挂在硬件系统中。
网卡的驱动负责操作网卡硬件,需要把网卡驱动挂接到特定的总线上
(1)查看当前的状态
- ./usertools/dpdk-devbind.py --status
-
- Network devices using DPDK-compatible driver
- ============================================
- 0000:82:00.0 '82599EB 10-GbE NIC' drv=vfio-pci unused=ixgbe
- 0000:82:00.1 '82599EB 10-GbE NIC' drv=vfio-pci unused=ixgbe
-
- Network devices using kernel driver
- ===================================
- 0000:04:00.0 'I350 1-GbE NIC' if=em0 drv=igb unused=vfio-pci *Active*
- 0000:04:00.1 'I350 1-GbE NIC' if=eth1 drv=igb unused=vfio-pci
- 0000:04:00.2 'I350 1-GbE NIC' if=eth2 drv=igb unused=vfio-pci
- 0000:04:00.3 'I350 1-GbE NIC' if=eth3 drv=igb unused=vfio-pci
-
- Other network devices
- =====================
- <none>
(2)实施绑定
把网卡驱动绑定到vfio-pci总线驱动上。
./usertools/dpdk-devbind.py --bind=vfio-pci 04:00.1
or
./usertools/dpdk-devbind.py --bind=vfio-pci eth1
or
./usertools/dpdk-devbind.py --bind=ixgbe 82:00.*
随着虚拟化的出现,IOMMU也随之出现,IOMMU为每个直通的设备分配独立的页表,因此不同的直通设备(passthrough),彼此之间相互隔离;
VFIO兼顾了UIO和IOMMU的优点,在VFIO里,直通的最小单元不再是某个单独的设备了,而是分布在同一个group的所有设备;VFIO可以安全地把设备IO、中断、DMA等暴露到用户空间。
VFIO把设备通过 IOMMU 映射的DMA 物理内存地址映射到用户态
中,让用户态程序
可以自行操纵数据的传输,还可以自行注册中断处理函数,从而在用户态
下实现设备的驱动程序。
必须动态装载VFIO-pci总线驱动:
sudo modprobe vfio-pci
使用分叉驱动程序的PMD与设备内核驱动程序共存。在这种型号上,NIC由内核控制,而数据路径则由设备顶部的PMD直接执行。
这种模式具有以下优点:
它安全可靠,因为内存管理和隔离是由内核完成的。
它允许用户在相同的网络端口上运行DPDK应用程序时使用ethtool或ifconfig等遗留linux工具。
它使DPDK应用程序能够只过滤部分流量,而其余流量将由内核驱动程序引导和处理。流量分叉由NIC硬件执行。例如,使用流隔离模式可以严格选择DPDK中接收的内容。
UIO(Userspace I/O)是运行在用户空间的I/O技术。
Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能!
使用UIO可以避免设备的驱动程序需要随着内核的更新而更新的问题!
但UIO有它的不足之处,如不支持DMA、中断等;
在不能使用VFIO的情况下,可以使用Linux内核中包含的标准uio_pci_generic模块可以替代VFIO。可以使用以下命令加载此模块:
sudo modprobe uio_pci_generic
uiopcigeneric模块不支持创建虚拟函数,作为uio_pci_generic的替代品,可以在存储库dpdk-kmods中找到igb_uio模块。它可以加载,如下所示:
- sudo modprobe uio
- sudo insmod igb_uio.ko
备注:
如果有VFIO,就没有必要使用UIO了,因为VFIO能够实现UIO的内存映射功能 。
参见:3.2.4. Building Applications Using Installed DPDK
(1)示例
./dpdk-helloworld -l 0-3 -n 4
(2)选项
- ./rte-app [-c COREMASK | -l CORELIST] [-n NUM] [-b <domain:bus:devid.func>] \
- [--socket-mem=MB,...] [-d LIB.so|DIR] [-m MB] [-r NUM] [-v] [--file-prefix] \
- [--proc-type <primary|secondary|auto>]
7. Running Sample Applications — Data Plane Development Kit 22.07.0 documentation
其他示例应用程序包含在DPDK示例目录中。
这些示例应用程序的构建和运行方式可能与本手册前面章节中描述的类似。
此外,请参阅《DPDK示例应用程序用户指南》,以了解应用程序的描述、有关编译和执行的具体说明以及代码的一些说明。
本文档包含所有EAL参数的列表。
在Linux上运行的任何DPDK应用程序都可以使用这些参数。
8.1.1. Lcore-related options:cpu core相关选项
8.1.2. Device-related options:device相关的选项
8.1.3. Multiprocessing-related options:多核相关的选项
8.1.4. Memory-related options:内存相关的选项
8.1.5. Debugging options
8.1.6. Other options
8.2.1. Device-related options
8.2.2. Multiprocessing-related options
8.2.3. Memory-related options
8.2.4. Other options
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。