Amazon Elastic Compute Cloud
Windows 实例用户指南

EC2 队列配置策略

EC2 队列 是一组按需实例和 Spot 实例。

EC2 队列尝试启动相应数量的按需实例和 Spot 实例,以满足指定的目标容量。如果指定的 Spot 价格超过当前 Spot 价格并且有可用容量,则执行 Spot 实例请求。如果 Spot 实例因 Spot 价格或可用容量的变化而中断,则队列还会尝试保持其目标容量。

Spot 实例 池 是一组未使用的 EC2 实例,具有相同的实例类型、操作系统、可用区和网络平台。在您创建 EC2 队列时,可以指定多个启动说明 (因实例类型、可用区、子网以及最高价而异)。该队列会基于请求中包含的启动说明以及请求的配置来选择用于执行请求的 Spot 实例池。Spot 实例来自所选的池。

EC2 队列让您能基于核心或实例数量或内存量预配置适合于您的应用程序的大量 EC2 容量。例如,您可以指定 EC2 队列启动 200 个实例的目标容量,其中 130 个是按需实例,其余是 Spot 实例。也可以请求 1000 个内核,每个内核至少有 2 GB RAM。该队列确定 Amazon EC2 选项的组合,以便以绝对最低的成本启动此容量。

使用适当的配置策略创建满足您的需求的EC2 队列。

规划 EC2 队列

规划 EC2 队列时,建议执行以下操作:

  • 确定您要创建的 EC2 队列是针对所需目标容量提交同步或异步一次性请求,还是随着时间推移保持目标容量。有关更多信息,请参阅EC2 队列请求类型

  • 确定满足您的应用程序要求的实例类型。

  • 如果计划在 EC2 队列中包含 Spot 实例,在创建队列之前,请查看 Spot 最佳实践。使用这些最佳实践规划您的队列,以便以可能的最低价预配置实例。

  • 确定您的 EC2 队列的目标容量。您可以采用实例或自定义单位设置目标容量。有关更多信息,请参阅 EC2 队列实例权重

  • 确定 EC2 队列目标容量的多大部分必须是按需容量和 Spot 容量。您可以为按需容量和/或 Spot 容量指定 0。

  • 确定您的每单位价格 (如果使用实例权重)。要计算每单位价格,请将每实例小时价格除以该实例表示的单位数 (或权重)。如果不使用实例权重,则默认每单位价格为每实例小时价格。

  • 查看可用于您的 EC2 队列的可能选项。有关更多信息,请参阅 EC2 队列 JSON 配置文件参考。有关 EC2 队列配置示例,请参阅EC2 队列示例配置

EC2 队列请求类型

EC2 队列请求有三种类型:

instant

如果您将请求类型配置为 instant,EC2 队列会针对所需容量发出同步一次性请求。在 API 响应中,它返回启动的实例以及那些无法启动实例的错误。

request

如果您将请求类型配置为 request,EC2 队列针对所需容量发出异步一次性请求。此后,如果由于 Spot 中断导致容量减少,队列不会尝试补充 Spot 实例,也不会当容量不可用时在其他 Spot 实例容量池中提交请求。

maintain

(默认)如果您将请求类型配置为 maintain,EC2 队列针对所需容量发出异步请求,并自动补充任何中断的 Spot 实例 以保持容量。

提交 instantrequest EC2 队列请求后,其目标容量则无法修改。要更改 instantrequest 队列请求的目标容量,请删除队列并创建新队列。

所有三种请求类型都可通过分配策略获益。有关更多信息,请参阅Spot 实例的分配策略

Spot 实例的分配策略

EC2 队列的分配策略决定了如何根据启动规范从可能的 Spot 实例池满足 Spot 实例请求。以下是可在队列中指定的分配策略:

lowestPrice

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

diversified

Spot 实例分布在所有池中。

InstancePoolsToUseCount

Spot 实例分布在您指定数量的 Spot 池中。此参数仅在与 lowestPrice 结合使用时有效。

维持目标容量

