亚马逊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 一件部署连接

点击上面连接,登录您的 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”执行。

{
    "lambdaARN": "your-lambda-function-arn",
    "powerValues": [128, 256, 512, 1024, 2048, 3008],
    "num": 10,
    "payload": "{}",
    "parallelInvocation": true,
    "strategy": "cost"
}

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://aws.amazon.com/cn/blogs/compute/operating-lambda-performance-optimization-part-2/

https://docs.aws.amazon.com/lambda/latest/operatorguide/profile-functions.html

https://github.com/alexcasalboni/aws-lambda-power-tuning

本篇作者

肖冰

亚马逊云科技解决方案架构师,负责基于 AWS 的云计算方案的咨询与架构设计。在应用现代化改造,Serverless,云迁移,大数据等方向具有丰富的实践经验。在加入 AWS 之前,曾就职于 EMC、微软,西云数据、腾讯等科技公司,拥有丰富的公有云领域的架构优化和技术支持经验。

Alex Casalboni

Alex is deeply passionate about web technologies and music. He has been building web products and helping other builders learn from his experience since 2011. His coding love spreads across the Python and the JavaScript communities, and he’s been contributing to open-source projects such as AWS Lambda Power Tuning. As a Developer Advocate, Alex often speaks at technical conferences across the world, supports developer communities and helps them build applications in the cloud. He is particularly interested in serverless architectures, machine learning, and data analytics. In his free time, Alex loves snowboarding, jogging, traveling, and playing his saxophone.

李琳

AWS 解决方案架构师,负责面向跨国企业客户的云计算方案架构咨询和设计,客户涵盖医疗、零售、制造等行业。熟悉云原生网络技术及混合云网络架构。

付小飞

AWS 资深解决方案架构师,负责基于 AWS 的云计算方案的咨询与架构设计。专注于游戏行业,帮助客户利用 AWS 全球基础设施与强大的技术能力打造爆款游戏,降低游戏运行成本。