亚马逊AWS官方博客

新功能 — 使用 Lambda SnapStart 为您的 Lambda 函数提速

我们的客户告诉我,他们喜欢 AWS Lambda 的原因有很多。在开发方面,他们喜欢简单的编程模型,并且这些功能可以轻松地利用其他 AWS 服务。在运营方面,他们受益于构建功能强大的应用程序的能力,这些应用程序可以快速响应不断变化的使用模式。

如您所知,如果您已经在使用 Lambda,则您的函数是在安全和隔离的执行环境中运行的。每个环境的生命周期包括三个主要阶段:InitInvokeShutdown。其中,Init 阶段引导函数的运行时,并运行函数的静态代码。在许多情况下,这些操作是在几毫秒内完成的,不会以任何明显的方式延长阶段。在其余情况下,出于多种原因,它们可能需要相当长的时间。首先,初始化某些语言的运行时可能很昂贵。例如,结合使用 Java 运行时和框架(如 Spring BootQuarkusMicronaut)的 Lambda 函数的 Init 阶段有时会长达 10 秒钟(这包括依赖注入、函数代码编译和类路径组件扫描)。其次,静态代码可能会下载一些机器学习模型,预先计算一些参考数据,或者与其他 AWS 服务建立网络连接。

引入 Lambda SnapStart
为了让您能够以更多方式使用 Lambda,我们今天推出了 Lambda SnapStart。

在为特定 Lambda 函数启用 Lambda SnapStart 后,发布该函数的新版本将触发优化过程。该过程会启动您的函数并运行整个 Init 阶段。然后,它获取内存和磁盘状态的不可变的加密快照,并缓存以供重用。随后调用该函数时,将根据需要以区块形式从缓存中检索状态,并用于填充执行环境。这种优化使调用时间更快且更具可预测性,因为创建全新的执行环境不再需要专用的 Init 阶段。

我们正在发布对利用 Corretto (java11) 运行时的 Java 函数的支持,并期望看到 Lambda SnapStart 立即用于利用 Spring Boot、Quarkus、Micronaut 和其他 Java 框架的应用程序。为 Java 函数启用 Lambda SnapStart 可以使其启动速度提高 10 倍,而无需支付额外费用。

使用 Lambda SnapStart
因为我最后一次真正接触 Java 是在上个世纪,所以我使用了 AWS Labs 存储库中的 Serverless Spring Boot 2 示例作为起点。我安装了 AWS SAM CLI 并进行了测试构建和部署以建立基准。我调用了这个函数,发现 Init 持续时间略超过 6 秒:

然后我在 template.yml 中添加了两行来配置 SnapStart 属性:

我重新构建并重新部署,发布了新版本的函数来设置 SnapStart,并进行了另一项测试:

使用 SnapStart,初始化阶段(由我前面展示的 Init 持续时间表示)发生在我发布函数的新版本时。当我调用启用了 SnapStart 的函数时,Lambda 会在调用函数处理程序之前恢复快照(以还原持续时间表示)。因此,SnapStart 的总冷调用现在为还原持续时间 + 持续时间。SnapStart 已将冷启动持续时间从超过 6 秒缩短到不到 200 毫秒。

成为 Snap-Resilient
Lambda SnapStart 通过重复使用单个已初始化的快照来恢复多个执行环境,从而加快应用程序的速度。这对代码的影响比较有趣:

唯一性 — 使用 SnapStart 时,过去在初始化期间生成的任何唯一内容现在都必须在初始化后生成,以保持唯一性。如果您(或您引用的库)使用伪随机数生成器,则该生成器不应基于在初始阶段获得的种子。我们已经更新了 OpenSSL 的 RAND_Bytes,以确保在与 SnapStart 结合使用时的随机性,并且我们已经验证了 java.security.SecureRandom 已经具有 Snap-Resilient。Amazon Linux 的 /dev/random/dev/urandom 也是 Snap-Resilient。

网络连接——如果您的代码在 Init 阶段创建了到网络服务的长期连接,并在 Invoke 阶段使用,请确保可以在必要时重新建立连接。已更新 AWS SDK 以实现此目的。

临时数据 — 这实际上是上述项目的一种更通用的形式。如果您的代码在 Init 阶段下载或计算引用信息,请考虑做一个快速检查,以确保它在缓存期间没有过时。

Lambda 提供了一对运行时挂钩来帮助您保持唯一性,还提供了一个扫描工具来帮助检测可能的问题。

注意事项
以下是关于 Lambda SnapStart 需要了解的其他一些事情:

缓存 – 缓存的快照在闲置 14 天后将被移除。如果快照依赖于已更新或修补的运行时,Lambda 将自动刷新缓存。

定价 — 使用 Lambda SnapStart 不收取额外费用。

功能兼容性 — 您不能将 Lambda SnapStart 与较大的临时存储、Elastic File System、Provisioned Concurrency 或 Graviton2 一起使用。通常,我们建议将 SnapStart 用于您的通用 Lambda 函数,对那些对延迟特别敏感的函数子集使用 Provisioned Concurrency

Firecracker – 此功能可利用 Firecracker 快照

区域 — Lambda SnapStart 在美国东部(俄亥俄州、弗吉尼亚北部)、美国西部(俄勒冈州)、亚太地区(新加坡、悉尼、东京)和欧洲(法兰克福、爱尔兰、斯德哥尔摩)区域可用。

Jeff