收藏文章 楼主

将 Amazon Lambda 函数迁移到基于 Arm的 Amazon Graviton 2处理器

版块:软件应用   类型:普通   作者:小羊羔links   查看:649   回复:0   获赞:0   时间:2022-02-10 23:05:31

除了基于x86的函数之外,Amazon Lambda现在还允许您配置新的和现有的函数在基于Arm的Amazon Graviton 2处理器上运行。使用此处理器架构选项,您可以获得高达34%的性价比提升。这篇博客重点介绍从x86迁移到Arm64时的一些注意事项,因为迁移过程依赖于代码和工作负载。

使用Arm架构的函数得益于Amazon Graviton 2处理器内置的性能和安全性,该处理器旨在为计算密集型工作负载提供高达19%的性能提升。对使用多线程和多重处理,或者执行许多I/O操作的工作负载,可以减少调用时间,从而降低成本。

与当前的x86定价相比,以毫秒粒度计费的持续时间费用降低了20%。这也适用于使用预置并发时的持续时间费用。Compute Saving Plans支持由Amazon Graviton2提供支持的Amazon Lambda函数。

架构变更不会影响调用函数的方式,也不会影响函数反馈响应的方式。新架构与API、服务、应用程序或工具集成不受影响,而且将一如既往地工作。

Arm支持以下使用Amazon Linux 2的运行:

  •   Node.js 12 和14

  •   Python 3.8 和3.9

  •   Java 8 (java8.al2) 和11

  •   .NET Core 3.1

  •   Ruby 2.7

  •   自定义运行时(provided.al2)

https://aws.amazon.com/lambda/edge/不支持将Arm作为架构选项。

您可以使用亚马逊云科技管理控制台、亚马逊云科技命令行界面(Amazon CLI)、Amazon Cloud Formation、亚马逊云科技Serverless Application Model(Amazon SAM)和亚马逊云科技云开发工具包(Amazon CDK)创建和管理Amazon Graviton 2处理器提供支持的Amazon Lambda函数。还可以通过众多Amazon Lambda合作伙伴获得支持。

了解Amazon Graviton 2处理器

Amazon Graviton处理器由亚马逊云科技定制。通常,您不需要了解Amazon Graviton处理器的具体架构,除非您的应用程序可以从特定功能中受益。

Amazon Graviton 2处理器使用Neoverse-N1内核,支持Arm V8.2(包括CRC和加密扩展)以及其他一些架构扩展。特别是,Amazon Graviton 2支持大型系统扩展(LSE),可以提高大型系统的锁定和同步性能。


将x86 Lambda函数迁移到Arm64

许多Amazon Lambda函数可能只需要进行配置变更即可利用到Amazon Graviton2的性价比。另外一部分函数可能需要使用Arm专用的依赖项重新打包Amazon Lambda函数,或者重新构建函数二进制文件或容器镜像。

在开发机器上创建基于Arm的函数可能不需要Arm处理器。您可以使用Amazon SAM和Docker Desktop在x86机器上构建、测试、打包、编译和部署Arm Lambda函数。如果您有一个基于Arm的系统,比如Apple M1 Mac,您可以在本地编译二进制文件。


无架构专用依赖项或二进制文件的函数

如果您的函数不使用架构专用的依赖项或二进制文件,则可以通过一次配置变更从一种架构切换到另一种架构。许多使用解释性语言的函数,例如Node.js和Python,或者编译成Java字节码的函数,可以在不做任何更改的情况下切换。确保你检查了二进制文件的依赖项、Amazon Lambda Layer和Amazon Lambda扩展。 

要将函数从x86切换到Arm64,可以使用Amazon Lambda控制台在函数运行时设置中更改架构。


编辑运行时设置


编辑Amazon Lambda函数架构

如果要在Amazon Lambda函数中显示或记录处理器架构,可以使用操作系统专用的调用。例如:Node.js process.arch 或 Python platform.machine().


使用Amazon CLI创建Amazon Lambda函数时,请指定--architectures选项。如果未指定架构,则默认值为x86-64。例如,要创建arm64函数,请指定--architectures arm64

Amazon lambda create-function \

    --function-name MyArmFunction \

    --runtime nodejs14.x \

    --architectures arm64 \

    --memory-size 512 \

    --zip-file fileb://MyArmFunction.zip \

    --handler lambda.handler \

    --role arn:Amazon:iam::123456789012:role/service-role/MyArmFunction-role

*左滑查看更多