在 Spot 实例因 Spot 价格或 Spot 实例池的可用容量发生变化而终止之后,maintain 类型的 EC2 队列会启动替换 Spot 实例。如果分配策略是 lowestPrice,则 队列在当前具有最低 Spot 价格的池中启动替换实例。如果分配策略是 diversified,则队列在其余池间分配替换 Spot 实例。如果分配策略是 lowestPriceInstancePoolsToUseCount 的组合,则队列选择具有最低价格的 Spot 池并跨您指定数量的 Spot 池启动 Spot 实例。

配置 EC2 队列,实现成本优化

要优化 Spot 实例使用成本,请指定 lowestPrice 分配策略,以便 EC2 队列自动基于当前 Spot 价格部署实例类型和可用区的最低成本组合。

对于个按需实例目标容量,EC2 队列始终根据公开按需价格选择成本最低的实例类型,同时对 Spot 实例继续按照策略(lowestPricediversified)执行分配。

配置 EC2 队列 以实现成本优化和多元化

要以低成本且多元化的方式创建 Spot 实例队列,请将 lowestPrice 分配策略与 InstancePoolsToUseCount 结合使用。EC2 队列基于您指定数量的 Spot 池中的当前 Spot 价格,自动部署实例类型和可用区的最低成本组合。此组合可用于避免最昂贵的 Spot 实例。

选择合适的分配策略

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

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

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

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

要创建低成本且多元化的机群,请将 lowestPrice 策略与 InstancePoolsToUseCount 结合使用。您可以使用少量或大量的 Spot 池以在其中分配您的 Spot 实例。例如,如果您运行批处理,我们建议指定少量的 Spot 池(例如,InstancePoolsToUseCount=2)以确保队列始终具有计算容量,同时尽可能节省成本。如果您运行 Web 服务,我们建议指定较大数量的 Spot 池(例如,InstancePoolsToUseCount=10 个)以最大限度减少 Spot 实例池暂时不可用造成的影响。

配置 EC2 队列,以便进行按需备份

如果有紧急而不可预测的扩展需要,如在发生重大新闻事件或比赛期间必须扩展的新闻网站,建议为按需实例指定备用实例类型,以备首选选项没有足够可用容量时所需。例如,您可能首选 c5.2xlarge 按需实例,但是如果没有足够的可用容量,在负载高峰期内,您会愿意使用一些 c4.2xlarge 实例。在这种情况下,EC2 队列会尝试使用 c5.2xlarge 实例来满足您的所有目标容量,但如果没有足够的容量,它会自动启动 c4.2xlarge 实例来满足目标容量。

针对按需容量优化实例类型

EC2 队列 尝试满足您的按需容量时,它会默认首先启动价格最低的实例类型。如果 AllocationStrategy 设置为 prioritized,EC2 队列使用优先级来确定首先使用什么实例类型来满足按需容量。优先级分配给启动模板覆盖,优先级最高的最先启动。

例如,您可以配置三个启动模板覆盖,每个覆盖具有不同的实例类型:c3.largec4.largec5.largec5.large 的按需价格低于 c4.largec3.large 价格最低。如果您不使用优先级来确定顺序,则机群按照从 c3.large 开始、然后 c5.large 的顺序满足按需容量。由于您的 c4.large 经常会有未使用的预留实例,您可以设置启动模板覆盖优先级,这样其顺序就是 c4.largec3.largec5.large

最高价覆盖

每个 EC2 队列都可包含全局最高价,或者使用默认价格 (按需价格)。队列将该价格作为每个启动说明的默认最高价。

您可以选择在一个或多个启动说明中指定最高价。该价格是启动说明特有的。如果启动说明包含特定的价格,则EC2 队列使用该最高价以覆盖全局最高价。不包含特定最高价的任何其他启动说明仍使用全局最高价。

EC2 队列实例权重

当创建 EC2 队列时,您可以使用实例权重 定义每种实例类型对应用程序性能贡献的容量单位,并相应地为每个启动规范调整最高价。

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

