Amazon Elastic Compute Cloud
Windows 实例用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

Spot 队列的工作方式

Spot 队列 是 Spot 实例的集合或队列。 Spot 队列会尝试启动适当数量的 Spot 实例,以满足在 Spot 队列请求中指定的目标容量要求。如果您的 Spot 实例由于现货价格或可用容量的变化而中断,则 Spot 队列还会尝试维持其目标容量队列。

Spot 实例池 是一组未使用的 EC2 实例,具有相同的实例类型、操作系统、可用区和网络平台 (EC2-Classic 或 EC2-VPC)。当您发出 Spot 队列请求时,可以包含多个启动说明 (因实例类型、AMI、可用区或子网而异)。Spot 队列会基于 Spot 队列请求中包含的启动说明以及 Spot 队列请求的配置来选择用于执行请求的 Spot 实例池。 Spot 实例来自所选池。

Spot 队列分配策略

Spot 队列的分配策略决定了如何根据启动说明从可能的 Spot 实例池执行 Spot 队列请求。以下是您在 Spot 队列请求中可以指定的分配策略:

lowestPrice

Spot 实例来自具有最低价格的池。这是默认策略。

diversified

Spot 实例分布在所有池中。

选择分配策略

您可以基于您的使用案例来优化 Spot 队列。

如果您的队列较小或只是短时间运行,则您的 Spot 实例中断的可能性较低 (即使所有实例都在同一个 Spot 实例池中)。因此,lowestPrice 策略可能会满足您的需求,同时提供最低的成本。

如果您的队列较大或长时间运行,则您可以通过在多个池间分配 Spot 实例来提高队列的可用性。例如,如果您的 Spot 队列请求指定 10 个池,且目标容量为 100 个实例,则 Spot 队列会在每个池中启动 10 个 Spot 实例。如果一个池的现货价格上涨到超过您对该池的出价,则只有队列的 10% 受到影响。使用此策略还可降低您的队列对单个池的现货价格随时间上涨的敏感度。

使用 diversified 策略,Spot 队列不在现货价格高于按需价格的任何池中启动 Spot 实例。

维持目标容量

在 Spot 实例由于 Spot 实例池的现货价格或可用容量发生变化而终止之后,Spot 队列会启动替换 Spot 实例。如果分配策略为 lowestPrice,则 Spot 队列在当前具有最低现货价格的池中启动替换实例。如果分配策略为 diversified,则 Spot 队列在其余池间分配替换 Spot 实例。

现货价格覆盖

每个 Spot 队列请求必须包含一个全局现货价格。默认情况下, Spot 队列使用此价格作为每个启动说明的出价。

您可以选择在一个或多个启动说明中指定现货价格。此出价特定于启动说明。如果启动说明包含特定现货价格,则 Spot 队列使用此价格作为该启动说明的出价 (覆盖全局现货价格)。不包含特定现货价格的任何其他启动说明仍使用全局现货价格。

Spot 队列实例权重

当您请求 Spot 实例队列时,您可以使用实例权重 定义每种实例类型对应用程序性能贡献的容量单位,并相应地为每个 Spot 实例池调整出价。

默认情况下,您指定的现货价格表示每实例小时 的出价。使用实例权重功能时,您指定的现货价格表示每单位小时 的出价。您可以通过将实例类型出价除以它表示的单位数来计算每单位小时出价。Spot 队列通过将目标容量除以实例权重来计算要启动的 Spot 实例数。如果结果不是整数,则 Spot 队列会将其向上舍入到下一个整数,以便队列的大小不低于其目标容量。Spot 队列可以选择您在启动说明中指定的任意池,即使所启动实例的容量超过请求的目标容量也是如此。

下表包含用于为目标容量为 10 的 Spot 队列请求确定每单位出价的计算示例。

实例类型 实例权重 每实例小时现货价格 每单位小时现货价格 启动的实例数

r3.xlarge

2

$0.05

0.025

(0.05 除以 2)

5

(10 除以 2)

r3.8xlarge

8

0.10 USD

0.0125

(0.10 除以 8)

2

(10 除以 8,结果向上舍入)

按如下所示使用 Spot 队列实例权重,在执行时具有每单位最低价格的池中预置所需的目标容量:

  1. 采用实例 (默认设置) 或采用所选单位 (如虚拟 CPU、内存、存储或吞吐量) 为 Spot 队列设置目标容量。

  2. 设置每单位出价。

  3. 对于每个启动配置,指定权重,这是实例类型向目标容量提供的单位数。

实例权重示例

考虑一个具有以下配置的 Spot 队列请求:

  • 目标容量为 24

  • 一个实例类型为 r3.2xlarge 且权重为 6 的启动说明

  • 一个实例类型为 c3.xlarge 且权重为 5 的启动说明

每个权重表示相应实例类型向目标容量提供的单位数。如果第一个启动说明提供了最低的每单位现货价格 (r3.2xlarge 每实例小时现货价格除以 6),则 Spot 队列会启动四个这样的实例 (24 除以 6)。

如果第二个启动说明提供了最低的每单位现货价格 (c3.xlarge 每实例小时现货价格除以 5),则 Spot 价型队列会启动五个这样的实例 (24 除以 5,结果向上舍入)。

实例权重和分配策略

考虑一个具有以下配置的 Spot 队列请求:

  • 目标容量为 30

  • 一个实例类型为 c3.2xlarge 且权重为 8 的启动说明

  • 一个实例类型为 m3.xlarge 且权重为 8 的启动说明

  • 一个实例类型为 r3.xlarge 且权重为 8 的启动说明

