配置预配置并发 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

配置预配置并发

在 Lambda 中,并发是指您的函数可以同时处理的请求数。有两种类型的并发控件可用:

  • 预留并发 – 预留并发保证了函数的最大并发实例数。当一个函数有预留并发时,任何其他函数都不可以使用该并发。为函数配置预留并发不收取任何费用。

  • 预配置并发 – 预配置并发可初始化请求数量的执行环境,使其准备好立即响应函数的调用。请注意,配置预置并发会对您的 Amazon 账户产生费用。

本主题详细介绍了如何管理和配置预置并发。如果要配置预留并发,请参阅管理 Lambda 预留并发

Lambda 分配函数的实例时,运行时会加载函数的代码并运行您在处理程序之外定义的初始化代码。如果您的代码和依赖项很大,或者您在初始化过程中创建 SDK 客户端,则此过程可能需要一些时间。当您的函数有一段时间未使用、需要扩展或更新函数时,Lambda 会创建新的执行环境。这会导致新实例提供的请求部分比其余部分具有更长的延迟,这称为冷启动。

通过在调用增加之前分配预置并发,您可以确保所有请求都由延迟较低的初始化实例来提供。配置有预置并发的 Lambda 函数以一致的启动延迟运行,使其成为构建交互式移动或 Web 后端、延迟敏感微服务和同步调用 API 的理想选择。

注意

预置并发计入函数的预留并发和区域配额。如果函数版本和别名上的预配置并发数加起来达到函数的预留并发,则所有调用都在预配置并发上运行。此配置还具有限制函数($LATEST)未发布版本的效果,从而阻止其执行。为函数分配的预配置并发数不能超过预留并发数。

Lambda 还与 Application Auto Scaling 集成,使您可以根据计划或基于利用率管理预置并发。

Lambda SnapStart 与预置并发之间的区别

Lambda SnapStart 是一种性能优化,可帮助您将延迟敏感型应用程序的启动性能提高多达 10 倍,没有任何额外成本。预置并发可使函数保持初始化状态,并做好准备在几十毫秒内做出响应。配置预置并发会让您的 Amazon Web Services 账户 产生费用。如果您的应用程序有严格的冷启动延迟要求,请使用预置并发。您不能对同一个函数版本同时使用 SnapStart 和预置并发。

配置预配置并发

要管理版本或别名的预配置并发设置,请使用 Lambda 控制台。您可以在函数的版本或别名上配置预配置并发。

函数的每个版本只能有一个预配置并发配置。此配置可以直接在版本本身上,也可以在指向版本的别名上。两个别名无法为同一版本分配预配置并发。

如果更改别名指向的版本,Lambda 从旧版本中解除预置分配,然后分配给新版本。您可以向拥有预配置并发的别名添加路由配置。有关更多信息,请参阅 Lambda 函数别名。请注意,在路由配置到位时,您无法管理别名上的预配置并发设置。

注意

未发布版本的函数 ($LATEST) 不支持预置并发。在配置预置并发之前,请确保您的客户端应用程序未指向 $LATEST。

为别名或版本分配预置并发
  1. 打开 Lamba 控制台的 Functions(函数)页面。

  2. 选择函数。

  3. 选择 Configuration(配置),然后选择 Concurrency(并发)。

  4. Provisioned concurrency configurations(预配置并发配置)下,选择 Add configuration(添加配置)

  5. 选择别名或版本。

  6. 输入要分配的预配置并发数量。

  7. 选择 Save(保存)。

您还可以通过以下操作,使用 Lambda API 配置预置并发:

要为函数分配预配置并发,请使用 put-provisioned-concurrency-config。以下命令为名为 BLUE 的函数的 my-function 别名分配 100 的并发:

aws lambda put-provisioned-concurrency-config --function-name my-function \ --qualifier BLUE --provisioned-concurrent-executions 100

您应看到以下输出:

{ "Requested ProvisionedConcurrentExecutions": 100, "Allocated ProvisionedConcurrentExecutions": 0, "Status": "IN_PROGRESS", "LastModified": "2019-11-21T19:32:12+0000" }

要查看您的账户在某个区域中的并发配额,请使用 get-account-settings

aws lambda get-account-settings

