使用 Graviton 的移植顾问

作者: 希拉·布瑟 | 2023 年 2

这篇博客文章由 亚马逊云科技 的 Ryan Doty Solutions Architect 和 Vishal Manan Sr.SSA、EC2 Graviton、亚马逊云科技 撰写。

亚马逊云科技 客户认识到,基于 Graviton 的 EC2 实例具有性价比优势,但许多人对移植现有应用程序的努力感到担忧。将代码从一种架构移植到另一种架构可能需要投入时间和精力。亚马逊云科技 一直在努力改善客户的迁移流程。我们最近推出了Graviton的移植顾问作为进一步简化迁移过程的工具。在这篇博客中,我们将引导你了解如何使用适用于 Graviton 的 Porting Advisor,这样你就可以学习如何使用它。

Porting Advisor for Graviton 是一款开源命令行工具,可分析源代码并生成报告,重点介绍缺失或过时的库和可能需要修改的代码结构,并为用户提供替代建议。它通过减少识别和解析源代码和库依赖关系的迭代过程,帮助客户和开发人员加快向基于 Gravit on 的 Amazon EC2 实例的过渡。这篇博客文章将为您提供有关如何使用 Graviton 的 Porting Advisor 的分步实现。在博客的最后,您将能够在源代码树上运行 Porting Advisor for Graviton,从而生成有助于简化移植应用程序所需工作的调查结果。

适用于 Graviton 的 Porting Advisor 会扫描源代码树中可能不受支持或不可移植的 arm64 代码。该工具仅扫描编程语言 C/C++、Fortran、Go 1.11+、Java 8+、Python 3+ 的源代码文件以及 project/requirements.txt 文件等依赖关系文件。最重要的是,Porting Advisor 不会进行任何代码修改、API 级别的建议或将数据发送回 亚马逊云科技。

你可以将 Porting Advisor for Graviton 作为 Python 脚本使用,也可以编译成二进制文件然后在 x86-64 或 arm64 系统上运行。因此,它可以很容易地作为构建过程的一部分来实现。

预期结果

Graviton 的移植顾问报告了以下问题:

  1. 内联汇编,没有相应的 arm64 内联汇编。
  2. 没有对应的 arm64 汇编源文件的程序集源文件。
  3. autoconf config.guess 脚本中缺少 arm64 架构检测。
  4. 链接到 arm64 架构上不可用的库。
  5. 使用架构特定的内在函数。
  6. 在 arm64 上编译时触发的预处理器错误。
  7. 旧 Visual C++ 运行时的用法(Windows 专用)。

可以检测到由编译器特定的预定义宏保护的编译器特定代码,但默认情况下不报告。已检测到以下交叉编译特定问题,但默认情况下不报告:

  • 架构检测依赖于主机而不是目标。
  • 在构建过程中使用构建工件。

使用该工具所需的技能集

Graviton 的 Porting Advisor 设计易于使用。但是,用户应该精通以下技能,才能利用该工具提供的建议:

  • 对构建系统的了解——项目要求和依赖关系、版本控制等
  • 围绕 Python、Powershell/Bash 的基本脚本语言技能。
  • 了解硬件(C/C++ 的内联汇编)或特定于编译器(C/C++ 的固有结构)结构(如果适用)。
  • 能够按照《 亚马逊云科技 Graviton 技术指南》 中的最佳实践 进行代码优化。

如何使用 Graviton 的 Porting Advisor

先决条件

该工具需要 Python 3.10 和 Java 的最低版本(需要安装 8 个以上的版本)。Java 的安装也是可选的,只有在要扫描 JAR 文件中是否有本地方法调用时才需要安装。你可以在 Windows/Linux/macOS 计算机或 EC2 实例中运行该工具。我们将展示在 EC2 实例上运行的 Windows 和亚马逊 Linux 2 (AL2) 上的案例使用情况。它同时支持 arm64 和 x86-64 处理器。

您无需使用基于 arm64 的处理器即可运行该工具。

The tool doesn't need a lot of CPU Horsepower and even a system with few processors will do

您可以将该工具作为 Python 脚本或可执行文件运行。可执行文件需要额外的步骤才能构建。但是,它可以在另一台计算机上使用,而无需安装 Python 包。

你必须复制完整的 “dist” 文件夹才能正常工作,因为该文件夹中有库和可执行文件。

Graviton 的移植顾问可以作为二进制文件或脚本运行。必须运行脚本才能生成二进制文件

./porting-advisor-linux-x86_64 ~/my/path/to/my/repo --output report.html 
./porting-advisor-linux-x86_64.exe ../test/CppCode/inline_assembly --output report.html

将 Graviton 的移植顾问作为可执行文件运行

第一步是构建可执行文件。

构建可执行文件

第一步是设置 Python 环境。如果您在构建二进制文件时遇到任何错误,请参阅故障排除部分以了解更多详细信息。

在 Windows 上构建二进制文件

Building Porting Advisor using Powershell

Building Porting Advisor binary

在 Linux/Mac 上构建二进制文件

Using shell script to build on Linux or macOS

Porting Advisor binary saved in dist folder

运行二进制文件

在这里,你可以看到如何在 Linux 上以 C++ 项目的二进制文件形式运行该工具。

Porting advisor binary run on a C++ codebase with 350 files

“dist” 文件夹将包含可执行文件。

以脚本形式运行 Graviton 的移植顾问

为以下各项启用 Python 环境:

Linux/Mac:

$. python3 -m venv .venv
$. source .venv/bin/activate

PowerShell:

PS> python -m venv .venv
PS> .\.venv\Scripts\Activate.ps1

以下内容显示了该工具作为脚本运行时将如何在 Windows 上运行:

Running Porting Advisor on Windows as a powershell script

