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

4 分钟阅读
0

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

简短描述

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

如果没有所需的资源来运行任务,则任务可能会无限期地处于 RUNNABLE 状态。有关更多信息,请参阅任务卡在 RUNNABLE 状态

**注意:**本文介绍了对 Amazon Elastic Compute Cloud(Amazon EC2)上的 Amazon Elastic Container Service(Amazon ECS)和 AWS Fargate 上的 Amazon Elastic Compute Cloud(Amazon EC2)进行故障排查。要对 Amazon Elastic Kubernetes Service(Amazon EKS)上的 AWS Batch 进行故障排查,请参阅 Amazon EKS 上的 AWS Batch。

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

解决方法

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

1.    打开AWS Batch 控制台

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

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

4.    在 Job details(作业详细信息)页面中的 Container(容器)部分,查看 vCPUsMemory(内存)和 GPU 的值。您需要这些值才能完成步骤 9 到 10。

5.    在 Job queues(任务队列)页面上,选择一个任务队列并检查其关联的计算环境,因为任何计算环境均可能运行您的任务。接下来,对每个计算环境重复步骤 6–10。

6.    在 Compute Environments(计算环境)页面上,选择一个计算环境以查看其权限。

7.    验证计算环境的 Status(状态)列是否已设为 VALID(有效)。 此外,请确保与环境关联的服务角色具有所有必要的权限

注意:****出现间歇性或暂时性错误时,计算环境状态可能需要几分钟才能从 VALID 更改为 INVALID

8.    请验证 State(状态)列是否设置为 ENABLED(已启用)。

9.    验证 Max vCPUs(最大 vCPU 数)的值足够高,以便 AWS Batch 能够增加 Desired vCPUs(所需 vCPU 数)的数量来运行任务。

注意:如果您使用的是 AWS Fargate 计算环境,请转至“验证计算环境的网络和安全设置”部分。

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

如果所需 vCPU 数0,请检查您的 Amazon EC2 实例类型可用的内存和 CPU 资源数量。

-或者-

如果 Desired vCPUs(所需 vCPU 数)大于 0 或您的作业仍处于 RUNNABLE 状态,请完成下一部分中的步骤。

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

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

对于您标识为必须运行任务的计算环境,请采取以下步骤:

1.    打开 Amazon ECS 控制台

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

有关一般的 ECS 故障排查说明,请参阅 Amazon ECS 故障排查

**注意:**集群的名称以计算环境的名称开头。其次是 _Batch_ 以及数字和字母的随机哈希。

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

4.    如果集群拥有可用于运行作业的容器实例,请检查 Docker 进程守护程序的状态。然后,检查 Amazon ECS 容器代理的状态。

**注意:**有关更多信息,请参阅如何对 Amazon ECS 代理断开连接进行问题排查?

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

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

1.    打开 Amazon EC2 控制台

2.    在左侧导航窗格中,选择 Auto Scaling Groups(Auto Scaling 组)。

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

**注意:**Amazon EC2 可以为同一计算环境创建多个自动扩缩组。

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 代表您请求实例。如果您手动修改自动扩缩组,则您的计算环境可能失效。有关实例限制以及如何申请提高限制的更多信息,请参阅 Amazon EC2 服务限额

5.    如果自动扩缩组仅显示最近事件中的成功事件,请完成以下部分中的步骤。

**重要:**必须为服务相关的 AWS Identity and Access Management(IAM)角色 AWSServiceRoleForAutoScaling 设置某些权限。IAM 角色 AWSServiceRoleForAutoScaling 必须至少拥有用户访问客户托管的 AWS Key Management Service(AWS KMS)密钥的权限。这在具有自定义亚马逊云机器映像(AMI)、加密的 Amazon Elastic Block Store(Amazon EBS)卷和客户托管的 AWS KMS 密钥的环境中是必要的。有关更多信息,请参阅允许访问客户托管密钥的密钥策略部分

验证您的实例是否可在竞价型实例计算环境中创建:

1.    打开 Amazon EC2 控制台

2.    在导航窗格中,选择 Instances(实例)。然后,选择 Spot Requests(竞价型实例请求)。

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

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

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

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

6.    为您的计算环境选择适当的出价百分比。如果您更改出价,请确保创建一个新的计算环境。有关更多信息,请参阅竞价型实例定价历史记录

**注意:**AWS Batch 会代表您创建竞价型实例集请求。请勿手动修改竞价型实例集请求,否则您的计算环境可能为失效。

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

验证容器实例的 IAM 角色

1.    打开AWS Batch 控制台

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

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

4.    打开 IAM 控制台

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

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

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

8.    在搜索框中,输入 AmazonEC2ContainerServiceforEC2Role

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

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

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

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

12.    如果信任关系与上例中的策略匹配,则选择 Cancel(取消)

– 或者 –

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

如果您的实例仍未加入 Amazon 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 地址)的值。

如果 Auto-assign public IPv4 address(自动分配公有 IPv4 地址)值为 Yes(是),则在子网中启动的实例具有以下项:

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

如果 Auto-assign public IPv4 address(自动分配公有 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 出站流量从该子网流向互联网的规则。有关更多信息,请参阅使用安全组控制流向 EC2 实例的流量使用网络 ACL 控制流向子网的流量。要更改 VPC、子网或安全组,请创建新的计算环境。

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

**注意:**本文中的步骤并未涵盖所有可能的根本原因以及解决这些问题的方法。如果您需要更深入地研究您的 AWS Batch 任务卡在 RUNNABLE 状态的问题,则 AWS CloudTrail 可能会很有用。在 CloudTrail 中,您可以通过将 Username 属性设为 aws-batch 来查找事件,以收集与在计划任务过程中发生的错误相关的线索。


相关信息

连接到您的 Linux 实例

连接到您的 Windows 实例

AWS 官方
AWS 官方已更新 1 个月前