扩展 Lambda 托管实例
Lambda 托管实例不会在调用到达时进行扩展,并且不支持冷启动。相反,它通过资源消耗信号进行异步扩展。托管实例目前根据 CPU 资源利用率和多并发饱和状态进行扩展。
主要区别:
-
Lambda(默认):当没有可用的执行环境来处理传入的调用时(冷启动)进行扩展
-
Lambda 托管实例:根据 CPU 资源利用率和执行环境的多并发饱和状态进行异步扩展
如果您的流量在 5 分钟内增长超过一倍,您可能会在 Lambda 纵向扩展实例和执行环境以满足需求时看到节流出现。
扩缩生命周期
Lambda 托管实例使用分布式架构来管理扩缩:
组件:
-
托管实例:在您的账户中,于您提供的子网内运行
-
路由器和扩缩器:用于路由调用和管理扩缩的共享 Lambda 组件
-
Lambda 代理:在每个托管实例上运行,以管理执行环境生命周期并监控资源消耗情况
工作原理:
-
当您使用容量提供程序发布函数版本时,Lambda 会在您的账户中启动托管实例。默认情况下,它会启动三个实例以实现可用区的容错功能,并在将您的函数版本标记为 ACTIVE 之前启动三个执行环境。
-
每个托管实例都可以为映射到同一个容量提供程序的多个函数运行执行环境。
-
随着流量进入您的应用程序,执行环境会消耗资源。Lambda 代理会向扩缩器发送通知,后者则会决定是否要扩展新的执行环境或托管实例。
-
如果路由器尝试向资源消耗较高的执行环境发送调用,则该实例上的 Lambda 代理会通知它在另一个执行环境上重试。
-
随着流量的减少,Lambda 代理会通知扩缩器,后者会做出决定,即纵向缩减执行环境并横向缩减托管实例。
调整扩缩行为
您可以通过五个控件自定义 Managed Instances 的扩缩行为:
函数级别控件
1. 函数内存和 vCPU
为您的函数选择内存大小和 vCPU 分配量。支持的最小函数大小为 2GB 和 1 个 vCPU。
注意事项:
-
选择能够支持您的函数的多并发执行的内存和 vCPU 设置。
-
您不能为函数配置少于 1 个 vCPU,因为托管实例上运行的函数应能够支持多并发工作负载。
-
您不能选择低于 2GB,因为这符合 c 实例 2:1 的内存与 vCPU 比(这种比例是所有比例中最低的)
-
对于 Python 应用程序,由于 Python 处理多并发的方式,您可能需要选择较高的内存与 vCPU 比(例如 4:1 或 8:1)
-
如果您正在运行 CPU 密集型操作或执行的 IO 很少,则应选择多个 vCPU
2. 最大并发数
为每个执行环境设置最大并发数
默认行为:Lambda 选择合理的默认设置,这些设置能平衡资源消耗与吞吐量,同时适用于各种各样的应用程序。
调整指南:
-
提高并发数:如果您的函数调用所占用的 CPU 极少,可提高最大并发数(最高至每个 vCPU 64 个)
-
降低并发数:如果您的应用程序占用大量内存但 CPU 使用率很低,您可以降低最大并发数
重要提示:由于 Lambda 托管实例适用于多并发应用程序,因此并发度极低的执行环境在进行扩缩时可能会遇到节流的情况。
3. 每个函数的执行环境
设置函数执行环境的最小和最大数量。
默认行为:Lambda 默认至少保持 3 个执行环境,以确保跨可用区的高可用性。
调整指南:
-
设置最小值:为基准流量预置容量,并在突然爆发时减少限制。
-
设置最大值:限制执行环境的数量,进而控制横向扩展,并防止在多个函数共享容量提供程序时出现噪音邻居问题。
-
停用函数:将最小值和最大值都设置为 0,即可在不删除函数的情况下停用该函数。
示例:
aws lambda put-function-scaling-config \ --function-name my-lmi-function \ --qualifier '$LATEST.PUBLISHED' \ --function-scaling-config MinExecutionEnvironments=5,MaxExecutionEnvironments=20 \ --region us-east-1
重要提示:
-
限定词范围:这些配置适用于每个合格的 ARN 的函数级别。在
$LATEST.PUBLISHED上设置时,配置将传播到未来的$LATEST.PUBLISHED版本。在特定版本上设置时,新发布的版本将恢复为默认值。 -
配对配置:必须同时设置最小值和最大值。任何未指定的设置都将恢复为其默认值。
MinExecutionEnvironments和MaxExecutionEnvironments的有效值范围为 0 到 15000。
容量提供程序级别控件
4. 目标资源利用率
选择您自己的 CPU 利用率消耗目标。
默认行为:Lambda 会保留足够的余量,让您的流量在 5 分钟翻倍也不会受到节流。
优化选项:
-
如果您的工作负载非常稳定或者您的应用程序对节流不敏感,您可以将目标设定得较高,以实现更高的利用率和更低的成本。
-
如果您希望为突发流量留出足够的空间,可以将资源目标设定为较低水平,这样就需要更大的容量
5. 实例类型选择
设置允许或排除的实例类型。
默认行为:Lambda 会为您的工作负载选择最佳实例类型。建议让 Lambda Managed Instances 选择实例类型,因为限制可能的实例类型数量可能会导致可用性降低。
自定义配置:
-
特定的硬件要求:将允许的实例类型设置为兼容的实例列表。例如,如果您的应用程序需要较高的网络带宽,您可以选择多种 n 系列实例类型。
-
成本优化:对于测试或开发环境,您可以选择较小的实例类型,例如 m7a.large 实例类型
计划扩展
使用 Amazon EventBridge 调度器按周期性或一次性计划调整函数的最小和最大执行环境数量。这对于可预测的流量模式非常有用,例如在峰值时段之前扩展,在非峰值时段缩减。
调度器配置:
-
创建 EventBridge 调度器执行角色或使用现有角色,该角色授予目标函数调用
lambda:PutFunctionScalingConfig的权限。 -
使用 cron 或 rate 表达式创建计划,将
PutFunctionScalingConfigAPI 定位为通用目标。在输入有效载荷中指定新的MinExecutionEnvironments和MaxExecutionEnvironments值。
示例 1:扩展以处理计划中的峰值流量
创建两个计划,以便在峰值时段之前扩展,然后缩减。每个计划都以 PutFunctionScalingConfig API 为目标,具有更新的 MinExecutionEnvironments 和 MaxExecutionEnvironments 值。
在世界标准时间上午 8:00 扩展(min=100,max=1000):
aws scheduler create-schedule \ --name "ScaleUpLambdaManagedInstances" \ --schedule-expression "cron(0 8 * * ? *)" \ --flexible-time-window '{"Mode": "OFF"}' \ --target '{ "Arn": "arn:aws:scheduler:::aws-sdk:lambda:PutFunctionScalingConfig", "RoleArn": "arn:aws:iam::<account-id>:role/eventbridge-scheduler-role", "Input": "{\"FunctionName\": \"my-lmi-function\", \"Qualifier\": \"$LATEST.PUBLISHED\", \"FunctionScalingConfig\": {\"MinExecutionEnvironments\": 100, \"MaxExecutionEnvironments\": 1000}}" }'
在世界标准时间下午 6:00 缩减(min=5,max=20):
aws scheduler create-schedule \ --name "ScaleDownLambdaManagedInstances" \ --schedule-expression "cron(0 18 * * ? *)" \ --flexible-time-window '{"Mode": "OFF"}' \ --target '{ "Arn": "arn:aws:scheduler:::aws-sdk:lambda:PutFunctionScalingConfig", "RoleArn": "arn:aws:iam::<account-id>:role/eventbridge-scheduler-role", "Input": "{\"FunctionName\": \"my-lmi-function\", \"Qualifier\": \"$LATEST.PUBLISHED\", \"FunctionScalingConfig\": {\"MinExecutionEnvironments\": 5, \"MaxExecutionEnvironments\": 20}}" }'
示例 2:在非峰值时段停用并重新激活
将 MinExecutionEnvironments 和 MaxExecutionEnvironments 都设置为 0 会停用函数版本而不将其删除。停用的函数不会根据流量自动扩展。您必须通过其他计划操作设置非零值来明确将其重新激活。
在世界标准时间晚上 10:00 停用(min=0,max=0):
aws scheduler create-schedule \ --name "DeactivateLambdaManagedInstances" \ --schedule-expression "cron(0 22 * * ? *)" \ --flexible-time-window '{"Mode": "OFF"}' \ --target '{ "Arn": "arn:aws:scheduler:::aws-sdk:lambda:PutFunctionScalingConfig", "RoleArn": "arn:aws:iam::<account-id>:role/eventbridge-scheduler-role", "Input": "{\"FunctionName\": \"my-lmi-function\", \"Qualifier\": \"$LATEST.PUBLISHED\", \"FunctionScalingConfig\": {\"MinExecutionEnvironments\": 0, \"MaxExecutionEnvironments\": 0}}" }'
在世界标准时间上午 7:00 重新激活(min=10,max=20):
aws scheduler create-schedule \ --name "ReactivateLambdaManagedInstances" \ --schedule-expression "cron(0 7 * * ? *)" \ --flexible-time-window '{"Mode": "OFF"}' \ --target '{ "Arn": "arn:aws:scheduler:::aws-sdk:lambda:PutFunctionScalingConfig", "RoleArn": "arn:aws:iam::<account-id>:role/eventbridge-scheduler-role", "Input": "{\"FunctionName\": \"my-lmi-function\", \"Qualifier\": \"$LATEST.PUBLISHED\", \"FunctionScalingConfig\": {\"MinExecutionEnvironments\": 10, \"MaxExecutionEnvironments\": 20}}" }'
调整指南:
-
对于具有可预测峰值的工作负载,请创建多个计划以匹配您的流量模式:一个用于在峰值时段之前扩展您的函数,另一个用于在峰值时段之后缩减。每个计划都遵循相同的模式,具有更新的
MinExecutionEnvironments和MaxExecutionEnvironments值。 -
计划扩缩会调整执行环境的预置下限和上限,但最小值和最大值之间的实际扩缩仍然会响应 CPU 利用率和并发饱和度。
-
如果您的流量在计划扩展后的 5 分钟内增长超过一倍,您可能会在预置容量时遇到节流。
-
缩减到零以停用函数时,请记住,重新激活需要使用非零值进行显式
PutFunctionScalingConfig调用。
后续步骤
-
查看特定于运行时的指南,了解如何处理多并发
-
监控扩缩指标以优化扩缩行为