EC2 Spot 的最佳实践 - Amazon Elastic Compute Cloud

EC2 Spot 的最佳实践

Amazon EC2 竞价型实例是 AWS Cloud 中的备用 EC2 计算容量,与按需型实例价格相比,这种实例最高可以为您节省 90% 的成本。按需型实例和竞价型实例之间的唯一区别是,当 Amazon EC2 再次需要使用容量时,Amazon EC2 可以中断竞价型实例并提前两分钟发出通知。

竞价型实例建议用于无状态、容错且灵活的应用程序。例如,竞价型实例非常适合大数据、容器化工作负载、CI/CD、无状态 Web 服务器、高性能计算 (HPC) 和渲染工作负载。

在运行时,竞价型实例与按需型实例完全相同。不过,Spot 不能保证您可以将运行的实例保持足够长的时间以完成工作负载。Spot 也不能保证您可以立即使用查找的实例,或者不能保证您始终可以获得请求的总容量。此外,竞价型实例中断和容量可能会随着时间的推移而发生变化,因为竞价型实例可用性根据供需关系而发生变化,过去的性能并不能保证将来的结果。

竞价型实例不适用于不灵活、有状态、非容错或在实例节点之间紧密耦合的工作负载。对于不能容忍目标容量偶尔不完全可用的工作负载,也不建议使用该实例。我们强烈警告您不要在这些工作负载中使用竞价型实例或尝试故障转移到按需型实例以处理中断。

无论您是经验丰富的 Spot 用户还是竞价型实例新用户,如果您当前遇到竞价型实例中断或可用性问题,我们建议您按照以下最佳实践以获得使用 Spot 服务的最佳体验。

准备各个实例以处理中断

正常处理竞价型实例中断的最佳方法是,设计应用程序以提供容错能力。为此,您可以利用 EC2 实例再平衡建议和竞价型实例中断通知。

EC2 实例再平衡建议是一个信号,可在竞价型实例处于较高的中断风险时通知您。该信号使您有机会在两分钟的竞价型实例中断通知之前主动管理竞价型实例。您可以决定将工作负载再平衡到不处于较高中断风险的新的或现有的竞价型实例。借助自动扩缩组和 EC2 实例集中的容量再平衡功能,您可以轻松使用这个新信号。有关更多信息,请参阅使用主动容量再平衡

竞价型实例中断通知是在 Amazon EC2 中断竞价型实例之前的两分钟发出的警告。如果工作负载为“时间灵活型”负载,您可以将竞价型实例配置为在中断时停止或休眠,而不是终止。Amazon EC2 在中断时使竞价型实例自动停止或休眠,并在我们具有可用容量时自动恢复这些实例。

我们建议您在 Amazon EventBridge 中创建一个规则以捕获再平衡建议和中断通知,然后触发工作负载进度的检查点或正常处理中断。有关更多信息,请参阅监控再平衡建议信号。有关指导您如何创建和使用事件规则的详细示例,请参阅利用 Amazon EC2 Spot 实例中断通知

有关更多信息,请参阅EC2 实例再平衡建议竞价型实例中断

灵活地选择实例类型和可用区

竞价型容量池是具有相同实例类型(如 m5.large)和可用区(如 us-east-1a)的未使用 EC2 实例的集合。您应该灵活地选择请求哪些实例类型,以及可以在哪些可用区中部署工作负载。这为 Spot 提供了更好的机会以查找和分配所需数量的计算容量。例如,如果您希望使用 c4、m5 和 m4 系列中的大型实例,则不要仅请求 c5.large

根据您的特定需求,您可以评估可灵活地选择哪些实例类型以满足您的计算要求。如果可以纵向扩展工作负载,您应该在请求中包括更大的实例类型(更多的 vCPU 和内存)。如果您只能横向扩展,您应该包括较旧一代的实例类型,因为按需客户很少需要使用它们。

一条很好的经验法则是,对于每种工作负载,灵活地在至少 10 种实例类型之间进行选择。此外,还要确保所有可用区配置为在 VPC 中使用,并为工作负载选择了这些可用区。

使用 EC2 自动扩缩组或 EC2 实例集管理总容量