在 Linux 上以脚本形式运行 Graviton 的移植顾问

Setting up Python environment to run the Porting Advisor as a script

Running Porting Advisor on Linux as a script

Graviton 移植顾问的输出

Graviton 的移植顾问要求目录参数指向源代码所在的文件夹。如果有多个位置,则可以将该工具作为脚本的一部分运行。

如果未提供输出文件,则仅生成标准输出。以下是 HTML 格式的工具输出。第一行显示扫描的文件总数。

  1. 如果未发现任何问题,则您将看到如下输出:

Results of Porting Advisor run on C++ code with 2836 files with no issues found

  1. 使用 x86-64 特定的内在函数,例如 _bswap64,你会看到它被标记了。arm64 特定的内在函数不会被标记。因此,如果你的代码有 arm64 特定的内在函数,那么移植顾问只会将 x86-64 标记为 arm64,反之亦然。该工具的主要目标是确定代码的 arm64 就绪程度。

Porting Advisor reporting inline assembly files in C++ code

  1. 扫描器通常只查找源代码文件,但也可以查找带有*.s 扩展名的汇编文件。包含 C++ 代码和内联汇编代码的文件示例如下:

Porting Advisor reporting use of intrinsics in C++ code

  1. 该工具指出了错误,例如预处理器错误和特定架构的固有使用错误。

Porting Advisor results run on C++ code pointing out missing preprocessor macros for arm64 and x86-64 specific intrinsics

下一步行动

如果你没有看到该工具报告的任何问题,那么你的移植状态很好。如果未报告任何问题,则不能保证它可以用作端口。Graviton 的移植顾问是一款最适合用作助手的工具。无论该工具报告了什么问题,我们仍然强烈建议对应用程序进行全面测试。

作为一种良好做法,我们建议您使用最新版本的库。

根据这个问题,你可以考虑采取进一步的行动。对于编译器固有错误,我们建议研究英特尔和 arm64 内在函数。

迁移代码并使用Graviton后,您就可以开始考虑采取措施来优化性能。如果你有兴趣这样做,请查看我们的 入门指南

如果你遇到任何问题,请查看我们的 贡献 文件。

常见问题解答

  1. 这个工具有多快?该工具能够在 1.18 秒内扫描 4048 个文件。

在基于 arm64 的实例上:

Porting Advisor scans 4048 files in 1.18 seconds

  1. 误报

此工具会扫描源树中的所有文件,无论它们是否包含在编译系统中。因此,它可能会误报出现在源代码树中但被编译系统排除的文件中的问题。目前,该工具支持以下语言/依赖关系:C/C++、Fortran、Go 1.11+、Java 8+ 和 Python 3+。

例如:你可能有使用 Python 版本 2.7 的遗留代码,该代码存在于源树中但未被使用。该工具将扫描代码库并指出该特定代码库中的问题,即使您可能没有使用该代码片段。为了缓解这种情况,要么从源代码中删除该文件夹,要么忽略该工具指出的错误。

  1. 我在开源工具中看到有人提到 Ruby 和.NET,但它们不适用于我的工具。

Ruby 和.NET 尚未实现,但请考虑为此做出贡献并提出一个问题请求支持。如果您需要支持,请查看我们的 贡献 文件。

故障排除

在构建工具二进制文件时可能遇到的错误:

PyInstaller 需要共享版本的库。

  1. Python 3.10+ 没有可供pyInstaller工具使用的共享库。

Building Porting Advisor binaries

Pyinstaller failed at building binary and suggesting building Python configure script with --enable-shared on Linux or --enable-framework on macOS

解决这个问题的方法是使用正确的标志来构建 Python 版本(3.10+):

./configure --enable-optimizations --enable-shared

如果这两个标志不能一起使用,请尝试在按顺序启用每个标志的情况下进行构建。

pyinstaller tool needs python configure script with --enable-shared and enable-optimizations flag

  1. Python 版本不正确(版本低于 3.10)。如果你使用的 Python 版本不正确:

你会遇到与这里类似的错误:

Python version on host is 3.7.15 which is less than the recommended version

如果你想在亚马逊 Linux 2 (AL2) 的 EC2 实例中运行该工具,那么你可以尝试升级/安装 Python 3.10,如这里所述。

如果你遇到任何问题,请查看我们的 贡献 文件。

Trying to run Porting Advisor as script will result in Syntax errors on Python version less than 3.10

如果你想在亚马逊 Linux 2 (AL2) 的 EC2 实例中运行该工具,那么你可以尝试升级/安装 Python 3.10,如这里所述。

如果你遇到任何问题,请查看我们的 贡献 文件。

结论

Graviton Porting Advisor 可帮助客户量化移植应用程序所需的工作量。它减少了识别和解析源代码和库依赖关系的迭代过程,从而加快了您过渡到基于 Graviton 的 Amazon EC2 实例的能力。

资源

要了解如何将工作负载迁移到基于 Graviton 的实例,请参阅 亚马逊云科技 Gravit on 技术指南 GitHub 存储库 和 亚马逊云科技 Graviton 过渡指南 要开始使用基于 Graviton 的 Amazon EC2 实例,请参阅 亚马逊云科技 管理控制台 、AW S 命令行接口 (亚马逊云科技 CLI) 和 亚马逊云科技 开发工具 包。

其他一些资源包括:

  • Graviton 的移植顾问:https://github.com/aws/porting-advisor-for-graviton/
  • Graviton 客户感言 https://aws.amazon.com/ec2/graviton/customers/
  • Graviton 支持的 亚马逊云科技 服务 — https://aws.amazon.com/ec2/graviton
  • 内在函数 — Arm 开发人员
  • 如何在亚马逊 Linux 2 上安装 Python 3.10 — TechViewleLo

*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。