

# Amazon ECS 托管式扩缩行为
<a name="managed-scaling-behavior"></a>

如果自动扩缩组容量提供程序使用托管式扩缩功能，Amazon ECS 会估计要添加到集群的最优实例数量，并使用该值来确定要请求或释放的实例数。

## 托管横向扩展行为
<a name="managed-scaling-scaleout"></a>

Amazon ECS 通过遵循服务、独立任务或集群默认设置中的容量提供程序策略，为每项任务选择容量提供程序。对于单个容量提供程序，Amazon ECS 将按照其余步骤进行操作。

没有容量提供程序策略的任务会被容量提供程序忽略。没有容量提供程序策略的待处理任务不会导致任何容量提供程序横向扩展。如果任务或服务设置了启动类型，则该任务或服务无法设置容量提供程序策略。

下面更详细地描述了横向扩展行为。
+ 对此容量提供程序的所有预调配任务进行分组，以便每个组具有相同的精确资源需求。
+ 在自动扩缩组中使用多个实例类型时，自动扩缩组中的实例类型将按其参数进行排序。这些参数包括 vCPU、内存、弹性网络接口（ENI）、端口和 GPU。选择每个参数的最小和最大实例类型。有关如何选择实例类型的更多信息，请参阅 [Amazon ECS 的 Amazon EC2 容器实例](create-capacity.md)。
**重要**  
如果一组任务的资源需求高于自动扩缩组中最小的实例类型，则该组任务无法使用此容量提供程序运行。容量提供程序不对自动扩缩组进行扩展。任务仍处于 `PROVISIONING` 状态。  
为防止任务保持 `PROVISIONING` 状态，建议您针对不同的最低资源要求创建单独的自动扩缩组和容量提供程序。运行任务或创建服务时，仅将容量提供程序添加到容量提供程序策略中，该策略可以在自动扩缩组中最小的实例类型上运行任务。对于其他参数，您可以使用放置约束
+ 对于每组任务，Amazon ECS 计算运行未放置任务所需的实例数。此计算使用 `binpack` 策略。此策略考虑任务的 vCPU、内存、弹性网络接口（ENI）、端口和 GPU 要求。它还考虑 Amazon EC2 实例的资源可用性。将最大实例类型的值视为最大计算实例计数。最小实例类型的值用作保护。如果最小的实例类型无法运行任务的至少一个实例，则计算会将该任务视为不兼容。因此，该任务会被排除在横向扩展计算之外。当所有任务都与最小的实例类型不兼容时，集群自动扩缩将停止，`CapacityProviderReservation` 值保持为 `targetCapacity` 值。
+ 如果出现以下任一情况，Amazon ECS 会将与 CloudWatch 相关的 `CapacityProviderReservation` 指标发布给 `minimumScalingStepSize`。
  + 计算的最大实例计数小于最小扩缩步长大小。
  + 小于 `maximumScalingStepSize` 或最大计算的实例计数的较低值。
+ CloudWatch 警报使用容量提供程序的 `CapacityProviderReservation` 指标。当 `CapacityProviderReservation` 指标值大于 `targetCapacity` 值时，告警也会增加自动扩缩组的 `DesiredCapacity`。`targetCapacity` 值是在集群自动扩缩激活期间发送到 CloudWatch 警报的容量提供程序设置。

  默认 `targetCapacity` 为 100%。
+ 自动扩缩组启动其他 EC2 实例。为防止过度预置，自动扩缩确保最近启动的 EC2 实例容量在启动新实例之前稳定下来。Auto Scaling 会检查是否所有现有实例都已超过 `instanceWarmupPeriod`（现在减去实例启动时间）。`instanceWarmupPeriod` 中的实例无法横向扩展。

  新启动实例的默认预热时间为 300 秒。

