使用 Amazon Lambda SnapStart 为您的 Lambda 函数提速

Amazon Lambda
0
0
{"value":"##### **前言**\n\n\n\n我们的客户曾告诉我们,他们喜欢 Amazon Lambda 的原因有很多。在开发方面,他们喜欢简单的编程模型,且这些功能还可以轻松地利用其他亚马逊云科技的服务。在运营方面,他们受益于其构建功能强大的应用程序的能力,这些应用程序可以快速响应不断变化的使用模式。\n\n\n\n如您所知,如果您已经在使用 Lambda ,那么您的函数是在安全和隔离的执行环境中运行的。每个环境的生命周期包括三个主要阶段: ```Init``` 、 ```Invoke``` 和 ```Shutdown```。其中, ```Init``` 阶段引导函数的运行时,同步运行函数的静态代码。通常,这些操作在几毫秒内完成,不会以任何明显的方式延长阶段。也有情况是由于其他多种原因,它们可能需要相当长的时间。首先,初始化某些语言的运行时可能很昂贵。例如,结合使用 Java 运行时和框架(如 Spring Boot 、Quarkus 和 Micronaut)的 Lambda 函数的 ```Init``` 阶段有时会长达 10 秒钟(这包括依赖注入、函数代码编译和类路径组件扫描)。其次,静态代码可能会下载一些[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)模型,预先计算一些参考数据,或者与其他亚马逊云科技服务建立网络连接。\n\n\n#### **Lambda SnapStart 介绍**\n\n\n\n\n\n为了让您能够以更多方式使用 Lambda ,亚马逊云科技推出了 Lambda SnapStart 。\n\n\n\n在为特定 Lambda 函数启用 Lambda SnapStart 后,发布该函数的新版本将触发优化过程。该过程会启动您的函数并在整个 ```Init``` 阶段运行它。然后,它获取内存和磁盘状态的不可变的加密快照,并缓存以供重用。随后调用该函数时,将根据需要以区块形式从缓存中检索状态,并用于填充执行环境。这种优化使调用时间更快且更具可预测性,因为创建全新的执行环境不再需要专用的 ```Init``` 阶段。\n\n\n\n我们正在发布对使用 Corretto ( ```java11``` ) 运行时 Java 函数的支持,并期望看到 Lambda SnapStart 立即用于使用 Spring Boot、Quarkus 、Micronaut 和其他 Java 框架的应用程序。为 Java 函数启用 Lambda SnapStart 可以使其启动速度提高 10 倍,而无需支付额外费用。\n\n#### **使用 Lambda SnapStart**\n\n\n\n\n\n我们使用了 Amazon Labs 存储库中的 Serverless Spring Boot 2 示例作为起点。在安装了 Amazon SAM CLI 后,进行了测试构建和部署以建立基准。通过调用这个函数,我们发现 **Init 持续时间**略超过 6 秒:\n\n![image.png](https://dev-media.amazoncloud.cn/2d5edd7b70624814b0ab87caf5bf34ab_image.png)\n\n然后我们在 ```template.yml``` 中添加了两行来配置 ```SnapStart``` 属性:\n\n![image.png](https://dev-media.amazoncloud.cn/3de63f2efbff4b9eb38cb361272e8d0c_image.png)\n\n我们重新构建并重新部署,发布了新版本的函数来设置 SnapStart,并进行了另一项测试:\n\n![image.png](https://dev-media.amazoncloud.cn/1caf0b88d6ad4122bbe61c7ff5de02df_image.png)\n\n使用 SnapStart 时,初始化阶段(由我前面展示的 **Init 持续时间**表示)发生在我们发布函数的新版本阶段。当我们调用启用了 SnapStart 的函数时,Lambda 会在调用函数处理程序之前恢复快照(以还原持续时间表示)。因此,SnapStart 的总冷调用时间现在为**还原持续时间 + 持续时间**。SnapStart 已将冷启动持续时间从超过 6 秒缩短到不到 200 毫秒。\n\n#### **成为 Snap-Resilient**\n\n\n- **唯一性**\n使用 SnapStart 时,过去在初始化期间生成的任何唯一内容现在都必须在初始化后生成,以保持唯一性。如果您(或您引用的库)使用伪随机数生成器,则该生成器不应基于在初始阶段获得种子。我们已经更新了 OpenSSL 的 ```RAND_Bytes``` ,以确保在与 SnapStart 结合使用时的随机性,并且我们已经验证了 ```java.security.SecureRandom``` 已经具有 Snap-Resilient。Amazon Linux 的 ```/dev/random``` 和 ```/dev/urandom``` 也是 Snap-Resilient。\n\n- **网络连接**\n如果您的代码在 Init 阶段创建了到网络服务的长期连接,并在 ```Invoke``` 阶段使用,请确保可以在必要时重新建立连接。已更新 Amazon SDK 以实现此目的。\n\n- **临时数据**\n这实际上是上述项目的一种更通用的形式。如果您的代码在 ```Init``` 阶段下载或计算引用信息,请考虑做一个快速检查,以确保它在缓存期间没有过时。\n\n\n\nLambda 提供了一对运行时挂钩来帮助您保持唯一性,还提供了一个扫描工具来帮助检测可能的问题。\n\n\n#### **注意事项**\n\n\n以下是关于 Lambda SnapStart 需要了解的其他一些事项:\n\n\n\n- **缓存**\n缓存的快照在闲置 14 天后将被移除。如果快照依赖于已更新或打过的补丁来运行时, Lambda 将自动刷新缓存。\n\n- **定价**\n使用 Lambda SnapStart 不收取额外费用。\n\n- **功能兼容性**\n您不能将 Lambda SnapStart 与较大的临时存储、Elastic File System、Provisioned Concurrency 或 Graviton2 一起使用。通常,我们建议将 SnapStart 用于您的通用 Lambda 函数,那些对延迟特别敏感的函数子集建议使用 Provisioned Concurrency。\n\n- **Firecracker**\n此功能可利用 Firecracker 快照。\n\n- **区域**\nLambda SnapStart 在美国东部(俄亥俄州、弗吉尼亚北部)、美国西部(俄勒冈州)、亚太地区(新加坡、悉尼、东京)和欧洲(法兰克福、爱尔兰、斯德哥尔摩)区域可用。\n\n**本篇作者**\n\n![640.jpg](https://dev-media.amazoncloud.cn/a60492d43ab64eb4866e1dadb4368014_640.jpg)\n\n**Jeff Barr 首席布道师**\n\n\n亚马逊云科技首席布道师,他在2004年开始在亚马逊云科技更新博客,从那时起一直坚持内容产出。","render":"<h5><a id=\\"_0\\"></a><strong>前言</strong></h5>\\n<p>我们的客户曾告诉我们,他们喜欢 Amazon Lambda 的原因有很多。在开发方面,他们喜欢简单的编程模型,且这些功能还可以轻松地利用其他亚马逊云科技的服务。在运营方面,他们受益于其构建功能强大的应用程序的能力,这些应用程序可以快速响应不断变化的使用模式。</p>\n<p>如您所知,如果您已经在使用 Lambda ,那么您的函数是在安全和隔离的执行环境中运行的。每个环境的生命周期包括三个主要阶段: <code>Init</code> 、 <code>Invoke</code> 和 <code>Shutdown</code>。其中, <code>Init</code> 阶段引导函数的运行时,同步运行函数的静态代码。通常,这些操作在几毫秒内完成,不会以任何明显的方式延长阶段。也有情况是由于其他多种原因,它们可能需要相当长的时间。首先,初始化某些语言的运行时可能很昂贵。例如,结合使用 Java 运行时和框架(如 Spring Boot 、Quarkus 和 Micronaut)的 Lambda 函数的 <code>Init</code> 阶段有时会长达 10 秒钟(这包括依赖注入、函数代码编译和类路径组件扫描)。其次,静态代码可能会下载一些[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)模型,预先计算一些参考数据,或者与其他亚马逊云科技服务建立网络连接。</p>\\n<h4><a id=\\"Lambda_SnapStart__11\\"></a><strong>Lambda SnapStart 介绍</strong></h4>\\n<p>为了让您能够以更多方式使用 Lambda ,亚马逊云科技推出了 Lambda SnapStart 。</p>\n<p>在为特定 Lambda 函数启用 Lambda SnapStart 后,发布该函数的新版本将触发优化过程。该过程会启动您的函数并在整个 <code>Init</code> 阶段运行它。然后,它获取内存和磁盘状态的不可变的加密快照,并缓存以供重用。随后调用该函数时,将根据需要以区块形式从缓存中检索状态,并用于填充执行环境。这种优化使调用时间更快且更具可预测性,因为创建全新的执行环境不再需要专用的 <code>Init</code> 阶段。</p>\\n<p>我们正在发布对使用 Corretto ( <code>java11</code> ) 运行时 Java 函数的支持,并期望看到 Lambda SnapStart 立即用于使用 Spring Boot、Quarkus 、Micronaut 和其他 Java 框架的应用程序。为 Java 函数启用 Lambda SnapStart 可以使其启动速度提高 10 倍,而无需支付额外费用。</p>\\n<h4><a id=\\"_Lambda_SnapStart_27\\"></a><strong>使用 Lambda SnapStart</strong></h4>\\n<p>我们使用了 Amazon Labs 存储库中的 Serverless Spring Boot 2 示例作为起点。在安装了 Amazon SAM CLI 后,进行了测试构建和部署以建立基准。通过调用这个函数,我们发现 <strong>Init 持续时间</strong>略超过 6 秒:</p>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/2d5edd7b70624814b0ab87caf5bf34ab_image.png\\" alt=\\"image.png\\" /></p>\n<p>然后我们在 <code>template.yml</code> 中添加了两行来配置 <code>SnapStart</code> 属性:</p>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/3de63f2efbff4b9eb38cb361272e8d0c_image.png\\" alt=\\"image.png\\" /></p>\n<p>我们重新构建并重新部署,发布了新版本的函数来设置 SnapStart,并进行了另一项测试:</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/1caf0b88d6ad4122bbe61c7ff5de02df_image.png\\" alt=\\"image.png\\" /></p>\n<p>使用 SnapStart 时,初始化阶段(由我前面展示的 <strong>Init 持续时间</strong>表示)发生在我们发布函数的新版本阶段。当我们调用启用了 SnapStart 的函数时,Lambda 会在调用函数处理程序之前恢复快照(以还原持续时间表示)。因此,SnapStart 的总冷调用时间现在为<strong>还原持续时间 + 持续时间</strong>。SnapStart 已将冷启动持续时间从超过 6 秒缩短到不到 200 毫秒。</p>\\n<h4><a id=\\"_SnapResilient_47\\"></a><strong>成为 Snap-Resilient</strong></h4>\\n<ul>\\n<li>\\n<p><strong>唯一性</strong><br />\\n使用 SnapStart 时,过去在初始化期间生成的任何唯一内容现在都必须在初始化后生成,以保持唯一性。如果您(或您引用的库)使用伪随机数生成器,则该生成器不应基于在初始阶段获得种子。我们已经更新了 OpenSSL 的 <code>RAND_Bytes</code> ,以确保在与 SnapStart 结合使用时的随机性,并且我们已经验证了 <code>java.security.SecureRandom</code> 已经具有 Snap-Resilient。Amazon Linux 的 <code>/dev/random</code> 和 <code>/dev/urandom</code> 也是 Snap-Resilient。</p>\\n</li>\n<li>\\n<p><strong>网络连接</strong><br />\\n如果您的代码在 Init 阶段创建了到网络服务的长期连接,并在 <code>Invoke</code> 阶段使用,请确保可以在必要时重新建立连接。已更新 Amazon SDK 以实现此目的。</p>\\n</li>\n<li>\\n<p><strong>临时数据</strong><br />\\n这实际上是上述项目的一种更通用的形式。如果您的代码在 <code>Init</code> 阶段下载或计算引用信息,请考虑做一个快速检查,以确保它在缓存期间没有过时。</p>\\n</li>\n</ul>\\n<p>Lambda 提供了一对运行时挂钩来帮助您保持唯一性,还提供了一个扫描工具来帮助检测可能的问题。</p>\n<h4><a id=\\"_64\\"></a><strong>注意事项</strong></h4>\\n<p>以下是关于 Lambda SnapStart 需要了解的其他一些事项:</p>\n<ul>\\n<li>\\n<p><strong>缓存</strong><br />\\n缓存的快照在闲置 14 天后将被移除。如果快照依赖于已更新或打过的补丁来运行时, Lambda 将自动刷新缓存。</p>\n</li>\\n<li>\\n<p><strong>定价</strong><br />\\n使用 Lambda SnapStart 不收取额外费用。</p>\n</li>\\n<li>\\n<p><strong>功能兼容性</strong><br />\\n您不能将 Lambda SnapStart 与较大的临时存储、Elastic File System、Provisioned Concurrency 或 Graviton2 一起使用。通常,我们建议将 SnapStart 用于您的通用 Lambda 函数,那些对延迟特别敏感的函数子集建议使用 Provisioned Concurrency。</p>\n</li>\\n<li>\\n<p><strong>Firecracker</strong><br />\\n此功能可利用 Firecracker 快照。</p>\n</li>\\n<li>\\n<p><strong>区域</strong><br />\\nLambda SnapStart 在美国东部(俄亥俄州、弗吉尼亚北部)、美国西部(俄勒冈州)、亚太地区(新加坡、悉尼、东京)和欧洲(法兰克福、爱尔兰、斯德哥尔摩)区域可用。</p>\n</li>\\n</ul>\n<p><strong>本篇作者</strong></p>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/a60492d43ab64eb4866e1dadb4368014_640.jpg\\" alt=\\"640.jpg\\" /></p>\n<p><strong>Jeff Barr 首席布道师</strong></p>\\n<p>亚马逊云科技首席布道师,他在2004年开始在亚马逊云科技更新博客,从那时起一直坚持内容产出。</p>\n"}
0
目录
关闭