亚马逊AWS官方博客

EC2 队列 – 通过一次请求管理数千个按需实例和 Spot 实例

EC2 Spot 队列功能十分强大。您可以启动跨多个 EC2 实例类型和可用区的 Spot 实例队列,而且无需编写自定义代码来了解容量或监控价格。您可以对您的应用程序有意义的单位设置目标容量 (队列大小),我们将会代表您创建和维护 Spot 队列。客户可以创建各种大小的 Spot 队列。例如,一家金融服务客户通过 10 种不同的 EC2 实例运行 Monte Carlo 模拟。他们日常要向成千上万个 vCPU 发出请求,Spot 队列给了他们以最优价格使用大量容量的机会。

EC2 队列
今天,我们将借助 EC2 队列扩展和推广率先在 Spot 队列中采用的“设置即用”模型,这是一种新型构建块,可让您通过一次 API 调用,创建由 EC2 按需、预留和 Spot 实例组成的队列。您只需告诉我们您所需的内容、容量和实例单位,我们将会为您处理所有繁重工作。我们将根据需要启动、管理、监控和扩展实例,无需以脚手架方式编写代码。

您可以通过指定实例、vCPU 数量或使用面向应用程序的单位来指定队列容量,也可以指明 Spot 实例应提供的容量。借助面向应用程序的单位,您可以直接反映应用程序需求的方式指定每个 EC2 实例类型的相对能力。这三种容量规范选项 (实例、vCPU 和面向应用程序的单位) 被称为权重。

您一定可以找到多种方式来利用此功能简化实例队列管理工作,并且我相信您也会对近期的功能发布计划感兴趣 (稍后会详细介绍这些功能)。

使用 EC2 队列
您可以通过多种方式使用此功能,无论您是运行无状态 Web 服务、大数据集群,还是持续的集成管道,均可使用此功能。今天,我将为您介绍如何使用 EC2 队列处理基因组,这与风险分析、日志处理或图像渲染等工作负载类似。现代 DNA 测序仪每天可以生成数 TB 原始数据,要及时将这些数据处理成有意义的信息,您需要强大的处理功能。我将为您演示如何部署工作节点“网格”,以便快速并行执行次级分析任务。

基因组项目可以利用 EC2 提供的弹性,在数百甚或数千台服务器上试用新管道。有了 EC2,您可以根据需要使用任意数量的核心,而且只需为使用的核心付费。在此之前,您需要将 RunInstances API 或 Auto Scaling 组用于网格的按需和预留实例部分。如果您想添加 Spot 实例来加速执行次级分析,那么要想获得最佳性价比,您还需要创建并管理包含多个实例类型的一个 Spot 队列或多个 Spot Auto Scaling 组。最后,为了自动确定如何在多个 API 和 Auto Scaling 组之间进行扩展,您需要编写可以定期评估网格进度与积压任务以及当前 Spot 价格的 Lambda 函数,以便对 Auto Scaling 组和 Spot 队列做出相应修改。

现在,您只需一个 EC2 队列便可实现上述所有操作,以便大规模分析基因组,费用低至每次分析 1 USD。在我的网格中,管道中的每个步骤需要 1 个 vCPU 和 4 GiB 内存,因此每个 vCPU 提供 4 GiB 内存的 M4 和 M5 实例是理想之选。我将以每个实例上的 vCPU 数量为权重,使用 M4 和 M5 实例创建队列:

  • m4.16xlarge – 64 个 vCPU,权重 = 64
  • m5.24xlarge – 96 个 vCPU,权重 = 96

这可以如下所示的模板表达:

"Overrides": [
{
  "InstanceType": "m4.16xlarge",
  "WeightedCapacity": 64,
},
{
  "InstanceType": "m5.24xlarge",
  "WeightedCapacity": 96,
},
]

默认情况下,EC2 队列将根据 Spot 实例的当前价格和按需实例的公开交易价格,选择最经济实惠的实例类型和可用区 (均已在模板中指定) 组合 (对于您指定的实例,如果您已有匹配的 RI,则可享受相应的折扣)。默认模式会将权重考虑在内,以获取单位价格最低的实例。因此,在我的网格中,队列会查找 vCPU 单位价格最低的实例。

了解了 EC2 队列将会选择费用最低的选项 (仅使用我定义为可接受的实例类型) 后,现在我可以 vCPU 为单位请求容量。此外,我还可以根据按需实例或预留实例容量,指定要启动的 vCPU 数量,并根据 Spot 实例容量指定应该启动的 vCPU 数量:

