[架构之路-49]:目标系统 - 系统软件 - Linux下的网络通信-5-快速数据平面开发套件DPDK - 快速部署软件入门指南

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[架构之路-49]:目标系统 - 系统软件 - Linux下的网络通信-5-快速数据平面开发套件DPDK - 快速部署软件入门指南相关的知识,希望对你有一定的参考价值。

目录

前言:

第1章 概述

1.1 本文的英文参考

1.2 概述

1.3 DPDK常见的文档

第2章 系统需求

2.1.x86上的BIOS设置前提条件

2.2.编译DPDK的要求

2.3 运行DPDK应用程序的要求

第3章 从源代码编译DPDK目标文件

3.1.解压缩DPDK源代码

3.2 编译和安装DPDK

第4章 针对aarch64和aarch32交叉编译DPDK

4.1. Prerequisites

4.2. GNU toolchain

4.3. LLVM/Clang toolchain

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章 Linux Drivers

6.1. Binding and Unbinding Network Ports to/from the Kernel Modules

6.2. VFIO

6.3. Bifurcated Driver

6.4. UIO (当没有VFIO时)

第7章 运行示例应用程序

7.1. Compiling a Sample Application

7.2. Running a Sample Application(hello world)

7.3. Additional Sample Applications

8. EAL parameters

8.1. Common EAL parameters

8.2. Linux-specific EAL parameters


前言:

本文是在理解DPDK原理的基础之上,探讨针对特定的硬件系统,如何下载、编译、配置、部署DPDK开源软件。

第1章 概述

1.1 本文的英文参考:

Getting Started Guide for Linux — Data Plane Development Kit 22.07.0 documentation

1.2 概述

本文档包含安装配置数据平面开发工具包(DPDK)软件的说明。

它旨在让客户快速启动和运行。

本文档描述了如何在Linux应用程序(Linux)环境中编译和运行DPDK应用程序,而不深入讨论细节。

1.3 DPDK常见的文档

(1)发布说明:

提供特定于发行版的信息,包括支持的功能、限制、修复的问题、已知问题等。此外,还以常见问题解答格式提供常见问题的答案。

(2)Linux入门指南(本文档):

介绍如何安装和配置DPDK;旨在让用户快速启动并运行该软件。

(3)程序员指南:

描述:

  • 目标系统:软件体系结构以及如何使用它(通过示例),特别是在Linux*应用程序(Linux)环境中,DPDK的工作原理在这里可以查到。
  • 构建系统:DPDK的内容、构建系统(包括可用于构建开发工具包和应用程序的命令)以及移植应用程序的指南。本文探讨的就是构建系统。
  • 优化:软件中使用的优化以及新开发中应考虑的优化
  • 还提供了术语表。

(4)API参考:

提供有关DPDK函数、数据结构和其他编程构造的详细信息。

(5)示例应用程序用户指南:

描述一组示例应用程序

每章都描述了一个示例应用程序,该应用程序展示了特定的功能,并提供了有关如何编译、运行和使用示例应用程序的说明。

(6)驱动程序员参考指南:

提供特定类别内每个驱动的详细信息。以下各项都有单独的指南:

第2章 系统需求

本章介绍编译DPDK所需的软件包。

2.1.x86上的Bios设置前提条件

对于大多数平台,使用基本DPDK功能不需要特殊的BIOS设置。然而,对于附加的HPET计时器和电源管理功能,以及小数据包的高性能,可能需要更改BIOS设置。

有关所需更改的更多信息,请参阅启用其他功能部分。

2.2.编译DPDK的要求

(1)所必须的工具和库:

不同系统上所需的设置命令和安装的软件包可能不同。

