亚马逊AWS官方博客
新功能 — 使用 Lambda SnapStart 为您的 Lambda 函数提速
我们的客户告诉我,他们喜欢 AWS Lambda 的原因有很多。在开发方面,他们喜欢简单的编程模型,并且这些功能可以轻松地利用其他 AWS 服务。在运营方面,他们受益于构建功能强大的应用程序的能力,这些应用程序可以快速响应不断变化的使用模式。
如您所知,如果您已经在使用 Lambda,则您的函数是在安全和隔离的执行环境中运行的。每个环境的生命周期包括三个主要阶段:Init
、Invoke
和 Shutdown
。其中,Init
阶段引导函数的运行时,并运行函数的静态代码。在许多情况下,这些操作是在几毫秒内完成的,不会以任何明显的方式延长阶段。在其余情况下,出于多种原因,它们可能需要相当长的时间。首先,初始化某些语言的运行时可能很昂贵。例如,结合使用 Java 运行时和框架(如 Spring Boot、Quarkus 和 Micronaut)的 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;