除了基于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 build和sam 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。
Powered by 小羊羔外链网 7.12.9
©2015 - 2023 小羊羔外链网
您的IP:3.235.147.50,2023-06-04 09:27:42,Processed in 0.02027 second(s).