有关Linux发行版和测试版本的详细信息,请参阅DPDK发行说明。

  • 通用的开发工具套件:包括支持的C编译器,如gcc(4.9+版)或clang(3.4+版),以及针对DPDK构建最终用户二进制文件时使用的pkg-config或pkgconf。.
    • For RHEL/Fedora systems these can be installed using dnf groupinstall "Development Tools"
    • For Ubuntu/Debian systems these can be installed using apt install build-essential
    • For Alpine Linux, apk add alpine-sdk bsd-compat-headers libexecinfo-dev

        备注:

        RHEL-7提供的pkg-config 0.27无法正确处理Libs.private部分,导致静态链接的应用程序无法正确链接。构建应用程序时,请改用更新版本的pkg-config或pkgconf。

  • Python 3.5 or later.
  • Meson (version 0.49.2+) and ninja    =》旨在开发最具可用性和快速的构建系统
    • meson & ninja-build packages in most Linux distributions
    • If the packaged version is below the minimum version, the latest versions can be installed from Python’s “pip” repository: pip3 install meson ninja
  • pyelftools (version 0.22+)  =》解析ELF格式内容
    • For Fedora systems it can be installed using dnf install python-pyelftools
    • For RHEL/CentOS systems it can be installed using pip3 install pyelftools
    • For Ubuntu/Debian it can be installed using apt install python3-pyelftools
    • For Alpine Linux, apk add py3-elftools
  • Library for handling NUMA (Non Uniform Memory Access)  =》 无统一内存访问技术可以使众多服务器像单一系统那样运转,同时保留小系统便于编程和管理的优点.
    • numactl-devel in RHEL/Fedora;
    • libnuma-dev in Debian/Ubuntu;
    • numactl-dev in Alpine Linux

备注:请确保将最新补丁应用于第三方库和软件,以避免任何已知漏洞。

(2)可选的工具和库

  • 英特尔X86 Linux:C++编译器(icc)。对于安装,可能需要其他库。请参阅编译器安装下Documentation目录中的icc Installation Guide。
  • 用于Powerlinux的IBM®Advance ToolChain。这是一组开源开发工具和运行库,允许用户利用IBM最新的POWERPC硬件功能在Linux上的取得领先优势。要安装它,请参阅IBM官方安装文档。

(3)其他的工具和库

许多DPDK组件(如库和轮询模式驱动程序(PMD))都有附加的依赖项。对于DPDK构建,将自动检测是否存在这些依赖项,以适当启用或禁用相关组件。

在每种情况下,都需要相关的库开发包(-devel或-dev)来构建DPDK组件。

  • libarchive: for some unit tests using tar to get their resources.
  • libelf: to compile and use the bpf library.

备注:对于轮询模式驱动程序,可以在相关DPDK指南文档中的驱动程序文档中找到每个驱动程序的附加依赖项。

2.3 运行DPDK应用程序的要求

要运行DPDK应用程序,可能需要在目标计算机上进行一些自定义。

2.3.1 操作系统软件

  • Kernel version >= 4.4    //uname -r
  • glibc >= 2.7 (for features related to cpuset)   //ldd --version
  • 内核配置:在Fedora OS和其他常见发行版(如Ubuntu或Red Hat Enterprise Linux)中,供应商提供的内核配置可用于运行大多数DPDK应用程序。对于其他内核构建,应为DPDK启用的选项包括:
    • HUGETLBFS     //大页面的支持
    • PROC_PAGE_MONITOR support  //进程内存页监控
    • HPET and HPET_MMAP configuration options should also be enabled if HPET support is required. See the section on High Precision Event Timer (HPET) Functionality for more details.  //高精度定时器与大内存页的映射。

2.3.2 在Linux环境中使用Hugepages

页表是一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。

每一个进程都拥有一个自己的页表,PCB表中有指针指向页表。

用固定大小的页(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

第3章 从源代码编译DPDK目标文件

3.1.解压缩DPDK源代码

首先,解压缩存档并移动到解压缩的DPDK源目录:

tar xJf dpdk-<version>.tar.xz
cd dpdk-<version>
  • doc: DPDK Documentation
  • license: DPDK license information
  • lib: Source code of DPDK libraries
  • drivers: Source code of DPDK poll-mode drivers
  • app: Source code of DPDK applications (automatic tests)
  • examples: Source code of DPDK application examples
  • config, buildtools: Framework-related scripts and configuration
  • usertools: Utility scripts for end-users of DPDK applications
  • devtools: Scripts for use by DPDK developers
  • kernel: Kernel modules needed for some operating systems

3.2 编译和安装DPDK

可以使用meson和ninja工具在您的系统上配置、构建和安装DPDK。

  • Meson 旨在开发最具可用性和快速的构建系统。提供简单但强大的声明式语言用来描述构建。原生支持最新的工具和框架,如 Qt5 、代码覆盖率、单元测试和预编译头文件等。
  • Ninja 是Google的一名程序员推出的注重速度的构建工具,一般在Unix/Linux上的程序通过make/makefile来构建编译,而Ninja通过将编译任务并行组织,大大提高了构建速度。

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)

