管理 Lambda 函数的并发
并发性是您的函数在任何给定时间所服务于的请求的数目。在调用函数时,Lambda 会分配它的一个实例以处理事件。当函数代码完成运行时,它会处理另一个请求。如果当仍在处理请求时再次调用函数,则分配另一个实例,从而增加该函数的并发。并发受区域性配额的约束,该配额由区域中的所有函数共享。
有两种类型的并发可用:
-
预留并发 – 预留并发创建一个只能由其函数使用的请求池,并且还防止其函数使用非预留并发。
-
预配置并发 – 预配置并发可初始化请求数量的执行环境,使其准备好响应函数的调用。
本主题详细介绍了如何管理和配置预留和预配置并发。要了解并发与扩展的交互方式,请参阅 AWS Lambda 函数扩展。
为了确保函数始终可以达到一定的并发级别,可以配置具有预留并发的函数。当一个函数有预留并发时,任何其他函数都不可以使用该并发。预留并发还限制了函数的最大并发数,并且适用于整个函数,包括版本和别名。
当 Lambda 分配函数的实例时,运行时会加载函数的代码并运行您在处理程序之外定义的初始化代码。如果您的代码和依赖项很大,或者您在初始化过程中创建 SDK 客户端,则此过程可能需要一些时间。随着函数纵向扩展,这会导致新实例提供的请求部分比其余部分具有更长的延迟。
要使函数能够在延迟不发生波动的情况下进行扩展,请使用预配置并发。通过在调用增加之前分配预配置并发,您可以确保所有请求都由延迟非常低的初始化实例来提供。您可以在函数的版本或别名上配置预配置并发。
Lambda 也与 Application Auto Scaling 集成。您可以将 Application Auto Scaling 配置为根据计划或基于利用率管理预配置并发。使用计划扩展在预期流量高峰将至时增加预配置并发。要根据需要自动增加预配置的并发数,请使用 Application Auto Scaling API 注册目标并创建扩展策略。
预置并发计入函数的预留并发和区域配额。如果函数版本和别名上的预配置并发数加起来达到函数的预留并发,则所有调用都在预配置并发上运行。此配置还具有限制函数 ($LATEST
) 未发布版本的效果,从而阻止其执行。
为函数分配的预配置并发数不能超过预留并发数。
配置预留并发
要管理函数的预留并发设置,请使用 Lambda 控制台。
要为函数预留并发性
-
打开 Lambda 控制台的“函数”页面
。 -
选择函数。
-
选择 Configuration(配置),然后选择 Concurrency(并发)。
-
在并发下,选择编辑。
-
选择预留并发。输入要为该函数预留的并发数量。
-
选择 Save。
您最多可以预留所显示的 Unreserved account concurrency (未预留账户并发) 值;对于没有预留并发的函数,可预留的并发数量为该值减去 100。要限制函数,请将预留并发设置为零。这将停止处理任何事件,直到您删除限制。
以下示例显示了两个具有预留并发池的函数,以及其他函数使用的非预留并发池。当池中的所有并发都已使用时,会出现限制错误。

