[DPDK]Linux平台上DPDK入门指南(一)
1.1 简介
本文档包含DPDK软件安装和配置的相关说明。旨在帮助用户快速启动和运行软件。文档主要描述了在Linux环境下编译和 运行DPDK应用程序,但是文档并不深入DPDK的具体实现细节。
1.1.1 文档地图
以下是一份建议顺序阅读的DPDK参考文档列表:
-
发布说明:提供特性发行版本的信息,包括支持的功能,限制,修复的问题,已知的问题等等。此外,还以FAQ方式提供了常见问题及解答。
-
入门指南(本文档):介绍如何安装和配置DPDK,旨在帮助用户快速上手。
-
编程指指南:描述如下内容:
–软件架构及如何使用(实例介绍),特别是在Linux环境中的用法
–DPDK的主要内容,系统构建(包括可以在DPDK根目录Makefile中来构建工具包和应用程序的命
令)及应用移植细则。
–软件中使用的,以及新开发中需要考虑的一些优化。
还提供了文档使用的术语表。 -
API参考:提供有关DPDK功能、数据结构和其他编程结构的详细信息。
-
示例程序用户指南:描述了一组例程。每个章节描述了一个用例,展示了具体的功能,并提供了有关如何编译、运行和使用的说明。
1.2 系统要求
本章描述了编译DPDK所需的软件包。
1.2.1 X86上预先设置BIOS
对大多数平台,使用基本DPDK功能无需对BIOS进行特殊设置。然而,对于HPET定时器和电源管理功能,以及为了获得40G网卡上小包处理的高性能,则可能需要更改BIOS设置。可以参阅章节EnablingAdditional Functionality
以获取更为详细的信息。
1.2.2 编译DPDK
工具集:
Note: 以下说明在Fedora18上通过了测试。其他系统所需要的安装命令和软件包可能有所不同。有关其他Linux发行版本和测试版本的详细信息,请参阅DPDK发布说明。
- GNU make.
- coreutils: cmp, sed, grep, arch 等.
- gcc: 4.9以上的版本适用于所有的平台。 在某些发布版本中,启用了一些特定的编译器标志和链接标志
(例如‘‘-fstack-protector‘‘)。请参阅文档的发布版本和 gcc -dumpspecs. - libc 头 文 件 , 通 常 打 包 成 gcc-multilib (glibc-devel.i686 / libc6-dev-i386;
glibc-devel.x86_64 / libc6-dev 用于Intel 64位架构编译; glibc-devel.ppc64 用于IBM
64位架构编译;) - 构建Linux内核模块所需要的头文件和源文件。(kernel - devel.x86_64; kernel - devel.ppc64)
- 在64位系统上编译32位软件包额外需要的软件为:
– glibc.i686, libgcc.i686, libstdc++.i686 及 glibc-devel.i686, 适用于Intel的i686/x86_64;
– glibc.ppc64, libgcc.ppc64, libstdc++.ppc64 及 glibc-devel.ppc64 适用于 IBM ppc_64;
Note: x86_x32 ABI目前仅在Ubuntu 13.10及以上版本或者Debian最近的发行版本上支持。编译器必须
是gcc 4.9+版本。
- Python, 2.7+ or 3.2+版本, 用于运行DPDK软件包中的各种帮助脚本。
可选工具:
• Intel® C++ Compiler (icc). 安装icc可能需要额外的库,请参阅编译器安装目录下的icc安装指南。
• IBM® Advance ToolChain for Powerlinux. 这是一组开源开发工具和运行库。允许用户在Linux上使
用IBM最新POWER硬件的优势。具体安装请参阅IBM的官方安装文档。
• libpcap 头文件和库 (libpcap-devel) ,用于编译和使用基于libcap的轮询模式驱动程序。默认情况下,该
驱动程序被禁用,可以通过在构建时修改配置文件 CONFIG_RTE_LIBRTE_PMD_PCAP=y 来开启。
• 需要使用libarchive 头文件和库来进行某些使用tar获取资源的单元测试。
1.2.3 运行DPDK应用程序
要运行DPDK应用程序,需要在目标机器上进行某些定制。
系统软件
需求:
• Kernel version >= 2.6.34
当前内核版本可以通过命令查看uname -r
glibc >= 2.7 (方便使用cpuset相关特性)
版本信息通命令 ldd --version 查看。
• Kernel configuration
对于其他内核构件,应为DPDK开启的选项包括:
– UIO 支持
– HUGETLBFS 支持
– PROC_PAGE_MONITOR 支持
– 如果需要HPET支持,还应开启 HPET and HPET_MMAP 配置选项。有关信息参考 High Precision Event Timer (HPET) Functionality 章节获取更多信息。
在 Linux 环境中使用 Hugepages
用于数据包缓冲区的大型内存池分配需要 Hugepages 支持(如上节所述,必须在运行的内核中开启HUGETLBFS 选项)。通过使用大页分配,程序需要更少的页面,性能增加, 因为较少的TLB减少了将虚拟页面地址翻译成物理页面地址所需的时间。如果没有大页,标准大小4k的页面会导致频繁的TLB miss,性能下降。
预留 Hugepages 给 DPDK 使用
大页分配应该在系统引导时或者启动后尽快完成,以避免物理内存碎片化。要在引导时预留大页,需要给Linux内核命令行传递一个参数。
对于2MB大小的页面,只需要将hugepages选项传递给内核。如,预留1024个2MB大小的page,使用:hugepages=1024
对于其他大小的hugepage,例如1G的页,大小必须同时指定。例如,要预留4个1G大小的页面给程序,需要传递以下选项给内核:default_hugepagesz=1G hugepagesz=1G hugepages=4
Note: 对于64位程序,如果平台支持,建议使用1GB的hugepages。
特例:
对于2MB页面,还可以在系统启动之后再分配,通过向 /sys/devices/ 目录下的nr_hugepages文件写入hugepage数目来实现。 对于单节点系统,使用的命令如下(假设需要1024个页):
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/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
Note: 对于1G页面,系统启动之后无法预留页面内存。
DPDK 使用 Hugepages
一旦预留了hugepage内存,为了使内存可用于DPDK,请执行以下步骤:
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
通过将一下命令添加到 /etc/fstab 文件中,安装点可以在重启时永久保存:
nodev /mnt/huge hugetlbfs defaults 0 0
对于1GB内存,页面大小必须在安装选项中指定:
nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0
配置内存用于DPDK使用
在加载rte_dom0_mm.ko内核模块之后,用户必须配置DPDK使用的内存大小。这也是通过将内存大小写入到目录 /sys/devices/ 下的文件memsize中来实现的。 使用以下命令(假设需要2048MB):
echo 2048 > /sys/kernel/mm/dom0-mm/memsize-mB/memsize
用户还可以使用下面命令检查已经使用了多少内存:
cat /sys/kernel/mm/dom0-mm/memsize-mB/memsize_rsvd
Xen Domain0 不支持NUMA配置,因此 --socket-mem 命令选项对Xen Domain0无效。
Note: memsize的值不能大于rsv_memsize。
要在Xen Domain0上运行DPDK程序,需要一个额外的命令行选项 --xen-dom0
1.3 使用源码编译DPDK目标文件
Note: 这个过程的部分工作可以通过章节 使用脚本快速构建 描述的脚本来实现。
1.3.1 安装DPDK及源码
首先,解压文件并进入到DPDK源文件根目录下:
tar xJf dpdk-<version>.tar.xz
cd dpdk-<version>
DPDK源文件由几个目录组成:
• lib: DPDK 库文件
• drivers: DPDK 轮询驱动源文件
• app: DPDK 应用程序 (自动测试)源文件
• examples: DPDK 应用例程
• config, buildtools, mk: 框架相关的makefile、脚本及配置文件
1.3.2 DPDK目标环境安装
DPDK目标文件的格式为:ARCH-MACHINE-EXECENV-TOOLCHAIN
其中:
• ARCH 可以是: i686, x86_64, ppc_64
• MACHINE 可以是: native, power8
• EXECENV 可以是: linuxapp, bsdapp
• TOOLCHAIN 可以是: gcc, icc
目标文件取决于运行环境是32位还是64位设备。可以在DPDK的 /config 目录中找到可用的目标,不能使用defconfig_
前缀。
当使用Intel® C++ 编译器 (icc)时,对64位和32位,需要使用以下命令进行调整。 注意,shell脚本会更新$PATH
值,因此不能再同一个会话中执行。 此外,还应该检查编译器的安装目录,因为可能不同。
source /opt/intel/bin/iccvars.sh intel64
source /opt/intel/bin/iccvars.sh ia32
在顶级目录中使用 make install T=<target>
来生成目标文件。
例如,为了使用icc编译生成64位目标文件,运行如下命令:
make install T=x86_64-native-linuxapp-icc
为了使用gcc编译生成32位目标文件,命令如下:
make install T=i686-native-linuxapp-gcc
如果仅仅只是生成目标文件,并不运行,比如,配置文件改变需要重新编译,使用 make config
T= 命令:
make config T=x86_64-native-linuxapp-gcc
Warning: 任何需要运行的内核模块,如 igb_uio, kni, 必须在与目标文件编译相同的内核下进行编 译。
如果DPDK未在目标设备上构建,则应使用 RTE_KERNELDIR 环境变量将编译指向要在目标机上使
用的内核版本的副本(交叉编译的内核版本)。
创建目标环境之后,用户可以移动到目标环境目录,并继续更改代码并编译。用户还可以通过编辑build目录中的.config文件对DPDK配置进行修改。 (这是顶级目录中defconfig文件的本地副本)。
cd x86_64-native-linuxapp-gcc
vi .config
make
此外,make clean
命令可以用于删除任何现有的编译文件,以便后续完整、干净地重新编译代码。
1.3.3 Browsing the Installed DPDK Environment Target
一旦目标文件本创建,它就包含了构建客户应用程序所需的DPDK环境的所有库,包括轮询驱动程序和头文
件。 此外,test和testpmd应用程序构建在build/app目录下,可以用于测试。 还有一个kmod目录,存放可能
需要加载的内核模块。