Bash

使用Amazon SAM或AmazonCloudFormation时,在函数配置中添加或修改Architectures属性。

MyArmFunction:

  Type: Amazon::Lambda::Function

  Properties:

    Runtime: nodejs14.x

    Code: src/

    Architectures:

      - arm64

    Handler: lambda.handler

    MemorySize: 512


YAML

启动Amazon SAM应用程序时,您可以指定:

sam init --architecture arm64


Bash

构建Amazon Lambda Layer时,您可以指定CompatibleArchitectures

MyArmLayer:

  Type: Amazon::Lambda::LayerVersion

  Properties:

    ContentUri: layersrc/

    CompatibleArchitectures:

      - arm64


YAML

构建Amazon Graviton2的函数代码

如果函数包中有依赖项或二进制文件,则必须为要使用的架构重新构建函数代码。许多包和依赖项都有与Arm64等效的版本。对照Arm64软件包测试您自己的工作负载,看看您的工作负载是否适合迁移。由于处理器架构功能不同,并非所有工作负载的性能都有所提高。 

对于Rust和Go等编译语言,您可以使用支持Arm的provided.al2custom runtime https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html 。您提供一个与Amazon Lambda Runtime API 通信的二进制文件。 


在编译Go时,请设置架构为arm。 

GOOS=linux GOARCH=arm64 go build

在编译Rust时,请设置目标。

cargo bulid --release -- target-cpu=neoverse-n1

在某些Linux发行版上默认安装的Python pip已经过时(<19.3)。要安装针对Amazon Graviton发布的二进制软件包,请使用以下命令升级pip:  

sudo python3 -m pip install --upgrade pip


Bash

使Arm软件生态系统正在不断改进。作为一般规则,尽可能使用更高版本的编译器和语言运行时。在GitHub上的Amazon Graviton入门存储库包含已知可以提高性能的对常见包的最新更改,包括ffmpeg、PHP、.Net、PyTorch和zlib。

您可以将https://pkgs.org/ 作为包存储库搜索工具。

有时代码包括架构专用的优化。这些优化可以包括使用特定CRC指令在汇编中优化的代码,或者启用在特定架构上运行良好的功能。查看Arm64是否缺少任何优化的一种方法是搜索代码中的__x86_64__ifdef,并查看是否包含相应的Arm64代码。如果没有,请考虑替代的解决方案。 


有关特定语言的其他注意事项,请参阅GitHub存储库中的链接。 


Amazon Graviton的性能runbook https://github.com/aws/aws-graviton-getting-started/blob/main/perfrunbook/graviton_perfrunbook.md 是Amazon Graviton对应用程序代码进行基准测试、调试和优化的性能评测参考。

  • C/C++

    https://github.com/aws/aws-graviton-getting-started/blob/main/c-c++.md

  • Go

    https://github.com/aws/aws-graviton-getting-started/blob/main/golang.md

  • JAVA

    https://github.com/aws/aws-graviton-getting-started/blob/main/java.md

  • .Net

    https://github.com/aws/aws-graviton-getting-started/blob/main/dotnet.md

  • Python

    https://github.com/aws/aws-graviton-getting-started/blob/main/python.md

  • Rust

  • https://github.com/aws/aws-graviton-getting-started/blob/main/rust.md

将函数包构建为容器镜像

打包为容器镜像的函数必须针对它们将要使用的架构(x86 或 Arm64)构建。 亚马逊云科技为Amazon Lambda 提供的基础镜像有 Arm64 架构版本。 要为 Arm64 指定容器镜像,请使用 Arm64 特定镜像标签,以Node.js 14为例:

  • public.ecr.Amazon/lambda/nodejs:14-arm64

  • public.ecr.Amazon/lambda/nodejs:latest-arm64

  • public.ecr.Amazon/lambda/nodejs:14.2021.10.01.16-arm64

Docker Hub也提供Arm64镜像。

除了亚马逊云科技提供的Amazon Linux 2镜像之外,您还可以使用任意Linux基础镜像。支持Arm64的镜像包括Alpine Linux 3.12.7或更高版本、Debian 10和11、Ubuntu 18.04和20.04。有关其他受支持的Linux版本的详细信息,请参阅可用于基于Amazon Graviton实例的操作系统。 


迁移函数

下面是一个示例,说明如何将Amazon Lambda函数从x86迁移到Arm64,并利用较新的软件版本来优化价格和性能。您可以采用类似的方法来测试自己的代码。