您应看到以下输出:

{ "AccountLimit": { "TotalCodeSize": 80530636800, "CodeSizeUnzipped": 262144000, "CodeSizeZipped": 52428800, "ConcurrentExecutions": 1000, "UnreservedConcurrentExecutions": 900 }, "AccountUsage": { "TotalCodeSize": 174913095, "FunctionCount": 52 } }

您可以从函数配置页面管理所有别名和版本的预配置并发。预配置并发配置的列表显示每个配置的分配进度。预配置并发设置也可以在每个版本和别名的配置页面上使用。

Lambda 发出以下预配置并发指标:

预配置并发指标
  • ProvisionedConcurrentExecutions – 根据预置并发性处理事件的函数实例的数目。对于具有预置并发性的别名或版本的每次调用,Lambda 都会发出当前计数。

  • ProvisionedConcurrencyInvocations – 根据预置的并发性执行函数代码的次数。

  • ProvisionedConcurrencySpilloverInvocations – 在使用所有预置的并发性时基于标准并发性执行函数代码的次数。

  • ProvisionedConcurrencyUtilization – 对于版本或别名,为将 ProvisionedConcurrentExecutions 值除以分配的预置并发总数。例如,.5 指明有 50% 的已分配预置并发正在使用中。

有关更多信息,请参阅 使用 Lambda 函数指标

使用预置并发优化延迟

配置后,预配置并发并不会立即生效。Lambda 会在一两分钟的准备时间后开始分配预配置并发。与函数在负载下扩展的方式类似,最多可以同时初始化 3000 个函数实例,具体取决于区域。初始突增后,实例将按每分钟 500 个的稳定速率分配,直到请求完成。当您为同一区域中的多个函数或一个函数的多个版本请求预置并发时,扩展配额适用于所有请求。


                  使用预配置并发进行扩展。
图例
  • 函数实例

  • 打开请求

  • 预配置并发

  • 标准并发

要优化延迟,您可以为使用预配置并发的函数自定义初始化行为。您可以运行预配置并发实例的初始化代码而不会影响延迟,因为初始化代码在分配时运行。但是,按需型实例的初始化代码会直接影响第一次调用的延迟。对于按需实例,您可以选择将特定功能的初始化推迟到函数需要该功能的时候。

要确定初始化的类型,请检查 AWS_LAMBDA_INITIALIZATION_TYPE 的值。Lambda 会将此环境变量设置为 provisioned-concurrency 或者 on-demand。AWS_LAMBDA_INITIALIZATION_TYPE 的值是不可变的,并且在执行环境的生命周期内不会变化。

如果使用 .NET 3.1 运行时,您可以配置 AWS_LAMBDA_DOTNET_PREJIT 环境变量改善使用预配置并发的函数的延迟。.NET 运行时会延时编译和初始化代码首次调用的每个库。因此,首次调用 Lambda 函数的时间可能比后续调用的时间更长。将 AWS_LAMBDA_DOTNET_PREJIT 设置为 ProvisionedConcurrency 时,Lambda 会为常见系统依赖项执行提前 JIT 编译。Lambda 仅对预配置并发实例执行此项初始化优化,从而提高首次调用的性能。如果将环境变量设置为 Always,则 Lambda 会为每次初始化执行提前 JIT 编译。如果将环境变量设置为 Never,则会禁用提前 JIT 编译。AWS_LAMBDA_DOTNET_PREJIT 的默认值为 ProvisionedConcurrency

对于预配置并发实例,您函数的初始化代码在分配期间每隔几个小时运行一次,因为正在运行的函数实例会被回收。在实例处理请求后,您可以在日志和跟踪中查看初始化时间。但是,即使实例从不处理请求,也会对初始化进行计费。预配置并发连续运行,并且与初始化和调用成本分开计费。有关详细信息,请参阅 Amazon Lambda 定价

有关使用预置并发优化函数的更多信息,请参阅 Lambda 操作指南

使用 Application Auto Scaling 管理预置并发

Application Auto Scaling 可让您根据计划或基于利用率管理预置并发。如果希望函数保持指定的利用率,请使用目标跟踪扩展策略,并使用计划扩展在预期流量高峰将至时增加预置并发。