第4章 针对aarch64和aarch32交叉编译DPDK

本章介绍如何在x86构建计算机上交叉编译aarch64的DPDK,以及如何在aarch64构建计算机上编译32位aarch32 DPDK。

虽然可以直接在目标环境中编译,实际上,也可以通过x86进行交叉编译,后者是一个更加通用的方法。交叉编译可以使用aarch64交叉编译器GNU工具链或LLVM/clang工具链

4.1. Prerequisites

4.1.1. NUMA library

4.1.2. Meson prerequisites

4.2. GNU toolchain

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. LLVM/Clang toolchain

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

4.4. Building for an aarch64 SoC on an aarch64 build machine

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

4.5. Supported SoC configuration

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

第5章 Cross compiling DPDK for RISC-V

第6章 Linux Drivers

不同的PMD硬件可能需要不同的内核驱动程序才能正常工作。

根据所使用的PMD,应加载相应的内核驱动程序,并将网络端口/网卡绑定到该驱动程序

(1)加载VFIO或UIO总线驱动。

(2)把网卡驱动绑定或挂载到VFIO或UIO总线驱动上。

6.1. Binding and Unbinding Network Ports to/from the Kernel Modules

网卡设备可通过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.*

6.2. VFIO

随着虚拟化的出现,IOMMU也随之出现,IOMMU为每个直通的设备分配独立的页表,因此不同的直通设备(passthrough),彼此之间相互隔离;

VFIO兼顾了UIOIOMMU的优点,在VFIO里,直通的最小单元不再是某个单独的设备了,而是分布在同一个group的所有设备;VFIO可以安全地把设备IO、中断、DMA等暴露到用户空间。

VFIO把设备通过 IOMMU 映射的DMA 物理内存地址映射到用户态中,让用户态程序可以自行操纵数据的传输,还可以自行注册中断处理函数,从而在用户态下实现设备的驱动程序。

必须动态装载VFIO-pci总线驱动:

sudo modprobe vfio-pci

6.3. Bifurcated Driver

使用分叉驱动程序的PMD与设备内核驱动程序共存。在这种型号上,NIC由内核控制,而数据路径则由设备顶部的PMD直接执行。

这种模式具有以下优点:

它安全可靠,因为内存管理和隔离是由内核完成的。

它允许用户在相同的网络端口上运行DPDK应用程序时使用ethtool或ifconfig等遗留linux工具。

它使DPDK应用程序能够只过滤部分流量,而其余流量将由内核驱动程序引导和处理。流量分叉由NIC硬件执行。例如,使用流隔离模式可以严格选择DPDK中接收的内容。

6.4. UIO (当没有VFIO时

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的内存映射功能 。

第7章 运行示例应用程序

7.1. Compiling a Sample Application

参见:3.2.4. Building Applications Using Installed DPDK

7.2. Running a Sample Application(hello world)

(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

7.3. Additional Sample Applications

其他示例应用程序包含在DPDK示例目录中。

这些示例应用程序的构建和运行方式可能与本手册前面章节中描述的类似。

此外,请参阅《DPDK示例应用程序用户指南》,以了解应用程序的描述、有关编译和执行的具体说明以及代码的一些说明。

8. EAL parameters

本文档包含所有EAL参数的列表。

在Linux上运行的任何DPDK应用程序都可以使用这些参数。

8.1. Common EAL parameters

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. Linux-specific EAL parameters

8.2.1. Device-related options

8.2.2. Multiprocessing-related options

8.2.3. Memory-related options

8.2.4. Other options

以上是关于[架构之路-49]:目标系统 - 系统软件 - Linux下的网络通信-5-快速数据平面开发套件DPDK - 快速部署软件入门指南的主要内容,如果未能解决你的问题,请参考以下文章

[架构之路-56]:目标系统 - 平台软件 - 总体架构概述

[架构之路-28]:目标系统 - 系统软件 - Linux OS内核功能架构图解内核构建内核启动流程

[架构之路-25]:目标系统 - 系统软件 - bootloader uboot内存映射与启动流程

[架构之路-21]:目标系统 - 系统软件 - 计算机系统架构计算机指令系统结构化程序与分层编程。

[架构之路-29]:目标系统 - 系统软件 - Linux OS内核以及内核驱动的调试技术

[架构之路-26]:目标系统 - 系统软件 - bootloader uboot使用方法常用命令