除了基于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的运行:
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::FunctionProperties:Runtime: nodejs14.xCode: src/Architectures:- arm64Handler: lambda.handlerMemorySize: 512
YAML
启动Amazon SAM应用程序时,您可以指定:
sam init --architecture arm64
Bash
构建Amazon Lambda Layer时,您可以指定CompatibleArchitectures。
MyArmLayer:Type: Amazon::Lambda::LayerVersionProperties: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已经过时&#xff08;<19.3&#xff09;。要安装针对Amazon Graviton发布的二进制软件包&#xff0c;请使用以下命令升级pip&#xff1a;
sudo python3 -m pip install --upgrade pip
Bash
使Arm软件生态系统正在不断改进。作为一般规则&#xff0c;尽可能使用更高版本的编译器和语言运行时。在GitHub上的Amazon Graviton入门存储库包含已知可以提高性能的对常见包的最新更改&#xff0c;包括ffmpeg、PHP、.Net、PyTorch和zlib。
您可以将https://pkgs.org/ 作为包存储库搜索工具。
有时代码包括架构专用的优化。这些优化可以包括使用特定CRC指令在汇编中优化的代码&#xff0c;或者启用在特定架构上运行良好的功能。查看Arm64是否缺少任何优化的一种方法是搜索代码中的__x86_64__ifdef&#xff0c;并查看是否包含相应的Arm64代码。如果没有&#xff0c;请考虑替代的解决方案。
有关特定语言的其他注意事项&#xff0c;请参阅GitHub存储库中的链接。
Amazon Graviton的性能runbook https://github.com/aws/aws-graviton-getting-started/blob/main/perfrunbook/graviton_perfrunbook.md 是Amazon Graviton对应用程序代码进行基准测试、调试和优化的性能评测参考。
-
C/C&#43;&#43;
https://github.com/aws/aws-graviton-getting-started/blob/main/c-c&#43;&#43;.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
将函数包构建为容器镜像
打包为容器镜像的函数必须针对它们将要使用的架构&#xff08;x86 或 Arm64&#xff09;构建。 亚马逊云科技为Amazon Lambda 提供的基础镜像有 Arm64 架构版本。 要为 Arm64 指定容器镜像&#xff0c;请使用 Arm64 特定镜像标签&#xff0c;以Node.js 14为例&#xff1a;
-
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镜像之外&#xff0c;您还可以使用任意Linux基础镜像。支持Arm64的镜像包括Alpine Linux 3.12.7或更高版本、Debian 10和11、Ubuntu 18.04和20.04。有关其他受支持的Linux版本的详细信息&#xff0c;请参阅可用于基于Amazon Graviton实例的操作系统。
迁移函数
下面是一个示例&#xff0c;说明如何将Amazon Lambda函数从x86迁移到Arm64&#xff0c;并利用较新的软件版本来优化价格和性能。您可以采用类似的方法来测试自己的代码。
我有一个现存的Amazon Lambda函数&#xff0c;作为没有配置架构属性的Amazon SAM模板的一部分&#xff0c;默认为x86_64。
Imagex86Function:Type: Amazon::Serverless::FunctionProperties:CodeUri: src/Handler: app.lambda_handlerRuntime: python3.9
YAML
Amazon Lambda函数代码执行一些计算密集型图像处理。该代码使用一个按照以下版本配置的依赖项&#xff1a;
{"dependencies": {"imagechange": "^1.1.1"}
}
JSON
我使用相同的源代码在Amazon SAM模板中复制Amazon Lambda函数&#xff0c;并将Arm64指定为架构。
ImageArm64Function:Type: Amazon::Serverless::FunctionProperties:CodeUri: src/Handler: app.lambda_handlerRuntime: python3.9Architectures:- arm64
YAML
我使用Amazon SAM构建两个Amazon Lambda函数。我指定--use-container标志&#xff0c;在其架构专用的构建容器中构建每个函数
sam build –use-container
Bash
即使在x86系统上&#xff0c;我也可以使用sam本地调用&#xff08;sam local invoke&#xff09;在本地测试Arm64函数。
然后&#xff0c;我使用sam deploy将这些函数部署到Amazon云端。
Amazon Lambda Power Tuning https://github.com/alexcasalboni/aws-lambda-power-tuning 开源项目使用不同的设置运行您的函数&#xff0c;给出最大限度地降低成本和提高性能的建议配置。该工具允许您比较同一图表上的两个结果&#xff0c;并合并基于Arm64的定价。这对于比较同一函数的两个版本&#xff08;一个使用x86&#xff0c;另一个使用Arm64&#xff09;很有用。
我比较了X86和Arm64 Lambda函数的性能&#xff0c;发现Arm64 Lambda函数运行成本便宜12%&#xff1a;
然后&#xff0c;我将包依赖项升级为1.2.1版&#xff0c;该版本已针对Arm64处理器进行了优化。
{"dependencies": {"imagechange": "^1.2.1"}
}
JSON
我使用sam build和sam deploy通过更新的依赖项重新部署更新的Amazon Lambda函数。
我将原始的x86函数与更新的Arm64函数进行了比较。将Arm64与更新的依赖代码版本结合使用&#xff0c;可将性能提高30%&#xff0c;并将成本降低43%。
您可以使用Amazon CloudWatch&#xff0c;使用数据统计功能查看持续时间等性能指标。然后&#xff0c;您可以比较这两种架构的平均持续时间和p99持续时间。由于Amazon Graviton2的架构&#xff0c;函数可能使用更少的内存。这可以让您调整函数内存配置的大小&#xff0c;从而降低成本。
在生产环境中部署Arm64函数
一旦确认Amazon Lambda函数在Arm64上成功执行&#xff0c;就可以迁移工作负载。可以使用带有加权别名的函数版本和别名来控制展示。如果触发任何指定的Amazon CloudWatch警报&#xff0c;流量将逐渐切换到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的一些注意事项。
许多函数可以通过配置更改进行无缝迁移&#xff0c;另外一部分函数需要重新构建才能使用Arm64软件包。我展示了如何迁移函数&#xff0c;以及如何将软件更新到新版本去提高运行在Arm64上的函数性能。您可以使用Amazon Lambda Power Tuning工具测试自己的函数。
立即开始将您的Amazon Lambda 函数 迁移到 Arm/Amazon Graviton2。
欲了解更多无服务器学习资源&#xff0c;请访问https://serverlessland.com/。
本篇作者
Julian Wood
Senior Developer Advocate
Julian Wood 帮助开发人员和构建者了解并热爱无服务器技术如何改变他们构建和运行应用程序的方式&#xff0c;在全球企业和初创企业中担任基础架构架构师和经理超过 25 年&#xff0c;然后在亚马逊全身心投入无服务器领域。
*本篇中文翻译审核&#xff1a;Jian, Tang (Jack) | Solutions Architect | 亚马逊云科技
听说&#xff0c;点完下面4个按钮
就不会碰到bug了&#xff01;