有关更多信息，请参阅[深入了解 Amazon ECS 集群自动扩缩](https://www.amazonaws.cn/blogs/containers/deep-dive-on-amazon-ecs-cluster-auto-scaling/)。

### 横向扩展注意事项
<a name="scale-out-considerations"></a>

 对于横向扩展过程，请考虑以下几点：
+ 尽管存在多个放置约束，但我们建议您只使用 `distinctInstance` 任务放置约束。这可以防止横向扩展过程停止，因为您使用的是与采样实例不兼容的放置约束。
+ 如果 自动扩缩组使用相同或相似的实例类型，则托管扩展效果最佳。
+ 当需要横向扩展过程且当前没有正在运行的容器实例时，Amazon ECS 最初总是横向扩展到两个实例，然后执行额外的横向扩展或横向缩减过程。任何额外的横向扩展均会等待实例预热期。对于横向缩减过程，Amazon ECS 在横向扩展过程结束后会等待 15 分钟，然后才会一直启动横向缩减过程。
+ 第二个横向扩展步骤需要等到 `instanceWarmupPeriod` 到期，这可能会影响整体扩展限制。如果您需要缩短此时间，请确保 `instanceWarmupPeriod` 足够大，以便 EC2 实例启动和开始 Amazon ECS 代理（这可防止过度预置）。
+ 集群自动扩缩支持容量提供程序自动扩缩组中的启动配置、启动模板和多种实例类型。您还可以使用基于属性的实例类型选择而不使用多个实例类型。
+ 使用带有按需实例和多个实例类型或竞价型实例的 自动扩缩组时，请将较大的实例类型放在优先级列表中，并且不指定权重。这时不支持指定权重。有关详细信息，请参见 *Amazon Auto Scaling 用户手册*中的[使用多个实例类型 自动扩缩组](https://docs.amazonaws.cn/autoscaling/ec2/userguide/ec2-auto-scaling-mixed-instances-groups.html)。
+ 然后，Amazon ECS 将启动 `minimumScalingStepSize`，如果计算的最大实例计数小于最小扩展步长大小，或者 `maximumScalingStepSize` 或最大计算的实例计数值。
+ 如果 Amazon ECS 服务或 `run-task` 启动了一个任务且容量提供程序容器实例没有足够的资源来开始任务，则 Amazon ECS 会限制每个集群具有此状态的任务数量，并防止任何任务超过此限制。有关更多信息，请参阅 [Amazon ECS 服务配额](service-quotas.md)。

## 托管的横向缩减行为
<a name="managed-scaling-scalein"></a>

Amazon ECS 监控集群内每个容量提供程序的容器实例。当容器实例没有运行任何任务时，容器实例被视为空且 Amazon ECS 将启动横向缩减过程。

CloudWatch 横向缩减告警需要 15 个数据点（15 分钟），然后才能开始 自动扩缩组的横向缩减过程。在横向缩减过程开始之后，直到 Amazon ECS 需要减少已注册容器实例的数量时，自动扩缩组将 `DesireCapacity` 值设置为每分钟大于一个实例和少于 50%。

当 Amazon ECS 在横向缩减过程中请求横向扩展时（`CapacityProviderReservation` 大于 100 时），横向缩减过程将停止，如果需要，将从头开始。

下面更详细地描述了横向缩减行为：

1. Amazon ECS 计算空容器实例的数量。当没有运行进程守护程序任务时，容器实例被视为空。

1. Amazon ECS 将 `CapacityProviderReservation` 值设置为 0-100 之间的数字，该数字使用以下公式表示自动扩缩组需要的大小与实际大小的比值，以百分比表示。然后，Amazon ECS 将指标发布给 CloudWatch。有关计算指标的方式的更多信息，请参阅[深入了解 Amazon ECS 集群自动扩缩](https://www.amazonaws.cn/blogs/containers/deep-dive-on-amazon-ecs-cluster-auto-scaling/) 

   ```
   CapacityProviderReservation = (number of instances needed) / (number of running instances) x 100
   ```

1. `CapacityProviderReservation` 指标会生成 CloudWatch 告警。此告警会更新 自动扩缩组的 `DesiredCapacity` 值。然后，发生下列任一操作时：
   + 如果您不使用容量提供程序托管式终止，自动扩缩组将使用自动扩缩组终止策略选择 EC2 实例，并终止这些实例，直至 EC2 实例的数量达到 `DesiredCapacity`。然后，容器实例将从集群中注销。
   + 如果所有容器实例都使用托管终止保护，Amazon ECS 将删除对空容器实例的横向缩减保护。然后，自动扩缩组将能够终止 EC2 实例。然后，容器实例将从集群中注销。