Spot 允许您考虑总容量(包括 vCPU、内存、存储或网络吞吐量),而不是考虑单个实例。通过使用自动扩缩组和 EC2 实例集,您可以启动和维持目标容量,自动请求资源以替换任何中断或手动终止的资源。在配置自动扩缩组或 EC2 实例集时,您仅需要根据应用程序需求指定实例类型和目标容量。有关更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南 中的 Auto Scaling 组和本用户指南中的创建 EC2 队列

使用价格和容量优化分配策略

Auto Scaling 组中的分配策略可以帮助您预置目标容量,而无需手动查找具有备用容量的 Spot 容量池。我们建议使用 price-capacity-optimized ‎‏‏‏‎策略,因为该策略自动从可用性最佳的竞价型容量池中预置实例,同时也具有最低价格。您也可以在 EC2 实例集中利用 price-capacity-optimized 分配策略。由于竞价型实例容量来自于具有最佳容量的池,因此,这会降低回收竞价型实例的可能性。有关分配策略的更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南 中的 Spot 实例和本用户指南中的当工作负载拥有较高中断成本时

使用主动容量再平衡

容量再平衡功能可在运行中的竞价型实例收到两分钟的竞价型实例中断通知之前,主动使用新的竞价型实例扩展您的队列,从而帮助您维护工作负载的可用性。启用容量再平衡后,Auto Scaling 或 EC2 实例集将尝试主动替换已收到再平衡建议的竞价型实例,从而使您有机会将工作负载再平衡到未处于较高中断风险的新竞价型实例。

容量再平衡补充了价格容量优化分配策略(旨在帮助找到最佳备用容量)和混合实例策略(旨在通过在多个可用区中运行的多个实例类型上部署实例来提高可用性)。

有关更多信息,请参阅容量再平衡

使用集成的 AWS 服务以管理竞价型实例

其他 AWS 服务与 Spot 集成在一起以降低总体计算成本,而无需管理各个实例或队列。我们建议您针对适用的工作负载考虑以下解决方案:Amazon EMR、Amazon Elastic Container Service、AWS Batch、Amazon Elastic Kubernetes Service、Amazon SageMaker、AWS Elastic Beanstalk 和 Amazon GameLift。要了解这些服务的 Spot 最佳实践的更多信息,请参阅 Amazon EC2 竞价型实例 Workshops 网站

使用哪种竞价型请求方法最好?

使用下表确定在请求竞价型实例时使用哪个 API。

API 何时使用? 应用场景 我应该使用这个 API 吗?

CreateAutoScalingGroup

  • 您需要多个采用单一配置或混合配置的实例。

  • 您希望通过可配置的 API 自动执行生命周期管理。

创建一个 Auto Scaling 组,以管理实例的生命周期,同时保持所需的实例数量。支持在指定的最小和最大限值之间的水平扩展(添加更多实例)。

CreateFleet
  • 您需要多个采用单一配置或混合配置的实例。

  • 您希望自行管理实例生命周期。

  • 如果不需要弹性伸缩,我们建议您使用 instant 类型的实例集。

在单个请求中创建一个由按需型实例和竞价型实例组成的实例集,并具有多个因实例类型、AMI、可用区或子网而异的启动规范。竞价型实例分配策略默认为每单位 lowest-price,但您可以将其更改为 price-capacity-optimizedcapacity-optimizeddiversified

是 - 如果不需要弹性伸缩,则在 instant 模式下

RunInstances
  • 您已经在使用 RunInstances API 启动按需型实例,而且只想通过更改单个参数来更改为启动竞价型实例。

  • 您不需要多个实例类型不同的实例。

使用 AMI 和一个实例类型启动指定数量的实例。

否 - 因为 RunInstances 不允许在单个请求中混合多个实例类型

RequestSpotFleet
  • 我们强烈反对使用 RequestSpotFleet API,因为它是不具有计划投资的旧式 API。

  • 如果想要管理实例生命周期,请使用 CreateFleet API。

  • 如果不想管理实例生命周期,请使用 CreateAutoScalingGroup API。

请勿使用。RequestSpotFleet 是不具有计划投资的旧式 API。

RequestSpotInstances
  • 我们强烈反对使用 RequestSpotInstances API,因为它是不具有计划投资的旧式 API。

请勿使用。RequestSpotInstances 是不具有计划投资的旧式 API。