

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用暖池减少启动时间较长的应用程序的延迟
<a name="ec2-auto-scaling-warm-pools"></a>

暖池使您能够减少引导时间非常长的应用程序的延迟，例如，因为实例需要将大量数据写入磁盘。使用暖池，您不再需要过度配置 Auto Scaling 组来管理延迟以提高应用程序性能。有关更多信息，请参阅以下博客文章 [利用 EC2 Auto Scaling 暖池更快地扩展您的应用程序](https://www.amazonaws.cn/blogs/compute/scaling-your-applications-faster-with-ec2-auto-scaling-warm-pools/)。

**重要**  
在不需要的情况下创建暖池可能会导致不必要的成本。如果您的首次启动时间不会给您的应用程序带来明显的延迟问题，则您可能不需要使用暖池。

**Topics**
+ [核心概念](#warm-pool-core-concepts)
+ [先决条件](#warm-pool-prerequisites)
+ [更新暖池中的实例](#update-warm-pool)
+ [相关资源](#warm-pools-related-resources)
+ [限制](#warm-pools-limitations)
+ [使用生命周期钩子](warm-pool-instance-lifecycle.md)
+ [为自动扩缩组创建一个暖池](create-warm-pool.md)
+ [查看运行状况检查状态](warm-pools-health-checks-monitor-view-status.md)
+ [Amazon CLI 使用温水池的示例](examples-warm-pools-aws-cli.md)

## 核心概念
<a name="warm-pool-core-concepts"></a>

在您开始之前，请熟悉以下核心概念：

**暖池**  
暖池是预初始化的 EC2 实例的池，它位于 Auto Scaling 组旁边。无论何时您的应用程序需要向外扩展，自动扩缩组都可以在暖池上绘制，以满足其新的所需容量。它可帮助您确保实例准备好快速开启为应用程序提供流量，从而加快对横向扩展事件的响应。当实例离开暖池时，它们将计入该组的所需容量。这称为*热启动*。  
当实例处于预热池中时，仅当处于 `InService` 状态的实例的指标值大于扩缩策略的告警阈值上限（与目标跟踪扩缩策略的目标利用率相同）时，扩缩策略才会横向扩展。

**暖池大小**  
默认情况下，暖池的大小以 Auto Scaling 组的最大容量与其所需容量之差来计算。例如，如果 Auto Scaling 组的所需容量为 6 且最大容量为 10，则当您首次设置暖池并且该池正在初始化时，暖池的大小将为 4。  
要单独指定暖池的最大容量，请使用自定义规格（`MaxGroupPreparedCapacity`）选项，并为暖池设置一个大于该组当前容量的自定义值。如果您提供自定义值，则暖池的大小将计算为自定义值与组当前所需容量之间的差值。例如，如果自动扩缩组的所需容量为 6，最大容量为 20 且自定义值为 8，则当您首次设置暖池并且该池初始化时，暖池的大小将为 2。  
仅当使用大自动扩缩组时，才可能需要使用自定义规格（`MaxGroupPreparedCapacity`）选项来管理拥有暖池的成本效益。例如，与在暖池中持续预留 500 个实例以备未来使用的方案相比，拥有 1,000 个实例的自动扩缩组、最大容量为 1,500（用于为紧急流量峰值提供额外容量）和拥有 100 个实例的暖池方案可能有利于更好地实现目标。

**最小暖池大小**  
考虑使用最小大小设置来静态设置（`MinSize`）要在暖池中保留的最少实例数。默认情况下，没有设置最小大小。`MinSize` 设置适用于指定 `MaxGroupPreparedCapacity` 以确保暖池中保持最少实例数的情况，即使自动扩缩组的所需容量高于 `MaxGroupPreparedCapacity`。

**暖池实例状态**  
您可以将暖池中的实例保持在以下三种状态之一：`Stopped`、`Running` 或 `Hibernated`。将实例保持在 `Stopped` 状态是一个有效的方法，以最大限度地降低成本。对于已停止的实例，您只需为您使用的卷和已附加到实例的弹性 IP 地址付费。  
或者，您也可以将实例保持在 `Hibernated` 状态，以停止实例而不删除其内存内容 (RAM)。当某个实例处于休眠状态时，这表示操作系统会将 RAM 的内容保存到 Amazon EBS 根卷中。当再次开启此实例时，会将此根卷还原到其之前的状态，还将重新加载 RAM 内容。当实例处于休眠状态时，您只需为 EBS 卷（包括 RAM 内容的存储空间，以及已附加到实例的弹性 IP 地址）付费。  
此外还可以将暖池中的实例保持在 `Running` 状态，但我们强烈建议不要这样操作，以避免产生不必要的费用。当实例停止或休眠时，您可以节省实例本身的成本。您仅在实例正在运行时为它们付费。

**生命周期钩子**  
您使用[生命周期挂钩](warm-pool-instance-lifecycle.md)来将实例置于等待状态，以便您可以对实例执行自定义操作。自定义操作将在实例启动时或其终止之前执行。  
在暖池配置中，生命周期挂钩可以延迟实例停止或休眠以及延迟在横向扩展事件期间投入使用，直到它们完成初始化。如果您在没有生命周期钩子的情况下向 Auto Scaling 组添加暖池，则需要很长时间才能完成初始化的实例可能会停止或休眠，然后在准备就绪之前在横向扩展事件期间投入使用。

**实例再使用策略**  
默认情况下，Amazon EC2 Auto Scaling 会在您的 Auto Scaling 组横向缩减时终止您的实例。然后，它会将新实例启动到暖池中，以替换已终止的实例。  
而如果您希望将实例返回到暖池，则可以指定实例再使用策略。这使您可以再使用这些已配置为给应用程序提供流量的实例。为了确保您的暖池不会过度预置，当暖池中的实例大小根据其设置超出必要时，Amazon EC2 Auto Scaling 可以终止这些实例，以减小其大小。当终止暖池中的实例时，它会使用[默认终止策略](ec2-auto-scaling-termination-policies.md#default-termination-policy)来选择首先终止哪些实例。  
如果您希望在横向缩减时休眠实例，并且 Auto Scaling 组中有现有实例，则它们必须满足实例休眠的要求。如果不这样做，当实例返回到暖池时，它们将回退到停止状态，而不是休眠状态。
目前，您只能通过使用 Amazon CLI 或 SDK 来指定实例再使用策略。此功能在控制台中不可用。

## 先决条件
<a name="warm-pool-prerequisites"></a>

在为自动扩缩组创建暖池之前，请决定如何使用生命周期挂钩将新实例初始化为适当的初始状态。

要在实例因生命周期挂钩而处于等待状态时对其执行自定义操作，您有两种选择：
+ 对于您希望在启动时对实例运行命令的简单场景，可以在为 Auto Scaling 组创建启动模板或启动配置时包含用户数据脚本。用户数据脚本只是在您的实例开启时由 cloud-init 运行的普通 Shell 脚本或 cloud-init 指令。该脚本还可通过使用实例（该脚本运行所在的实例）的 ID 来控制您的实例何时转换到下一个状态。如果您尚未这样做，请更新脚本，从实例元数据中检索实例的实例 ID。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[访问实例元数据](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html)。
**提示**  
要在实例重新开启时运行用户数据脚本，用户数据必须采用 MIME 多段格式，并在用户数据的 `#cloud-config` 部分中指定以下内容：  

  ```
  #cloud-config
  cloud_final_modules:
   - [scripts-user, always]
  ```
+ 对于需要服务的高级场景，例如 Amazon Lambda 在实例进入或离开温池时执行某项操作，您可以为 Auto Scaling 组创建生命周期挂钩，并将目标服务配置为根据生命周期通知执行自定义操作。有关更多信息，请参阅 [支持的通知目标](warm-pool-instance-lifecycle.md#warm-pools-supported-notification-targets)。

**使实例为休眠做好准备**  
要使自动扩缩实例为使用 `Hibernated` 池状态做好准备，请按照《Amazon EC2 用户指南》**中的[休眠先决条件](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/hibernating-prerequisites.html)主题中所述，创建正确设置的新启动模板或启动配置，以支持实例休眠。然后，将新启动模板或启动配置与 Auto Scaling 组关联起来，并开启实例刷新，以替换与之前的启动模板或启动配置关联的实例。有关更多信息，请参阅 [使用实例刷新更新自动扩缩组中的实例](asg-instance-refresh.md)。

## 更新暖池中的实例
<a name="update-warm-pool"></a>

如需更新暖池中的实例，您可以创建新的启动模板或启动配置，并将其与自动扩缩组关联起来。所有新实例都将使用新 AMI 和在启动模板或启动配置中指定的其他更新启动，但现有实例不受影响。

要强制启动使用新启动模板或启动配置的替换暖池实例，您可以启动实例刷新，对您的组进行滚动更新。实例刷新首先将替换 `InService` 实例。然后，它将替换暖池中的实例。有关更多信息，请参阅 [使用实例刷新更新自动扩缩组中的实例](asg-instance-refresh.md)。

## 相关资源
<a name="warm-pools-related-resources"></a>

您可以访问我们的[GitHub存储库](https://github.com/aws-samples/amazon-ec2-auto-scaling-group-examples)，查看温池生命周期挂钩的示例。

## 限制
<a name="warm-pools-limitations"></a>
+ 针对采用混合实例类型的自动扩缩组的暖池限制：
  + 加权混合实例组不支持暖池。如果自动扩缩组使用了实例权重，则无法添加暖池。
  + 暖池不支持混合实例组中的竞价型实例。只有在使用暖池时，才需要为按需型实例配置混合实例策略。
  + 使用混合实例组处于休眠状态的暖池时，必须在启动模板中配置 `HibernationOptions`。
+ 仅当 Amazon EC2 Auto Scaling 将 Amazon EBS 卷作为其根设备时，前者才可将实例置于 `Stopped` 或 `Hibernated` 状态。无法停止或休眠对根设备使用实例存储的实例。
+ 仅当满足《Amazon EC2 用户指南》**内的[休眠先决条件](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/hibernating-prerequisites.html)主题中列出的所有要求时，Amazon EC2 Auto Scaling 才可将实例置于 `Hibernated` 状态。
+ 如果您的暖池在发生向外扩展事件时耗尽，则实例将直接启动到 Auto Scaling 组（*冷启动*)。如果可用区容量不足，您也可能会遇到冷启动。
+ 如果暖池中的实例在启动过程中遇到问题，导致其无法进入 `InService` 状态，则该实例将被视为启动失败并已终止。无论根本原因是什么（例如容量不足错误或任何其他因素），此情况都适用。
+ 如果您尝试将暖池与 Amazon Elastic Kubernetes Service (Amazon EKS) 托管节点组一起使用，则仍在初始化的实例可能会注册到您的 Amazon EKS 集群。因此，在准备停止或休眠时，集群可能会在实例上安排作业。
+ 同样，如果您尝试将暖池与 Amazon ECS 集群一起使用，则实例可能会在完成初始化之前注册到集群。要解决此问题，您必须配置启动模板或启动配置，使其包含用户数据中的特殊代理配置变量。有关更多信息，请参阅 *《Amazon Elastic Container Service 开发人员指南》*中的[为自动扩缩组使用暖池](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/asg-capacity-providers.html#using-warm-pool)。