下表中提供了用于为目标容量是 10 的 EC2 队列请求确定每单位出价的计算示例。

实例类型 实例权重 目标容量 启动的实例数 每实例小时价格 每单位小时价格

r3.xlarge

2

10

5

(10 除以 2)

$0.05

0.025

(0.05 除以 2)

r3.8xlarge

8

10

2

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

0.10 美元

0.0125

(0.10 除以 8)

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

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

  2. 设置每单位价格。

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

实例权重示例

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

  • 目标容量为 24

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

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

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

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

实例权重和分配策略

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

  • 目标容量为 30 个 Spot 实例

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

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

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

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

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

该演练使用一个名为 Example Corp 的虚构公司说明使用实例权重请求 EC2 队列的过程。

目标

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

计划

Example Corp 首先查看Spot 最佳实践。然后,Example Corp 确定了他们的 EC2 队列的要求。

实例类型

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) 作为一个单位,Example Corp 确定,此数量的 20 倍应可满足其需求。因此该公司将其EC2 队列请求的目标容量设置为 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 在其EC2 队列请求中将实例权重 1、2 和 4 分配给相应的启动配置。

每单位小时出价

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

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

r3.2xLarge

$0.7

1

$0.7

r3.4xLarge

1.4 美元

2

$0.7

r3.8xLarge

$2.8

4

$0.7

Example Corp 可能会使用每单位小时全局价格 0.7 美元,这对于所有三种实例类型来说是非常有竞争力的。他们可能还会使用每单位小时全局价格 0.7 美元,并在 r3.8xlarge 启动说明中使用特定的每单位小时价格 0.9 美元。

验证权限

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

创建 EC2 队列

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

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateId": "lt-07b3bc7625cdab851", "Version": "1" }, "Overrides": [ { "InstanceType": "r3.2xlarge", "SubnetId": "subnet-482e4972", "WeightedCapacity": 1 }, { "InstanceType": "r3.4xlarge", "SubnetId": "subnet-482e4972", "WeightedCapacity": 2 }, { "InstanceType": "r3.8xlarge", "MaxPrice": "0.90", "SubnetId": "subnet-482e4972", "WeightedCapacity": 4 } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 20, "DefaultTargetCapacityType": "spot" } }

Example Corp 使用以下 create-fleet 命令创建 EC2 队列:

aws ec2 create-fleet --cli-input-json file://config.json

有关更多信息,请参阅创建 EC2 队列

执行

分配策略确定 Spot 实例所来自的 Spot 实例池。

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

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

演练:使用 EC2 队列按需作为主容量

此演练使用名为 ABC Online 的虚构公司来说明按需请求 EC2 队列作为主容量 (如可用,还要作为 Spot 容量) 的过程。

目标

ABC Online 是一家餐饮送货公司,想要能够跨 EC2 实例类型和购买选项预配置 Amazon EC2 容量,以实现其预期的扩展、性能和成本。

计划

ABC Online 需要在高峰期内有固定容量运行,但也想要以较低价格增加容量,从而获益。ABC Online 确定了其 EC2 队列的以下要求:

  • 个按需实例容量 – ABC Online 需要 15 个按需实例来确保其能够处理高峰期内的流量。

  • Spot 实例 容量 – ABC Online 希望能够以较低的价格预配置 5 个 Spot 实例来提高性能。

验证权限

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

创建 EC2 队列

ABC Online 为其 EC2 队列创建一个具有以下配置的文件 config.json

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateId": "lt-07b3bc7625cdab851", "Version": "2" } } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 20, "OnDemandTargetCapacity":15, "DefaultTargetCapacityType": "spot" } }

ABC Online 使用以下 create-fleet 命令创建 EC2 队列:

aws ec2 create-fleet --cli-input-json file://config.json

有关更多信息,请参阅创建 EC2 队列

执行

分配策略确定按需容量始终得到满足,而目标容量的余额将在具有容量且可用的情况下作为 Spot 容量执行。