我的 AWS Batch 任务为什么卡在 RUNNABLE 状态?

上次更新日期:2021 年 10 月 6 日

我的 AWS Batch 任务卡在 RUNNABLE 状态。为什么会发生这种情况?如何解除 AWS Batch 任务的卡顿?

简短描述

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

如果没有足够的可用资源来运行任务,则任务可能会无限期地处于 RUNNABLE 状态。有关更多信息,请参阅 AWS Batch 用户指南中的卡在 RUNNABLE 状态的任务

要对卡在 RUNNABLE 状态的 AWS Batch 任务进行故障排查,请执行以下操作。

解决方法

验证计算环境拥有足够的资源以运行作业

1.    打开 AWS Batch 控制台

2.    选择 Dashboard(控制面板)。

3.    在 Job queue overview(任务队列概览)面板中,在 RUNNABLE 列,选择卡在 RUNNABLE 状态的任务。Job details(任务详细信息)页面将会显示。

4.    在 Job details(任务详细信息)页面中的 Environment(环境)部分,查看 vCPUsMemory(内存)的值。您需要这些值才能完成步骤 7 到 9。

5.    在左侧导航窗格中,选择 Compute environments(计算环境)。然后,在 Name(名称)列中,找到任务需要运行的计算环境名称。

6.    查看计算环境的 Status(状态)列。确保将其设置为 VALID

7.    查看计算环境的 State(状态)列。确保将其设置为 ENABLED

8.    查看计算环境中的 Max vCPUs(最大 vCPUs)列和 Desired vCPUs(所需 vCPUs)列。确保 Max vCPUs(最大 vCPUs)的值足够高,以便 AWS Batch 能够增加 Desired vCPUs(所需 vCPUs)的数量来运行任务。

9.    验证 Desired vCPUs(所需 vCPUs)的值等于或高于运行任务所需的 vCPUs 的数量。

10.    如果 Desired vCPU(所需 vCPU)为 0,请检查您的 Amazon Elastic Compute Cloud (Amazon EC2) 实例类型可用的内存和 CPU 资源数量。

– 或 –

如果 Desired vCPUs(所需 vCPU)大于 0 或您的任务仍处于 RUNNABLE 状态,请完成本文以下部分中的步骤。

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

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

1.    打开 Amazon Elastic Container Service (Amazon ECS) 控制台

2.    从左侧导航窗格中,选择 Clusters(集群)。然后,选择包含您任务的集群。

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

3.    选择 ECS instance(ECS 实例)视图。然后,验证容器实例是否可用于运行任务。

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

如果 Amazon ECS 集群中没有实例,请验证您的实例是否可以在计算环境中创建。要验证您的实例是否可以创建,请根据您的计算环境执行以下操作之一:

要验证您的实例可以在按需计算环境中创建

1.    打开 Amazon EC2 控制台

2.    在左侧导航窗格中,选择 Auto Scaling Groups(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 服务配额

5.    如果最近的 Auto Scaling 组事件显示仅有成功事件,请完成以下部分中所述的步骤。

要验证您的实例是否可在 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 状态。

7.    如果最近的 Auto Scaling 组事件显示仅有成功事件,请完成下个部分中所述的步骤。

验证容器实例的 IAM 角色

1.    打开 AWS Batch 控制台

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

3.    在 Compute environments details(计算环境详细信息)部分,复制实例角色名称。

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 groups(安全组)的值。

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

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

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

如果自动分配公有 IPv4 地址的值为“Yes”

在子网中启动的实例具有以下内容:

  • 公有 IPv4 地址
  • 路由目的地为 0.0.0.0/0 的路由表
  • 设置为 Target(目标)的互联网网关(例如:igw-1a2b3c4d

如果自动分配公有 IPv4 地址的值为“No”

在子网中启动的实例具有以下内容:

  • 私有 IPv4 地址
  • 路由目的地为 0.0.0.0/0 的路由表
  • 设置为 Target(目标)的 NAT 网关(例如:nat-12345678901234567)。

注意:有关更多信息,请参阅路由

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 容器代理的状态。


这篇文章对您有帮助吗?


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