图例
-
函数并发
-
预留并发
-
非预留并发
-
限制
预留并发具有以下效果。
-
其他函数无法阻止您的函数扩展 – 在没有预留并发的同一区域中,您所有账户的函数共享未预留并发的池。如果没有预留并发,其他函数可能会耗尽所有可用的并发,从而导致您的函数无法根据需要进行扩展。
-
您的函数不能无节制地扩展 – 预留并发还限制您的函数使用非预留池中的并发数量,从而限制了它的最大并发数量。您可以预留并发以防止您的函数使用该区域中的所有可用并发,或者防止下游资源过载。
设置每函数并发会影响可用于其他函数的并发池。为避免出现问题,请限制可以使用 PutFunctionConcurrency
和 DeleteFunctionConcurrency
API 操作的用户数量。
配置预配置并发
要管理版本或别名的预配置并发设置,请使用 Lambda 控制台。
要为别名预配置并发
-
打开 Lambda 控制台的“函数”页面
。 -
选择函数。
-
选择 Configuration(配置),然后选择 Concurrency(并发)。
-
在 Provisioned concurrency configurations(预配置并发配置)下,选择 Add configuration(添加配置)。
-
选择别名或版本。
-
输入要分配的预配置并发数量。
-
选择 Save。
您可以从函数配置页面管理所有别名和版本的预配置并发。预配置并发配置的列表显示每个配置的分配进度。预配置并发设置也可以在每个版本和别名的配置页面上使用。
在以下示例中,使用预留和预配置的并发配置了 my-function-DEV
和 my-function-PROD
函数。对于 my-function-DEV
,预留并发的整个池也是预配置的并发。在这种情况下,所有调用都在预配置并发上运行,或者受限制。对于 my-function-PROD
,预留并发池的一部分是标准并发。当所有预配置的并发都在使用中时,函数在标准并发上扩展以满足任何其他请求。

图例
-
函数并发
-
预留并发
-
预配置并发
-
非预留并发
-
限制
预配置并发不会在您配置它后立即联机。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
。
对于预配置并发实例,您函数的初始化代码在分配期间每隔几个小时运行一次,因为正在运行的函数实例会被回收。在实例处理请求后,您可以在日志和跟踪中查看初始化时间。但是,即使实例从不处理请求,也会对初始化进行计费。预配置并发连续运行,并且与初始化和调用成本分开计费。有关详细信息,请参阅 AWS Lambda 定价
函数的每个版本只能有一个预配置并发配置。此配置可以直接在版本本身上,也可以在指向版本的别名上。两个别名无法为同一版本分配预配置并发。此外,您无法在指向未发布版本 ($LATEST
) 的别名上分配预配置并发。
当您更改别名指向的版本时,预配置并发将从旧版本中解除分配,然后分配给新版本。您可以向拥有预配置并发的别名添加路由配置。但是,在路由配置到位时,您无法管理别名上的预配置并发设置。
Lambda 发出以下预配置并发指标:
预配置并发指标
-
ProvisionedConcurrentExecutions
-
ProvisionedConcurrencyInvocations
-
ProvisionedConcurrencySpilloverInvocations
-
ProvisionedConcurrencyUtilization
有关详细信息,请参阅使用 AWS Lambda 函数指标。
使用 Lambda API 配置并发
要使用 AWS CLI 或 AWS 开发工具包管理并发设置和自动扩展,请使用以下 API 操作。
-
(Application Auto Scaling) RegisterScalableTarget
-
(Application Auto Scaling) PutScalingPolicy
要使用 AWS CLI 配置预留并发,请使用 put-function-concurrency
命令。以下命令为名为 my-function
的函数预留 100 的并发:
$
aws lambda put-function-concurrency --function-name my-function --reserved-concurrent-executions 100
{ "ReservedConcurrentExecutions": 100 }
要为函数分配预配置并发,请使用 put-provisioned-concurrency-config
。以下命令为名为 my-function
的函数的 BLUE
别名分配 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" }
要配置 Application Auto Scaling 来管理预配置的并发,请使用 Application Auto Scaling 配置目标跟踪扩展。首先,将函数的别名注册为扩展目标。以下示例注册名为 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
接下来,将扩展策略应用于目标。以下示例配置 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 将定期小幅减少预配置并发。

图例
-
函数实例
-
打开请求
-
预配置并发
-
标准并发
要查看您的账户在某个区域中的并发配额,请使用 get-account-settings
。
$
aws lambda get-account-settings
{ "AccountLimit": { "TotalCodeSize": 80530636800, "CodeSizeUnzipped": 262144000, "CodeSizeZipped": 52428800,"ConcurrentExecutions": 1000, "UnreservedConcurrentExecutions": 900
}, "AccountUsage": { "TotalCodeSize": 174913095, "FunctionCount": 52 } }