目标跟踪

使用目标跟踪,Application Auto Scaling 创建和管理触发扩展策略的 CloudWatch 警报,并根据定义的指标和目标值计算扩展调整。这非常适合没有计划的流量增加时间,但具有某些流量模式的应用程序。

要根据需要自动增加预置并发数,请使用 RegisterScalableTargetPutScalingPolicy Application Auto Scaling API 操作来注册目标并创建扩展策略。

  1. 将函数的别名注册为扩展目标。以下示例注册名为 my-function 的函数的 BLUE 别名:

    aws application-autoscaling register-scalable-target --service-namespace lambda \ --resource-id function:my-function:BLUE --min-capacity 1 --max-capacity 100 \ --scalable-dimension lambda:function:ProvisionedConcurrency
  2. 将扩展策略应用于目标。以下示例配置 Application Auto Scaling,调节别名的预置并发配置,以使利用率保持接近 70%。

    aws application-autoscaling put-scaling-policy --service-namespace lambda \ --scalable-dimension lambda:function:ProvisionedConcurrency --resource-id function:my-function:BLUE \ --policy-name my-policy --policy-type TargetTrackingScaling \ --target-tracking-scaling-policy-configuration '{ "TargetValue": 0.7, "PredefinedMetricSpecification": { "PredefinedMetricType": "LambdaProvisionedConcurrencyUtilization" }}'

    您应看到以下输出:

    { "PolicyARN": "arn:aws:autoscaling:us-east-2:123456789012:scalingPolicy:12266dbb-1524-xmpl-a64e-9a0a34b996fa:resource/lambda/function:my-function:BLUE:policyName/my-policy", "Alarms": [ { "AlarmName": "TargetTracking-function:my-function:BLUE-AlarmHigh-aed0e274-xmpl-40fe-8cba-2e78f000c0a7", "AlarmARN": "arn:aws:cloudwatch:us-east-2:123456789012:alarm:TargetTracking-function:my-function:BLUE-AlarmHigh-aed0e274-xmpl-40fe-8cba-2e78f000c0a7" }, { "AlarmName": "TargetTracking-function:my-function:BLUE-AlarmLow-7e1a928e-xmpl-4d2b-8c01-782321bc6f66", "AlarmARN": "arn:aws:cloudwatch:us-east-2:123456789012:alarm:TargetTracking-function:my-function:BLUE-AlarmLow-7e1a928e-xmpl-4d2b-8c01-782321bc6f66" } ] }

Application Auto Scaling 会在 CloudWatch 中创建两个警报。当预配置的并发利用率持续超过 70% 时,第一个警报会触发。发生这种情况时,Application Auto Scaling 会分配更多的预配置并发以降低利用率。当利用率持续低于 63%(70% 目标的 90%)时,第二个警报会触发。发生这种情况时,Application Auto Scaling 会减少别名的预配置并发。

在以下示例中,函数会根据利用率在最小和最大预置并发量之间进行扩缩。打开的请求数量增加时,Application Auto Scaling 会大幅度增加预置并发量,直到达到配置的最大值。该函数继续按标准并发扩缩,直到利用率开始下降。利用率始终较低时,Application Auto Scaling 会以较小的周期性步骤减少预置并发性。


                    使用 Application Auto Scaling 目标跟踪自动伸缩预置并发。
图例
  • 函数实例

  • 打开请求

  • 预配置并发

  • 标准并发

这两个警报默认都使用 average 统计数据。具有快速突发流量模式的函数可能无法触发您的预置并发进行扩展。例如,如果 Lambda 函数快速执行 (20-100 ms),并且流量模式出现快速突发,则可能会导致传入请求在突发期间超出您分配的预置并发率,但是如果突发不持续 3 分钟,则不会触发自动扩展。此外,如果 CloudWatch 没有获得三个达到目标平均水平的数据点,则自动扩展策略将不会触发。

有关目标跟踪扩展策略的更多信息,请参阅适用于 Application Auto Scaling 的目标跟踪扩展策略

计划的扩展

根据计划扩缩使您可以按照可预测的负载变化来设置您自己的扩缩计划。有关更多信息以及示例,请参阅计划 Amazon Lambda 预置并发以实现重复使用峰值