Spot 队列会启动四个实例 (30 除以 8,结果向上舍入)。使用 lowestPrice 策略时,所有四个实例都来自提供最低每单位现货价格的池。使用 diversified 策略时, Spot 队列会在所有三个池中各启动 1 个实例,并在三个池中提供最低每单位现货价格的那个池中启动第四个实例。

演练:将 Spot 队列与实例权重结合使用

此演练使用一个名为 Example Corp 的虚构公司演示使用实例权重为 Spot 队列出价的过程。

目标

Example Corp 是一家医药公司,该公司想要利用 Amazon EC2 的计算功能来筛查可能用于对抗癌症的化学成分。

计划

Example Corp 首先查看竞价最佳实践。然后,Example Corp 确定了他们的 Spot 队列具有以下要求。

实例类型

Example Corp 有一个计算和内存密集型应用程序,该应用程序在至少 60 GB 内存和八个虚拟 CPU (vCPU) 的情况下性能最佳。他们希望以尽可能低的价格为该应用程序提供尽可能多的这些资源。Example Corp 认定以下任意 EC2 实例类型都能满足其需求:

实例类型 内存 (GiB) vCPU

r3.2xlarge

61

8

r3.4xlarge

122

16

r3.8xlarge

244

32

以单位数表示的目标容量

采用实例权重,目标容量可以等于几个实例 (默认) 或一些因素 (如内核 (vCPU)、内存 (GiB) 和存储 (GB)) 的组合。将其应用程序的基本要求 (60 GB RAM 和八个 vCPU) 作为 1 个单位,Example Corp 决定 20 倍此数量可满足其需求。因此该公司将其 Spot 队列请求的目标容量设置为 20。

实例权重

确定目标容量后,Example Corp 计算了实例权重。为了计算每个实例类型的实例权重,他们按如下所示确定每个实例类型需要多少单位才能达到目标容量:

  • r3.2xlarge (61.0 GB, 8 vCPUs) = 1 个 20 单位

  • r3.4xlarge (122.0 GB, 16 vCPUs) = 2 个 20 单位

  • r3.8xlarge (244.0 GB, 32 vCPUs) = 4 个 20 单位

因此,Example Corp 在其 Spot 队列请求中将实例权重 1、2 和 4 分配给相应的启动配置。

每单位小时出价

Example Corp 使用每实例小时按需定价作为其出价的起点。他们也可以使用最近的现货价格或两者的组合。为了计算每单位小时出价,他们用每实例小时的起始出价除以权重。例如:

实例类型 按需价格 实例权重 每单位小时价格

r3.2xLarge

$0.7

1

$0.7

r3.4xLarge

1.4 USD

2

$0.7

r3.8xLarge

$2.8

4

$0.7

Example Corp 可以输入一个每单位小时 0.7 USD 的全局出价来对全部三个实例类型竞价。他们还可以输入一个每单位小时 0.7 USD 的全局出价并在 r3.8xlarge 启动说明中输入每单位小时 0.9 USD 的特定出价。根据其 Spot 队列的预置策略,Example Corp 可以出较低的价格以便进一步降低成本,也可以出较高的价格以便减少可能的中断。

验证权限

在创建 Spot 队列请求之前,Example Corp 验证它是否拥有具备所需权限的 IAM 角色。有关更多信息,请参阅 Spot 队列先决条件

创建请求

Example Corp 为其 Spot 队列请求创建一个具有以下配置的文件 config.json

Copy
{ "SpotPrice": "0.70", "TargetCapacity": 20, "IamFleetRole": "arn:aws-cn:iam::123456789012:role/aws-ec2-spot-fleet-tagging-role", "LaunchSpecifications": [ { "ImageId": "ami-1a2b3c4d", "InstanceType": "r3.2xlarge", "SubnetId": "subnet-482e4972", "WeightedCapacity": 1 }, { "ImageId": "ami-1a2b3c4d", "InstanceType": "r3.4xlarge", "SubnetId": "subnet-482e4972", "WeightedCapacity": 2 } { "ImageId": "ami-1a2b3c4d", "InstanceType": "r3.8xlarge", "SubnetId": "subnet-482e4972", "SpotPrice": "0.90", "WeightedCapacity": 4 } ] }

Example Corp 使用以下 request-spot-fleet 命令创建 Spot 队列请求:

Copy
aws ec2 request-spot-fleet --spot-fleet-request-config file://config.json

有关更多信息,请参阅 Spot 队列请求

执行

分配策略确定 Spot 实例来自哪个 Spot 实例池。

使用 lowestPrice 策略 (这是默认策略) 时, Spot 实例来自在执行时具有最低每单位现货价格的池。为了提供 20 个单位的容量, Spot 队列有三种做法:启动 20 个 r3.2xlarge 实例 (20 除以 1)、10 个 r3.4xlarge 实例 (20 除以 2) 或 5 个 r3.8xlarge 实例 (20 除以 4)。

如果 Example Corp 使用 diversified 策略,则 Spot 实例来自所有三个池。 Spot 队列会启动 6 个 r3.2xlarge 实例 (提供 6 个单位)、3 个 r3.4xlarge 实例 (提供 6 个单位) 和 2 个 r3.8xlarge 实例 (提供 8 个单位),总共 20 个单位。