

# 优化 Amazon ECS 集群自动扩缩
<a name="capacity-cluster-speed-up-ec2"></a>

在 Amazon EC2 上运行 Amazon ECS 的客户可以利用集群自动扩缩来管理 Amazon EC2 Auto Scaling 组的扩缩。通过集群自动扩缩，您可以将 Amazon ECS 配置为自动扩缩您的自动扩缩组，您只需专注于运行任务即可。Amazon ECS 可确保自动扩缩组根据需要横向缩减和横向扩展，无需进一步干预。Amazon ECS 容量提供程序用于通过确保有足够的容器实例可以满足应用程序的需求来管理集群中的基础设施。要了解集群自动扩缩在后台的工作方式，请参阅[深入了解 Amazon ECS 集群自动扩缩](https://aws.amazon.com/blogs/containers/deep-dive-on-amazon-ecs-cluster-auto-scaling/)。

集群自动扩缩依赖于基于 CloudWatch 与自动扩缩组的集成来调整集群容量。因此，它具有固有延迟，这种延迟与以下因素相关：
+ 发布 CloudWatch 指标 
+ `CapacityProviderReservation` 指标违反 CloudWatch 警报所花费的时间（包括高、低警报）
+ 新启动的 Amazon EC2 实例预热所花费的时间。您可以执行以下操作来提高集群自动扩缩的响应能力，从而加快部署速度：

## 容量提供程序分步扩缩大小
<a name="cas-step-size"></a>

Amazon ECS 容量提供程序将增加/缩小容器实例，以满足您的应用程序需求。Amazon ECS 将启动的实例最小数量默认设置为 1。如果需要多个实例来放置待处理的任务，这可能会额外增加您的部署时间。您可以通过 Amazon ECS API 增加 [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedScaling.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedScaling.html)，以增加 Amazon ECS 一次横向缩减或扩展的最小实例数量。过低的 [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedScaling.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedScaling.html) 可能会限制一次横向缩减或扩展的容器实例数量，这可能会减慢您的部署速度。

**注意**  
此配置目前只能通过 [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCapacityProvider.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCapacityProvider.html) 或 [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateCapacityProvider.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateCapacityProvider.html) API 进行。

## 实例预热期
<a name="instance-warmup-period"></a>

实例预热期是新启动的 Amazon EC2 实例可以向自动扩缩组提供 CloudWatch 指标之后需要经过的时间。指定的预热期到期后，该实例将计入自动扩缩组的聚合指标，集群自动扩缩将继续进行下一次计算迭代，从而估计所需的实例数量。

[https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedScaling.html#ECS-Type-ManagedScaling-instanceWarmupPeriod](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedScaling.html#ECS-Type-ManagedScaling-instanceWarmupPeriod) 的默认值为 300 秒，您可以通过 [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCapacityProvider.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCapacityProvider.html) 或 [https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateCapacityProvider.html](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateCapacityProvider.html) API 将其配置为较低的值，以提高扩展响应速度。建议将该值设置为大于 60 秒的值，从而避免过度预置的问题。

## 备用容量
<a name="spare-capacity"></a>

如果您的容量提供程序没有可用于放置任务的容器实例，则它需要通过即时启动 Amazon EC2 实例来增加（横向扩展）集群容量，并等待它们启动后才能在其上启动容器。这样会大大降低任务启动率。您在此有两种选择。

 在这种情况下，已经启动并准备好运行任务的备用 Amazon EC2 容量将提高有效的任务启动率。您可以使用 `Target Capacity` 配置来表示您希望在集群中维护备用容量。例如，通过将 `Target Capacity` 设置为 80%，表示您的集群始终需要 20% 的备用容量。此备用容量可使任何独立任务立即启动，从而确保任务启动不受限制。这种方法的代价是保持备用集群容量的潜在成本增加。

您可以考虑采用另一种方法，即为服务而不是容量提供程序增加余量。这意味着，与其减少 `Target Capacity` 配置以启动备用容量，不如修改服务自动扩缩的目标跟踪扩缩指标或分步扩缩阈值来增加服务中的副本数量。请注意，这种方法仅对高峰工作负载有帮助，但在部署新服务并第一次从 0 个任务增加到 N 个任务时不会产生任何影响。有关相关扩缩策略的更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的[目标跟踪扩缩策略](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-autoscaling-targettracking.html)或[分步扩缩策略](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-autoscaling-stepscaling.html)。