Linux平台上DPDK入门指南(二)

4. 编译和运行简单应用程序

本章介绍如何在DPDK环境下编译和运行应用程序。还指出应用程序的存储位置。
注意:此过程的部分操作也可以使用脚本来完成。

4.1. 编译一个简单应用程序

一个DPDK目标环境创建完成时(如 x86_64-native-linuxapp-gcc),它包含编译一个应用程序所需要的全部库和头文件。
当在Linux* 交叉环境中编译应用程序时,以下变量需要预先导出:

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

以下是创建helloworld应用程序实例,该实例将在DPDK Linux环境中运行。

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

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

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

ls build/app
    helloworld helloworld.map

注意:
在上面的例子中, helloworld 是在DPDK的目录结构下的。 当然,也可以将其放在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-linuxapp-gcc

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

4.2. 运行一个简单的应用程序

注意: UIO驱动和hugepage必须在程序运行前设置好。

注意:应用程序使用的任何端口,必须绑定到合适的内核驱动模块上,如章节 网络端口绑定/解绑定到内核去顶模块 描述的那样。
应用程序与DPDK目标环境的环境抽象层(EAL)库相关联,该库提供了所有DPDK程序通用的一些选项。

以下是EAL提供的一些选项列表:

./rte-app -c COREMASK [-n NUM] [-b <domain:bus:devid.func>] \
          [--socket-mem=MB,...] [-m MB] [-r NUM] [-v] [--file-prefix] \
          [--proc-type <primary|secondary|auto>] [-- xen-dom0]

选项描述如下:

  • -c COREMASK: 要运行的内核的十六进制掩码。注意,平台之间编号可能不同,需要事先确定。
  • -n NUM: 每个处理器插槽的内存通道数目。
  • -b <domain:bus:devid.func>: 端口黑名单,避免EAL使用指定的PCI设备。
  • --use-device: 仅使用指定的以太网设备。使用逗号分隔 [domain:]bus:devid.func 值,不能与 -b 选项一起使用。
  • --socket-mem: 从特定插槽上的hugepage分配内存。
  • -m MB: 内存从hugepage分配,不管处理器插槽。建议使用 --socket-mem 而非这个选项。
  • -r NUM: 内存数量。
  • -v: 显示启动时的版本信息。
  • --huge-dir: 挂载hugetlbfs的目录。
  • --file-prefix: 用于hugepage文件名的前缀文本。
  • --proc-type: 程序实例的类型。
  • --xen-dom0: 支持在Xen Domain0上运行,但不具有hugetlbfs的程序。
  • --vmware-tsc-map: 使用VMware TSC 映射而不是本地RDTSC。
  • --base-virtaddr: 指定基本虚拟地址。
  • --vfio-intr: 指定要由VFIO使用的中断类型。(如果不支持VFIO,则配置无效)。
    其中 -c 是强制性的,其他为可选配置。

将DPDK应用程序二进制文件拷贝到目标设备,按照如下命令运行(我们假设每个平台处理器有4个内存通道,并且存在core0~3用于运行程序):.

./helloworld -c f -n 4

注意:选项 --proc-type 和 --file-prefix 用于运行多个DPDK进程。

4.2.1. 应用程序使用的逻辑Core

对于DPDK应用程序,coremask参数始终是必须的。掩码的每个位对应于Linux提供的逻辑core ID。 由于这些逻辑core的编号,以及他们在NUMA插槽上的映射可能因平台而异,因此建议在选择每种情况下使用的coremaks时,都要考虑每个平台的core布局。

在DPDK程序初始化EAL层时,将显示要使用的逻辑core及其插槽位置。可以通过读取 /proc/cpuinfo 文件来获取系统上所有core的信息。例如执行 cat /proc/cpuinfo。 列出来的physical id 属性表示其所属的CPU插槽。当使用了其他处理器来了解逻辑core到插槽的映射时,这些信息很有用。

注意:可以使用另一个Linux工具 lstopo 来获取逻辑core布局的图形化信息。在Fedora Linux上, 可以通过如下命令安装并运行工具:

sudo yum install hwloc
./lstopo

注意:逻辑core在不同的电路板上可能不同,在应用程序使用coremaks时需要先确定。

4.2.2. 应用程序使用的Hugepage内存

当运行应用程序时,建议使用的内存与hugepage预留的内存一致。如果运行时没有 -m 或 --socket-mem 参数传入,这由DPDK应用程序在启动时自动完成。

如果通过显示传入 -m 或 --socket-mem 值,但是请求的内存超过了该值,应用程序将执行失败。 但是,如果用户请求的内存小于预留的hugepage-memory,应用程序也会失败,特别是当使用了 -m 选项的时候。 因为,假设系统在插槽0和插槽1上有1024个预留的2MB页面,如果用户请求128 MB的内存,可能存在64个页不符合要求的情况:

内核只能在插槽1中将hugepage-memory提供给应用程序。在这种情况下,如果应用程序尝试创建一个插槽0中的对象,例如ring或者内存池,那么将执行失败 为了避免这个问题,建议使用 --socket-mem 选项替代 -m 选项。
这些页面可能位于物理内存中的任意位置,尽管DPDK EAL将尝试在连续的内存块中分配内存,但是页面可能是不连续的。在这种情况下,应用程序无法分配大内存。
使用socket-mem选项可以为特定的插槽请求特定大小的内存。通过提供 --socket-mem 标志和每个插槽需要的内存数量来实现的,如 --socket-mem=0,512 用于在插槽1上预留512MB内存。 类似的,在4插槽系统上,如果只能在插槽0和2上分配1GB内存,则可以使用参数–socket-mem=1024,0,1024 来实现。 如果DPDK无法在每个插槽上分配足够的内存,则EAL初始化失败。

4.3. 其他示例程序

其他的一些示例程序包含在${RTE_SDK}/examples 目录下。这些示

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值