亚马逊AWS官方博客
使用 Lambda power tuning 寻找函数运行最佳性价比
Lambda 性能概述
AWS Lambda 是一项 AWS 云计算服务,它让您无需预置或管理服务器即可运行代码。您只需按消耗的计算时间付费 – 代码未运行时不产生费用。借助 AWS Lambda,您几乎可以为任何类型的应用程序或后端服务运行代码,而且全部都无需管理。只需上传您的代码,AWS Lambda 就会处理运行和扩展高可用性代码所需的一切工作。
在运行 Lambda 函数的时候,您需要指定分配给函数的内存,范围从 128MB 到 10,240MB。Lambda 控制台默认将新函数的内存设置为最小值,许多开发人员也选择将函数的内存设置为 128MB。
然而,128MB 通常仅应用于最简单的 Lambda 函数,例如将事件转换并路由到其他 AWS 服务的函数。如果函数需要导入库或 Lambda 层,或需要与 Amazon S3 或 Amazon EFS 加载的数据交互,增加内存分配可能会提高性能。
内存是决定 Lambda 运行性能的关键因素,它决定了给函数分配的 vCPU 的数量。增加内存可以成比例地增加 CPU 数量,从而增加可用的总计算能力。如果一个函数受限于 CPU、网络或内存,那么改变内存设置可以显著提高其计算性能。对于面向客户的 API(例如使用 API Gateway 与 Lambda 集成作为应用前端的场景),提高 Lambda 的性能会对提高系统响应速度有着非常重要的作用。
由于 Lambda 服务根据函数消耗的千兆字节秒(gigabyte-seconds)总量收费,如果总执行时间保持不变,增加内存会对总成本产生影响。千兆字节秒是总内存(以千兆字节为单位)和执行时间(以毫秒为单位)的乘积。然而,在许多情况下,增加可用内存会导致执行时间缩短。因此,总成本的增加可能微不足道,甚至可能减少。
例如,对于计算质数的函数,1000 次调用可能在不同的内存水平下具有以下平均执行时间:
Memory | Duration | Cost |
128 MB | 11.722 s | $0.024628 |
512 MB | 6.678 s | $0.028035 |
1024 MB | 3.194 s | $0.026830 |
1536 MB | 1.465 s | $0.024638 |
在上述情况中,使用 128MB 的内存时,函数的平均执行时间为 11.722 秒,成本为每 1,000 次调用 $0.024628。当内存增加到 1536MB 时,平均持续时间减少到 1.465 秒,因此成本为 $0.024638。尽管成本差异只有千分之一美分,但函数的性能提升了 10 倍。
选择分配给 Lambda 函数的内存是一个权衡速度(执行时间)和成本的优化过程。用户可以通过手动分配不同的内存来进行测试来选择最优解,但是这势必会浪费时间和精力。AWS Lambda Power Tuning 工具可以帮助您自动化完成这个过程。
工具介绍
AWS Lambda Power Tuning 使用 Amazon Step Functions 同时运行不同内存分配下的 Lambda 函数的多个版本,并测量性能。您可以提供 Lambda 函数的 ARN 作为输入,状态机将使用多个内存配置(从 128MB 到 10GB,可自行按需指定)来调用该函数。然后,它将分析所有执行日志并为您建议最佳的功率配置,以最小化成本和/或最大化性能。
输入的函数跑在您的 AWS 帐户中,执行实时 HTTP 调用和 SDK 交互,以测量在实际生产场景中的性能。您还可以将这一过程加入到您的 CI/CD 流程中,以使用该工具自动测量您部署的新函数的性能。
您可以在 AWS 管理控制台上轻松查看状态机每一步的状态:
运行结果
状态机最终将会生成每种内存配置的平均成本和速度的可视化图表。
例如,以下是两个 CPU 密集型函数的结果示例,它们通过提供更多的内存使得函数执行时间更短,成本更低:
如何解读上面的图表:执行时间从 128MB 时的 35 秒缩短到 1.5GB 时的不到 3 秒,同时运行成本降低了 14%。
如何解读上面的图表:执行时间从 128MB 时的 2.4 秒减少到 1GB 时的 300 毫秒,而平均成本保持不变。
部署方式
本篇 blog 旨在提供在 AWS 中国区(北京区及宁夏区)部署 AWS Lambda Power Tuning tool 的便捷方式:使用 AWS Serverless Application Repository(SAR) 在亚马逊云科技控制台上一键部署。
点击上面连接,登录您的 AWS 账号之后会进入 SAR 页面
在页面右下方填写应用的基本信息,保持默认设置可以满足绝大多数用户的基本要求,可以实现“一键部署”。
如需对部署有更多的设置,请参考部署参数说明:
- PowerValues(list of numbers):如果执行时没有提供 powerValues 输入参数,这些将被用作默认值。
- visualizationURL(string):可视化工具的基本 URL,默认为 “lambda-power-tuning.show”,但您也可以使用自定义工具。
- totalExecutionTimeout(number in seconds, default=300):应用于状态机的所有函数的超时时间(以秒为单位)。
- lambdaResource(string, default=*):IAM 策略中使用的资源, 默认情况下为 *,但您可以将其限制为前缀或特定函数的 ARN。
- permissionsBoundary(string):适用于状态机的所有函数的权限边界(策略)的 ARN。
- payloadS3Bucket(string):用于大型有效载荷(> 256KB)的 S3 存储桶名称。如果提供,将添加到自定义托管的 IAM 策略中,以授予 S3 存储桶的只读权限。更多细节请参见下文的 S3 有效载荷部分。
- payloadS3Key(string, default=*):用于大型有效载荷(> 256KB)的 S3 对象键。默认值将授予对 payloadS3Bucket 中指定的所有 S3 对象的访问权限。更多细节请参见下文的 S3 有效载荷部分。
- layerSdkName(string):SDK 层的名称,如果需要自定义的话(可选)。
- logGroupRetentionInDays(number, default=7):在 Lambda 日志组中保留日志事件的天数。如果没有定义这个参数,日志事件将永久保留。
- securityGroupIds(list of SecurityGroup IDs):用于每个 Lambda 函数的 VPC 配置的安全组列表(可选)。请注意,您的 VPC 应配置为允许公共互联网访问(通过 NAT 网关)或包括 VPC 端点到 Lambda 服务。
- subnetIds(list of Subnet IDs):用于每个 Lambda 函数的 VPC 配置的子网列表(可选)。请注意,您的 VPC 应配置为允许公共互联网访问(通过 NAT 网关)或包括 VPC 端点到 Lambda 服务。
此处我们保持默认参数,勾选同意创建 IAM roles,然后选择部署。
使用方法
部署成功以后,可以在管理控制台的状态机界面找到以“powerTuningStateMachine-”开头的状态机:
找到它并单击 “Start execution”。
接下来,您需要提供执行参数(请参阅下面的 input-output 参数说明):
单击 “Start Execution”执行。
input-output 参数说明:
- lambdaARN(required, string):您想要优化的 Lambda 函数的 ARN
- powerValues(optional,string or list of integers):要测试的内存值列表;如果未提供,将使用部署时配置的默认值(默认为:128MB、256MB、512MB、1024MB、1536MB 和 3008MB);您可以提供任何介于 128MB 和 10,240MB 之间的内存值。
- num(required, integer):每个内存配置的调用次数(最少 5 次,建议在 10 到 100 次之间)
- payload(string,object,or list):将用于每次调用的静态有效载荷(对象或字符串);当使用列表时,预计会使用带权有效载荷,格式如下:[{“payload”: {…}, “weight”: X}, {“payload”: {…}, “weight”: Y}, {“payload”: {…}, “weight”: Z}],其中权重 X、Y 和 Z 被视为相对权重(而不是百分比权重);更多详细信息请参见下文的带权有效载荷部分。
- parallelInvocation(false by default):如果设置为 true,所有调用将并行执行(注意:根据 num 的值,当将 parallelInvocation 设置为 true 时,可能会被 throttle)。
- strategy(string):可以选择 “cost”、”speed” 或 “balanced”(默认值为 “cost”);如果选择 “cost”,状态机将建议最便宜的选项(无视其性能),而如果选择 “speed”,状态机将建议最快的选项(无视其成本)。当选择 “balanced” 时,状态机将根据参数 “balancedWeight” 在 “cost” 和 “speed” 之间选择一个折中的选项。
详细 input-output 参数说明请参考:https://github.com/alexcasalboni/aws-lambda-power-tuning/blob/master/README-INPUT-OUTPUT.md。
执行完成后,您可以在 “Execution Details” 部分的 “Output” 选项卡中找到执行结果。输出将包含最佳内存配置及其相应的每次执行的平均成本。
结果说明:
- results.power:建议最佳内存配置
- results.cost:单次调用成本
- results.duration:单次调用执行时间
- results.stateMachine.executionCost:与该状态机执行相关的 AWS Step Functions 成本(”最差” 情况下的固定值)
- results.stateMachine.lambdaCost:与该状态机执行相关的 AWS Lambda 成本(根据 num 和平均执行时间而定)
- results.stateMachine.visualization:如果您访问此自动生成的 URL,您将能够可视化和检查关于成本和性能的平均统计信息;重要提示:平均统计信息不与服务器共享,因为所有数据都编码在 URL 的哈希部分中(示例),只在客户端可用。
点击“可视化”链接,即可得到 Lambda Power Tuning results:
小结
Lambda 函数的运行需要合适的内存配置来支持,基于 Lambda 价格的计算机制,有时候性能的增长并不一定带来成本的增加。因此,使用合适的工具来寻找函数运行的最佳配置就变成尤为重要。
Power tuning tool 就是可以帮助客户最大化 Lambda 运行性价比的最优选。本篇博客为中国区 AWS 用户提供了一键式部署的快捷方式及使用指南,方便客户快速找到适合自身工作负载的最佳配置,乘上现代化应用改造的快车。
参考文档
https://thinkwithwp.com/cn/blogs/compute/operating-lambda-performance-optimization-part-2/
https://docs.thinkwithwp.com/lambda/latest/operatorguide/profile-functions.html
https://github.com/alexcasalboni/aws-lambda-power-tuning