为什么我的 AWS Batch 作业卡在 RUNNABLE 状态?

上次更新时间:2020 年 8 月 17 日

我的 AWS Batch 作业卡在 RUNNABLE 状态。

简短描述

如果您的作业没有待处理的依赖项并且可以随时安排到某个主机进行处理,AWS Batch 会将该作业转为 RUNNABLE 状态。如果映射到您的作业队列的任何一个计算环境中拥有足够的可用资源,处于 RUNNABLE 状态的作业将会启动。如果没有足够的可用资源,作业可能会无限期地处于 RUNNABLE 状态。

如果您将有效的托管计算环境用于默认的 Amazon 系统映像 (AMI),则您的作业也可能因下列原因而卡在 RUNNABLE 状态:

  • 资源不足:您的作业指定的 CPU 或内存资源数量超过了计算环境可以分配的数量。
  • 没有已分配的容器实例:无法创建实例,并且网络或安全问题也可能阻止容器实例加入底层 Amazon Elastic Container Service (Amazon ECS) 集群。
  • 主机级别的问题:容器实例内部可能发生了主机或 Docker 守护程序级别的问题。例如,实例的卷可能已满,或者 Docker 守护程序或 Amazon ECS 容器代理可能存在停止或启动问题。

解决方法

验证您的计算环境是否具有足够的资源来运行作业

1.    打开 AWS Batch 控制台

2.    对于 Job queues(作业队列),在 RUNNABLE 列中,选择卡在 RUNNABLE 状态的作业所在的作业队列。

3.    选择卡在 RUNNABLE 状态的作业。

4.    对于 Job details(作业详细信息),在 Environment(环境)部分,获取 vCPUsMemory(内存)的值。

5.    在导航窗格中,选择 Compute environment(计算环境)

6.    对于运行作业所需的计算环境,验证 Status(状态)设置为 VALID(有效)State(状态)设置为 ENABLED(已启用)

7.    验证 Max vCPUs(最大 vCPU 数)是否已设置为足够大的值,足以允许 AWS Batch 增加所需 vCPU 数来运行作业。

8.    验证 Desired vCPUs(所需 vCPU 数)的值是否等于或大于运行作业所需要的 vCPU 数量。

9.    如果所需 vCPU 数0,请检查您的 Amazon Elastic Compute Cloud (Amazon EC2) 实例类型可用的内存和 CPU 资源数量。如果所需 vCPU 数大于 0 或者您的作业仍然处于 RUNNABLE 状态,请完成验证您的计算环境是否拥有实例以及实例是否可用于运行作业部分中的步骤。

重要提示:计算环境中必须至少有一个实例类型拥有的内存大于作业指定的内存大小。此外,该实例类型拥有的 CPU 资源数量也必须等于或大于作业指定的数量。如果至少有一个实例类型不具备运行作业所需的足够内存或 CPU 资源,请取消该作业。然后,运行 CPU 或内存需求较低的新作业。您还可以创建新的计算环境,配备足够的资源来运行作业,然后再将作业分配给相应的作业队列。

验证您的计算环境是否拥有实例以及实例是否可用于运行作业

1.    打开 Amazon ECS 控制台

2.    在导航窗格中,选择集群,然后选择包含您的作业的集群。

注意:集群名称以计算环境的名称开头,然后为 _Batch_,最后为数字字母的随机散列。

3.    选择 ECS Instances(ECS 实例)视图,然后确认容器实例可用于运行您的作业。

4.    如果集群拥有可用于运行作业的容器实例,请检查 Docker 守护程序Amazon ECS 容器代理的状态。有关更多信息,请参阅为什么具有 Amazon Linux 1 AMI 的 Amazon ECS 容器实例会断开连接?

如果 ECS 集群中没有实例,请根据您的计算环境完成以下相应部分中的步骤:

  • 验证是否可以在按需计算环境中创建实例
  • 验证是否可以在 Spot 计算环境中创建实例

验证是否可以在按需计算环境中创建实例

1.    打开 Amazon EC2 控制台

2.    在导航窗格中,选择 Auto Scaling 组

3.    对于 Filter(筛选条件),请输入计算环境的名称。

注意:Amazon EC2 可以为同一计算环境创建多个 Auto Scaling 组。

4.    对于每个 Auto Scaling 组,请选择 Activity History(活动历史记录)视图,然后查看是否存在阻塞问题。

如果有任何问题阻碍实例启动,Status(状态)列会显示 Unsuccessful(失败)。例如,如果您的账户达到了最大实例数量限制,则 Amazon EC2 可能会返回类似于以下内容的消息:

Launching a new EC2 instance. Status Reason: Your quota allows for 0 more running instance(s). You requested at least 1. Launching EC2 instance failed.

事件包括一个代表您提交作业的时间的 UTC 时间戳。例如:

At 2018-09-03T05:54:30Z a user request update of AutoScalingGroup constraints to min: 0, max: 1, desired: 1 changing the desired capacity from 0 to 1.
At 2018-09-03T05:54:52Z an instance was started in response to a difference between desired and actual capacity, increasing the capacity from 0 to 1.

注意:AWS Batch 代表您请求实例。请勿手动修改 Auto Scaling 组,否则您的计算环境可能变为 INVALID 状态。有关实例限制以及如何申请提高限制的更多信息,请参阅 Amazon EC2 服务配额

