如何解决 Lambda 函数冷启动问题?

1 分钟阅读
0

我的 AWS Lambda 函数遇到了高延迟冷启动持续时间。

解决方法

环境和代码的 Lambda 函数请求的初始设置被称为冷启动时间或启动延迟。要最大限度地减少 Lambda 函数的冷启动时间和延迟,请按照以下您的用例相关的说明进行操作。

Lambda 函数代码和配置最佳实践

  • 增加分配给 Lambda 函数的内存。冷启动范围取决于函数的大小、您分配的内存量以及代码的复杂性。添加更多内存会按比例增加 CPU 的数量,从而提高可用的总体计算能力。有关详细信息,请参阅内存和计算能力
  • 请尽量减少部署包的大小。部署包越小,函数的启动速度越快。请尽量减少函数导入的依赖项和外部库的数量,并将部署包的大小保持在 50 MB 以下。有关详细信息,请参阅 Lambda 部署包
  • 优化 Lambda 函数代码以最大限度地减少初始化所需的时间。减少您的函数导入的依赖项和外部库的数量。减少初始化期间运行的代码量。
  • 避免在启动时进行复杂计算。如果您的函数在启动时需要复杂计算,例如加载大型数据集,则可以在后台执行此操作。在 Init 阶段在后台线程中运行计算。然后,请缓存结果以供后续调用。缓存结果有助于减少启动时进行复杂计算所需的时间。
  • 重用 Amazon Relational Database Service (Amazon RDS) 数据库连接。如果您的函数连接到 Amazon RDS 数据库,则可以为函数创建 Amazon RDS 代理数据库代理。数据库代理管理数据库连接池。重用 Amazon RDS 数据库连接可缩短每次调用函数时建立连接的时间。
  • 配置预置并发。使用预置并发的函数不显示冷启动行为,因为执行环境是在调用之前准备好的。您可以指定函数实例的数量以保持热度和管理流量。
  • 最大程度降低依赖项的复杂性。请使用在执行环境启动时快速加载的简单框架。
  • 为了缩短 Lambda 解压缩用 Java 编写的部署包所花费的时间,请将您的依赖项 .jar 文件放在单独的 /lib 目录中。分离 .jar 文件比将所有函数的代码放在包含大量 .class 文件的单个 jar 中要快。有关详细信息,请参阅使用.zip 或 JAR 文件存档部署 Java Lambda 函数
  • 使用监控来发现问题,并进行观察发现原因。监控函数的冷启动性能,并使用 Amazon CloudWatch 中的 Lambda Insights 来解决性能问题。

有关详细信息,请参阅使用 Lambda 函数的最佳实践

预置并发中的长 INIT 持续时间

在按需 Lambda 函数中,静态初始化器在收到请求之后但在调用处理程序之前运行。这会导致请求者延迟,并延长整体冷启动持续时间。

  • 请确定您的函数并发是否超过配置的预置并发级别。您可以使用 ProvisionedConcurrencySpilloverInvocations CloudWatch 指标查看调用函数的次数。非零值表示所有预置并发都在使用中,并且某些调用是在冷启动时发生的。
  • 请检查您的调用频率(每秒请求数)。具有预置并发的函数的最大速率为每个预置并发每秒 10 个请求(Lambda API 请求)。例如,配置了 100 个预置并发的函数每秒可以处理 1000 个请求。如果调用速率超过每秒 1000 个请求,则可能会出现一些冷启动。有关详细信息,请参阅 Lambda: 预置并发导致的冷启动

有关详细信息,请参阅如何解决 Lambda 函数预置并发问题?

与 Lambda 集成的 Amazon API Gateway 请求

如果您将 Lambda 与 API Gateway 一起使用,并且发现 IntegrationLatency 指标很高,请查看您的 Lambda 函数的 CloudWatch Logs。当与 Lambda 函数集成的 API 端点向客户端发送响应所花的时间过长时,必须解决高延迟问题。Lambda 函数的冷启动不会记录在函数的持续时间指标中,因此 API 的集成延迟可能长于函数的持续时间。要查看冷启动时函数的持续时间,请使用 AWS X-Ray

有关详细信息,请参阅如何解决与 Lambda 集成的 API Gateway 请求中的高延迟问题?

相关信息

如何减少 Java Lambda 函数的初始化和调用持续时间延迟?

使用 Lambda SnapStart for Java 11 Runtime 提高启动性能

操作 Lambda: 性能优化 – 第 1 部分

AWS 官方
AWS 官方已更新 2 年前