我有一个现存的Amazon Lambda函数,作为没有配置架构属性的Amazon SAM模板的一部分,默认为x86_64

 Imagex86Function:

    Type: Amazon::Serverless::Function

    Properties:

      CodeUri: src/

      Handler: app.lambda_handler

      Runtime: python3.9


YAML

Amazon Lambda函数代码执行一些计算密集型图像处理。该代码使用一个按照以下版本配置的依赖项: 

{

  "dependencies": {

    "imagechange""^1.1.1"

  }

}


JSON

我使用相同的源代码在Amazon SAM模板中复制Amazon Lambda函数,并将Arm64指定为架构。

  ImageArm64Function:

    Type: Amazon::Serverless::Function

    Properties:

      CodeUri: src/

      Handler: app.lambda_handler

      Runtime: python3.9

      Architectures:

        - arm64


YAML

我使用Amazon SAM构建两个Amazon Lambda函数。我指定--use-container标志,在其架构专用的构建容器中构建每个函数

sam build –use-container


Bash

即使在x86系统上,我也可以使用sam本地调用(sam local invoke)在本地测试Arm64函数。

然后,我使用sam deploy将这些函数部署到Amazon云端。 

Amazon Lambda Power Tuning https://github.com/alexcasalboni/aws-lambda-power-tuning 开源项目使用不同的设置运行您的函数,给出最大限度地降低成本和提高性能的建议配置。该工具允许您比较同一图表上的两个结果,并合并基于Arm64的定价。这对于比较同一函数的两个版本(一个使用x86,另一个使用Arm64)很有用。


我比较了X86和Arm64 Lambda函数的性能,发现Arm64 Lambda函数运行成本便宜12%:

然后,我将包依赖项升级为1.2.1版,该版本已针对Arm64处理器进行了优化。

{

  "dependencies": {

    "imagechange""^1.2.1"

  }

}


JSON

我使用sam buildsam deploy通过更新的依赖项重新部署更新的Amazon Lambda函数。

我将原始的x86函数与更新的Arm64函数进行了比较。将Arm64与更新的依赖代码版本结合使用,可将性能提高30%,并将成本降低43%。

您可以使用Amazon CloudWatch,使用数据统计功能查看持续时间等性能指标。然后,您可以比较这两种架构的平均持续时间和p99持续时间。由于Amazon Graviton2的架构,函数可能使用更少的内存。这可以让您调整函数内存配置的大小,从而降低成本。


在生产环境中部署Arm64函数

一旦确认Amazon Lambda函数在Arm64上成功执行,就可以迁移工作负载。可以使用带有加权别名的函数版本和别名来控制展示。如果触发任何指定的Amazon CloudWatch警报,流量将逐渐切换到Arm64版本或自动回滚。

Amazon SAM支持通过一种名为Amazon Lambda安全部署的功能使用Amazon CodeDeploy进行渐进式Amazon Lambda部署。您可以使用许多CI/CD系统编译Arm64的二进制文件包。Amazon CodeBuild支持本机构建基于Arm的应用程序。CircleCI还具有用于部署的Arm计算资源类。GitHub Action允许您使用自托管运行器。您还可以使用GitHub Action内的Amazon SAM和其他CI/CD管道来创建Arm64构件。

结论

使用Arm/Amazon Graviton2架构的Amazon Lambda函数可提供高达34%的性价比提升。本博客讨论了帮助您将函数迁移到Arm64的一些注意事项。

许多函数可以通过配置更改进行无缝迁移,另外一部分函数需要重新构建才能使用Arm64软件包。我展示了如何迁移函数,以及如何将软件更新到新版本去提高运行在Arm64上的函数性能。您可以使用Amazon Lambda Power Tuning工具测试自己的函数。

立即开始将您的Amazon Lambda 函数 迁移到 Arm/Amazon Graviton2

小羊羔锚文本外链网站长https://seo-links.cn 
回复列表
默认   热门   正序   倒序

回复:将 Amazon Lambda 函数迁移到基于 Arm的 Amazon Graviton 2处理器

Powered by 小羊羔外链网 8.3.11

©2015 - 2024 小羊羔外链网

免费发软文外链 鄂ICP备16014738号-6

您的IP:18.216.123.120,2024-04-19 11:50:04,Processed in 0.05547 second(s).

支持原创软件,抵制盗版,共创美好明天!
头像

用户名:

粉丝数:

签名:

资料 关注 好友 消息