Getting Started Guide for Linux(6)编译和运行示例应用程序(包括EAL通用命令选项)

官方文档查看地址:
http://doc.dpdk.org/guides/linux_gsg/build_sample_apps.html
PDF下载地址:
https://www.intel.com/content/www/us/en/embedded/technology/packet-processing/dpdk/dpdk-getting-started-guide.html

本篇难度系数:
翻译:★☆☆☆☆
理解:★☆☆☆☆

6.编译和运行示例应用程序
本章描述如何在DPDK环境中编译和运行应用程序。它还提供了一个指向示例应用程序存储位置的指针。

请注意
这个过程的某些部分也可以使用安装脚本完成,该脚本描述了本文档的快速启动安装脚本(http://doc.dpdk.org/guides/linux_gsg/quick_start.html#linux-setup-script)部分。

6.1编译示例应用程序
一旦创建了DPDK目标环境目录(例如x86_64-native-linux-gcc),它就包含构建应用程序所需的所有库和头文件。

在DPDK的Linux*环境中编译应用程序时,必须导出以下变量:

  • RTE_SDK - 指向DPDK安装目录。
  • RTE_TARGET - 指向DPDK目标环境目录。

下面是一个创建helloworld应用程序的示例,它在DPDK Linux环境中运行。这个例子可以在${RTE_SDK}/examples目录中找到。

该目录包含main.c文件。当该文件与DPDK目标环境中的库相结合时,调用各种函数来初始化DPDK环境,然后为要使用的每个CPU核启动一个入口点(分派应用程序)。默认情况下,二进制文件是在build目录中生成的。

cd examples/helloworld/
export RTE_SDK=$HOME/DPDK
export RTE_TARGET=x86_64-native-linux-gcc

make
    CC main.o
    LD helloworld
    INSTALL-APP helloworld
    INSTALL-MAP helloworld.map

ls build/app
    helloworld helloworld.map

请注意
在上面的示例中,helloworld位于DPDK的目录结构中。但是,它可能位于目录结构之外,以保持DPDK结构的完整性。在下面的例子中,helloworld应用程序被复制到一个新目录中,作为一个新的起点。

export RTE_SDK=/home/user/DPDK
cp -r $(RTE_SDK)/examples/helloworld my_rte_app
cd my_rte_app/
export RTE_TARGET=x86_64-native-linux-gcc

make
  CC main.o
  LD helloworld
  INSTALL-APP helloworld
  INSTALL-MAP helloworld.map

6.2运行示例应用程序

警告
在运行应用程序之前,请确保:完成了
Hugepages设置。
正在使用的任何内核驱动程序都已加载。
如果需要,应用程序使用的端口应该绑定到相应的内核驱动程序。

有关更多细节,请参考Linux驱动程序(http://doc.dpdk.org/guides/linux_gsg/linux_drivers.html#linux-gsg-linux-drivers)。

该应用程序与DPDK目标环境的环境抽象层(EAL)库链接,后者提供了对每个DPDK应用程序通用的一些选项

以下是可向EAL提供的选项列表:

./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>]

EAL的选项如下:

  • -c COREMASK-l CORELIST:一个运行在内核上的十六进制位掩码。注意,核心编号可能在平台之间发生变化,应该事先确定。corelist是一组核心数字,而不是位图核心掩码。
  • -n NUM:每个处理器套接字的内存通道数。
  • -b <domain:bus:devid.func>:港口黑名单;防止EAL使用指定的PCI设备(允许多个-b选项)。
  • --use-device:只使用指定的以太网设备。使用逗号分隔[domain:]bus:devid.func值。不能与-b选项一起使用。
  • --socket-mem:从特定套接字上的巨页分配的内存。在动态内存模式下,该内存也将被固定(即在应用程序关闭之前不会释放回系统)。
  • --socket-limit:限制每个套接字上可用的最大内存。不支持遗留内存模式。
  • -d 添加要加载的驱动程序或驱动程序目录。应用程序应该使用此选项加载作为共享库构建的pmd驱动程序。
  • -m MB:内存分配从巨大的页面,不管处理器插座。建议使用–socket-mem来代替这个选项。
  • -r NUM:内存等级的数量。
  • -v:启动时显示版本信息。
  • --huge-dir:挂载hugetlbfs的目录。
  • mbuf-pool-ops-name:要使用的mbuf的池操作名称。
  • --file-prefix:用于大页文件名的前缀文本。
  • --proc-type:流程实例的类型。
  • --vmware-tsc-map:使用VMware TSC map代替本地RDTSC。
  • --base-virtaddr:指定基本虚拟地址。
  • --vfio-intr:指定VFIO要使用的中断类型(如果不使用VFIO,则没有效果)。
  • --legacy-mem:在遗留内存模式下运行DPDK(在运行时禁用内存储备/取消储备,但提供更多的iova -毗连内存)。
  • --single-file-segments:将内存段存储在更少的文件中(仅动态内存模式—不影响遗留内存模式)。

-c-l和选项是强制性的;其他选项是可选的。

将DPDK应用程序二进制文件复制到目标中,然后按如下方式运行应用程序(假设平台每个处理器套接字有4个内存通道,并且内核0-3存在,并将用于运行应用程序):

./helloworld -l 0-3 -n 4

请注意
–proc-type 和–file-prefixEAL选项用于运行多个DPDK进程。有关详细信息,请参阅DPDK样例应用程序用户指南和DPDK程序员指南中的“多进程样例应用程序”(Multi-process Sample Application)一章。

6.2.1应用程序使用的逻辑核心
对于DPDK应用程序,coremask (-c 0x0f)或corelist (-l 0-3)参数始终是必需的。掩码的每个位对应于Linux报告的等效逻辑CPU核心号。首选的corelist选项是定义要使用的核心的更简洁的方法。由于这些逻辑核心编号以及它们到特定NUMA套接字上的特定核心的映射可能因平台而异,因此建议在选择每种情况下使用的coremask/corelist时考虑每个平台的核心布局。

在DPDK应用程序初始化EAL层时,将显示要使用的逻辑内核及其套接字位置。还可以通过检查/proc/cpuinfo文件(例如,运行cat /proc/cpuinfo.)来为系统上的所有核心确定此信息为每个处理器列出的物理id属性表示它所属的CPU套接字。当使用其他处理器来理解逻辑核心到套接字的映射时,这是非常有用的。

请注意
可以使用lstopo Linux实用程序获得逻辑核心布局的更图形化视图。在Fedora Linux上,可以使用以下命令安装并运行该命令:

sudo yum install hwloc
./lstopo

警告
逻辑核心布局可以在不同的板布局之间更改,应该在选择应用程序coremask/corelist之前进行检查。

6.2.2应用程序使用的巨大内存
在运行应用程序时,建议使用与分配给hugepages相同的内存。如果在运行时没有传递-m或--socket-mem参数,则DPDK应用程序在启动时自动执行使用分配给hugepages的内存。

如果通过显式传递-m或--socket-mem值请求更多内存,应用程序将失败。但是,如果用户请求的内存少于保留的大页内存,应用程序本身也可能失败,特别是使用-m选项时。原因如下。假设系统在套接字0中保留了1024个2MB的页面,在套接字1中保留了1024个页面。如果用户请求128MB内存,64页可能不匹配约束:

  • 只有套接字1中的内核才会将内存分配给应用程序。在这种情况下,如果应用程序试图在套接字0中创建一个对象,例如一个环或内存池,则会失败。为了避免这个问题,建议使用--socket-mem选项而不是-m选项。
  • 这些页面可以位于物理内存中的任何位置,尽管DPDK EAL将尝试在相邻块中分配内存,但这些页面可能不是相邻的。在这种情况下,应用程序不能分配大内存池。

socket-mem 选项可用于为特定套接字请求特定数量的内存。这是通过提供--socket-mem标志和每个套接字上请求的内存量来实现的,例如,供应--socket-mem=0,512,尝试只为套接字1保留512 MB。类似地,在一个4套接字系统上,要仅在每个套接字0和2上分配1 GB内存,可以使用参数--socket-mem=1024,0,1024。任何没有显式引用的CPU套接字上都不会保留内存,例如,在本例中,套接字3。如果DPDK不能在每个套接字上分配足够的内存,则EAL初始化将失败。

6.3额外的示例应用程序
${RTE_SDK}/examples目录中包含其他示例应用程序。这些示例应用程序的构建和运行方式可能与本手册前面部分描述的类似。此外,有关应用程序的描述、编译和执行的特定说明以及代码的一些解释,请参阅DPDK示例应用程序用户指南。

6.4额外的测试应用程序
此外,在创建库时还要构建另外两个应用程序。这些文件的源文件位于DPDK/app目录中,称为test和testpmd。创建库之后,可以在build/app目录中找到它们。测试应用程序为DPDK中的各种功能提供了各种特定的测试testpmd应用程序提供了许多不同的数据包吞吐量测试和特性示例,例如如何使用Intel®82599 10千兆以太网控制器中的流控制器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章