如果最近的 Auto Scaling 组事件仅显示成功事件,请完成验证容器实例的 IAM 角色 部分中所述的步骤。然后即可查明实例未加入 ECS 集群的原因。

验证是否可以在 Spot 计算环境中创建实例

1.    打开 Amazon EC2 控制台

2.    在导航窗格中的 Instances (实例) 下,选择 Spot Requests (Spot 请求)

3.    对于 Request type (请求类型) 筛选条件,选择 fleet (队列)

4.    对于状态,选择 active (活动)

5.    选择 Description(描述),然后查找 Total target capacity(总目标容量)的值,以检查 Spot 实例请求是否已得到满足。如果未创建任何实例,请在 History(历史记录)视图中查找可能解释其原因的消息。例如,未达到出价的请求会返回类似于以下内容的消息:

m4.large, ami-aff65ad2, Linux/UNIX (Amazon VPC), us-east-1a, Spot bid price is less than Spot market price $0.0324

6.    为您的计算环境选择正确的出价百分比,并确保在更改出价时创建新的计算环境。有关更多信息,请参阅 Spot 实例定价历史记录

注意:AWS Batch 会代表您创建 Spot 队列请求。请勿手动修改 Spot 队列请求,否则您的计算环境可能变为 INVALID(无效)状态。

如果最近的 Auto Scaling 组事件仅显示成功事件,请完成验证容器实例的 IAM 角色 部分中所述的步骤。

验证容器实例的 IAM 角色

1.    打开 AWS Batch 控制台

2.    在导航窗格中,选择 Compute environments(计算环境),然后选择您的计算环境。

3.    在 Compute environment details(计算环境详细信息)部分中,获取 Instance role(实例角色)的名称。

4.    打开 AWS Identity and Access Management (IAM) 控制台

5.    在搜索框中,搜索您的实例角色的名称,然后从结果中选择您的实例角色。

6.    选择 Permissions(权限)视图,然后确认 AmazonEC2ContainerServiceforEC2Role 托管策略已附加到该角色。如果已附加该策略,则您的实例角色配置正确,您可以跳往第 11 步。

7.    选择 Attach Policies(附加策略)

8.    在搜索框中,键入 AmazonEC2ContainerServiceforEC2Role

9.    对于 AmazonEC2ContainerServiceforEC2Role 策略,请选中复选框,然后选择 Attach Policy(附加策略)

10.    选择 Trust Relationships(信任关系)视图,然后选择 Edit trust relationship(编辑信任关系)

11.    确认信任关系包含以下策略:

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

12.    如果信任关系与上例中的策略匹配,则选择 Cancel(取消)。如果信任关系与上例中的策略不匹配,则将该策略复制到 Policy Document(策略文档)控制台。然后,选择 Update Trust Policy(更新信任策略)

如果您的实例仍然无法加入 ECS 集群,请完成验证计算环境的网络设置和安全设置部分所述的步骤。

验证计算环境的网络设置和安全设置

1.    打开 AWS Batch 控制台

2.    在导航窗格中,选择 Compute environments(计算环境),然后选择您的计算环境。

3.    在 Compute resources(计算资源)部分中,获取 Subnets(子网)Security(安全组)的值。

4.    打开 Amazon Virtual Private Cloud (Amazon VPC) 控制台

5.    在导航窗格中,选择 Subnets(子网)

6.    对于计算环境中的每个子网,选择 Description(描述),然后检查 Auto-assign public IPv4 address(自动分配公有 IPv4 地址)属性的值。

如果该值为 Yes(是),则该子网中启动的实例将具有以下参数:一个公有 IPv4 地址、一个路由目标为 0.0.0.0/0 的路由表,以及一个设置为 Target(目标)(例如 igw-1a2b3c4d)的互联网网关。

如果该值为 No(否),则该子网中启动的实例将具有以下参数:一个私有 IPv4 地址、一个路由目标为 0.0.0.0/0 的路由表,以及一个设置为 Target(目标)(例如 nat-12345678901234567)的 NAT 网关。有关更多详细信息,请参阅路由

7.    在导航窗格中,选择 Security Groups(安全组)

8.    对于计算环境中指定的每个安全组,请选择 Outbound Rules(出站规则)视图,然后确认存在一条具有以下设置的规则:
对于 Type(类型),选择 ALL Traffic(所有流量)
对于 Protocol(协议),选择 ALL(全部)
对于 Port Range(端口范围),选择 ALL(全部)
对于 Destination(目的地),选择 0.0.0.0/0

重要提示:如果该规则不存在,请选择 Edit(编辑),然后创建该规则。如果您需要限制更严格的出站流量规则,则对于 Type(类型),选择 HTTPS (443);对于 Destination(目的地),选择 0.0.0.0/0

9.    在导航窗格中,选择 Network ACL(网络 ACL)

10.    选择计算环境中指定的 VPC 访问控制列表 (ACL)。

11.    确认默认网络 ACL 配置为允许所有流量进出关联的子网。

重要提示:如果您修改了 ACL,则添加一条允许 IPv4 HTTPS 出站流量从该子网流向互联网的规则。有关更多详细信息,请参阅您的 VPC 的安全组网络 ACL。要更改 VPC、子网或安全组,请创建新的计算环境。

如果您的实例仍然无法加入 ECS 集群,请连接到您的实例。然后,检查 Docker 守护程序Amazon ECS 容器代理的状态。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?