"TargetCapacitySpecification": {
	"TotalTargetCapacity": 2880,
	"OnDemandTargetCapacity": 960,
	"SpotTargetCapacity": 1920,
	"DefaultTargetCapacityType": "Spot"
}

上面的代码段意味着,我总共需要 2880 个 vCPU,其中 960 个 vCPU 使用按需实例提供,而另外 1920 个则使用 Spot 实例提供。m5.24xlarge 的 vCPU 按需单价低于 m4.16xlarge 的 vCPU 按需单价,因此 EC2 队列将会启动 10 个 m5.24xlarge 实例来提供 960 个 vCPU。根据当前 Spot 价格 (仍以 vCPU 为单位),EC2 队列将选择启动 30 个 m4.16xlarge 实例或 20 个 m5.24xlarge 实例,来提供 1920 个 vCPU。

总结来说,我有一个文件 (fl1.json) 来描述我的队列:

    "LaunchTemplateConfigs": [
        {
            "LaunchTemplateSpecification": {
                "LaunchTemplateId": "lt-0e8c754449b27161c",
                "Version": "1"
            }
        "Overrides": [
        {
          "InstanceType": "m4.16xlarge",
          "WeightedCapacity": 64,
        },
        {
          "InstanceType": "m5.24xlarge",
          "WeightedCapacity": 96,
        },
      ]
        }
    ],
    "TargetCapacitySpecification": {
        "TotalTargetCapacity": 2880,
        "OnDemandTargetCapacity": 960,
        "SpotTargetCapacity": 1920,
        "DefaultTargetCapacityType": "Spot"
    }
}

我可以使用一条命令启动队列:

$ aws ec2 create-fleet --cli-input-json file://home/ec2-user/fl1.json
{
    "FleetId":"fleet-838cf4e5-fded-4f68-acb5-8c47ee1b248a"
}

我的整个队列在几秒之内即创建完成,而且因为当前的 Spot 价格为每个 m4.16xlarge vCPU 1.5 美分,每个 m5.24xlarge vCPU 1.6 美分,所以我的队列使用了 10 个 m5.24xlarge 按需实例和 30 个 m4.16xlarge Spot 实例。

现在设想一下,我的网格已处理完积压任务,不需要更多 Spot 实例了。我可以通过在队列规范中更改目标容量,来修改队列大小,如下所示:

{         
    "TotalTargetCapacity": 960,
}

因为 960 正好是我请求的按需 vCPU 的数量,因此当我描述队列时,我会看到所有容量都是按需实例提供的容量:

"TargetCapacitySpecification": {
	"TotalTargetCapacity": 960,
	"OnDemandTargetCapacity": 960,
	"SpotTargetCapacity": 0,
	"DefaultTargetCapacityType": "Spot"
}

当我不再需要队列后,我可以将其删除并终止实例,如下所示:

$ aws ec2 delete-fleets --fleet-id fleet-838cf4e5-fded-4f68-acb5-8c47ee1b248a \
  --terminate-instances   
{
    "UnsuccessfulFleetDletetions": [],
    "SuccessfulFleetDeletions": [
        {
            "CurrentFleetState": "deleted_terminating",
            "PreviousFleetState": "active",
            "FleetId": "fleet-838cf4e5-fded-4f68-acb5-8c47ee1b248a"
        }
    ]
}

之前我介绍了当 EC2 队列启动您有匹配的 RI 的实例时如何折价,那么您可能想知道 RI 客户可以通过 EC2 队列获得的其他好处。假设我拥有 M4 实例的区域性 RI。在我的 EC2 队列中,我要删除 m5.24xlarge 并指定 m4.10xlargem4.16xlarge。当 EC2 队列创建网格后,它会快速在我指定的大小和可用区之间查找 M4 容量,然后系统便会将 RI 折扣算入本次使用。

正在筹备中的工作
我们计划在 EC2 队列和 EC2 Auto Scaling 组之间建立关联。如此一来,您便可以创建融合多个实例类型以及 Spot、预留和按需实例的单个队列,同时还可利用运行状况检查和生命周期挂钩等 EC2 Auto Scaling 功能。本次集成还会将 EC2 队列功能融入 Amazon ECS、Amazon EKS 和 AWS Batch 等服务,这些服务在 EC2 Auto Scaling 的基础上构建并使用该功能管理队列。

现已推出
现在,您可以在所有公有 AWS 区域创建并使用 EC2 队列!

Jeff