9. 应用程序可移植性注意事项

ODP旨在支持创建可轻松在多个平台上运行的可移植数据面应用程序,同时充分利用运行平台的硬件加速功能。 本节讨论应用程序开发人员在使用ODP时应考虑的问题。

首先,应该注意的是,可移植性不是绝对的,也不是一个单值属性。 虽然任何应用程序可以从一个平台移植到另一个平台,但真正的问题是:以什么样的代价? 这个开销可以从两个维度上衡量:移植所需的工作量和移植导致的性能差异。 理想情况下,应用程序应该在平台之间以最小的工作量完成移植,且具有最小的性能影响。 虽然ODP旨在支持这一理想目标,但每个应用程序都必须评估其移植所要达到的目标以及如何使用ODP来实现这一目标。

9.1. 可移植性和共存性

由于ODP提供的是编程框架而不是编程环境,因此它可以与其他框架提供的API一起工作,同时具有最小的干扰。 因此,当我们谈到ODP环境中的可移植性时,我们必须说明应用程序中使用ODP API的那些部分的可移植性。 如果应用程序使用非ODP API,则在评估整个应用程序的可移植性时必须考虑这些其他的API。 对于许多应用程序,将某些非可移植的代码隔离到应用程序的几个区域就足够了,结果是应用程序比没有使用ODP的应用程序更方便移植。 特别是在处理在生产环境中运行的现有应用程序时,可能会以增量的方式引入ODP,结果是随着时间的推移应用程序变得更加具有可移植性。

9.2. 源代码 vs 二进制文件移植

ODP旨在支持源代码和二进制文件的可移植性。 源代码可移植是ODP API规范本身所固有的。 写入ODP API规范的任何应用程序将在任何符合ODP规范的ODP实现之间进行源代码的移植,最多只需要重新编译。 这是因为ODP API不会暴露实现细节或可能因平台而异的内部结构。

对于共享通用指令集架构(ISA)的平台,ODP还可以通过应用二进制接口(ABI)的规范提供二进制可移植性。 这在网络功能虚拟化(NFV)环境中特别有用。在NFV中,可以在一个平台上开发和编译数据平面应用程序以进行分发,然后通过NFV Orchestrator功能部署在许多不同的平台上。

9.3. ODP应用程序配置文件

为了帮助满足这些需求,ODP提供了两个不同的应用程序配置文件,旨在表征不同类型的数据平面应用程序的需求:嵌入式配置文件和云端配置文件。

9.3.1. 嵌入式配置文件

当希望程序针对特定平台,希望在该平台上实现最佳性能,且源代码可移植性足够,那么就可以使用嵌入式配置文件。 如果这样的应用程序需要支持多个平台,那么它们只需要针对该平台的ODP实现进行重新编译。

嵌入式应用程序通常使用从git存储库下载的ODP副本,以便可以根据应用程序的精确需求进行配置。 要指定应用程序的平台,使用嵌入的配置文件:

./configure --enable-abi-compat=no ...

应该用作ODP配置选项的一部分。 这允许应用程序使用内联形式的ODP API来在此平台上提供最佳性能,并可能包括一些其他的优化。 这个结果是得到一个二进制文件,可以在给定的目标平台上实现最高性能,并可以通过重新编译移植到其他平台。

9.3.2. 云端配置文件

相比直线,ODP云端配置文件旨在支持希望与平台无关的应用程序,并在共享此ABI的所有平台上进行二进制兼容。 Linux配置中包含的任何ODP实现将被配置为云配置文件,因此在针对分布式ODP副本(通过sudo apt-get install或等效命令安装的ODP)进行编译时,不需要额外的操作。

当使用从repo中下载的ODP副本时,配置时将使用云配置文件:

./configure --enable-abi-compat=yes ...

Note

请注意,–enable-abi-compat = yes是默认值,因此不需要指定。除非为此选项指定了no,否则结果将是旨在在云配置文件中运行的应用程序。

9.4. ABI特性

ABI由几个约定组成,确保根据一个ODP实现编译的程序可以在另一个具有可能非常不同的ODP实现但不需要重新编译的平台上运行。 这些约定包括:

  • 一组函数调用约定,定义函数如何调用其他函数,传递参数和接收返回的结果。这些通常由操作系统(如Linux)指定,并独立于ODP。
  • 避免使用任何ODP API的内联扩展。这可以确保不同的ODP实现可以维护其不同的内部构件,而这些差异对于应用程序是可见的。
  • 共享此ABI定义的所有ODP实现使用的ODP抽象数据类型的大小和一致性的协议。 这意味着,例如,odp_packet_t句柄的大小在ABI的所有成员中是相同的。 由于这些句柄是不透明的,所以ODP实现之间的结构不一样,因为应用程序从不引用这些可能不同的内部结构。

Note

请注意,ABI定义存在于特定指令集架构(ISA)中,如x86-64或AArch64。 二进制文件不能直接在ISA之间进行连接,需要重新编译。

每个ODP实现将确定其支持的ABI定义(如果有的话)。 当在ABI compabitilty模式下编译ODP实现时,生成的二进制文件与共享此ABI的所有其他ODP实现自动二进制兼容。 例如,对于x86-64 ISA,odp-linux和odp-dpdk实现都是常见的ABI。