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

3 分钟阅读
0

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

简述

当作业没有未完成的依赖关系并且可以调度到主机时,AWS Batch 会将该作业改为 RUNNABLE 状态。一旦映射到作业队列的计算环境中有足够的可用资源,RUNNABLE 作业就会启动。

如果运行作业所需的资源不可用,则该作业可能会无限期地保持在 RUNNABLE 状态。有关详细信息,请参阅作业卡滞在 RUNNABLE(可运行)状态

要对卡滞在 RUNNABLE(可运行)状态的 AWS Batch 作业进行故障排除,请使用 AWSSupport-TroubleshootAWSBatchJob 运行手册。然后,请参阅 Outputs(输出)部分,以确定问题的可能原因以及修复该问题的步骤。

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

解决方案

使用 AWSSupport-TroubleshootAWSBatchJob SAW 运行手册

使用 AWS Support Automation 工作流程 (AWS SAW) 自动执行此故障排除过程。要使用 AWSSupport-TroubleshootAWSBatchJob SAW 运行手册,请参阅 AWSSupport-TroubleshootAWSBatchJob

如果该运行手册无法帮助您识别问题,请参阅以下章节,手动解决作业卡滞的问题。

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

1.打开 AWS Batch 控制台

2.选择控制面板

3.在作业队列概述窗格的 RUNNABLE 列中,选择卡在 RUNNABLE 状态的作业。将出现作业详细信息页面。

4.在作业详细信息页面的容器部分,查看 vCPU内存GPU 的值。您需要这些值才能完成步骤 9-10。

5.在作业队列页面上,选择一个作业队列并查看其关联的计算环境,因为任何计算环境都可能运行您的作业。接下来,对每个计算环境重复步骤 6-10。

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

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

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

8.验证状态列是否设置为已启用

9.验证最大 vCPU 数值是否足够高,足以允许 AWS Batch 增加所需 vCPU 数以便运行作业。

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

10.验证所需 vCPU 数是否等于或大于运行作业所必须的 vCPU 数量。

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

-或-

如果所需 vCPU 数大于 0,或者您的作业仍处于 RUNNABLE 状态,请完成下一节中的步骤。

**重要事项:**您的计算环境中至少有一个实例类型的内存必须超过您的作业指定的容量。此外,实例类型的 CPU 资源必须等于或大于您的作业指定的资源。如果没有任何一个实例类型有足够的内存以及足够的 CPU 资源来运行您的作业,请取消该作业。运行需要更少 CPU 或内存的新作业。或者,创建一个具有足够资源来运行作业的新计算环境,然后将该作业分配到相应的作业队列。

验证您的计算环境中是否有实例并且这些实例可用于运行您的作业

对于您确定为必须运行作业的计算环境,请完成以下步骤:

1.打开 Amazon ECS 控制台

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

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

**注意:**集群的名称以计算环境的名称开头。后面是 _Batch_ 以及一个由数字和字母组成的随机哈希值。

3.选择 ECS 实例视图。然后,验证容器实例是否可用于运行您的作业。

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

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

如果 Amazon ECS 集群中没有实例,请检查是否可以在您的计算环境中创建实例。要检查是否可以创建您的实例,请根据您的计算环境完成以下过程之一。

要检查是否可以在按需型计算环境中创建您的实例,请执行以下操作:

1.打开 Amazon EC2 控制台

2.在左侧导航窗格中,选择自动扩缩组

3.在筛选器中,输入您的计算环境的名称。

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

4.对于每个自动扩缩组,选择活动历史记录视图。然后,查找是否存在任何有关阻止的问题。

如果存在任何问题阻止实例启动,则状态列将显示不成功

例如,如果您账户中的实例数已达到最大实例数,那么 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 Service Quotas

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.在导航窗格中,选择实例。然后,选择竞价请求

3.在过滤器中,为请求类型选择实例集

4.在状态中,选择活动

5.选择描述。然后,查看总目标容量值以查看竞价型实例请求是否已完成。如果系统未创建任何实例,请查看历史记录视图,查看说明原因的消息。例如,无法达到竞价的请求会返回一条类似于以下示例的消息:

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.如果自动扩缩组的近期事件仅显示成功事件,请完成下一节中的步骤。

验证容器实例 IAM 角色

1.打开 AWS Batch 控制台

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

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

4.打开 IAM 控制台

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

6.选择权限视图。然后,确认该角色已附加了 AmazonEC2ContainerServiceforEC2Role 托管策略。如果已附加了该策略,则说明您的实例角色配置正确,您可以跳至步骤 11。

7.选择附加策略

8.在搜索框中,输入 AmazonEC2ContainerServiceforEC2Role

9.对于 AmazonEC2ContainerServiceforEC2Role 策略,请选中该复选框。然后,选择附加策略

10.选择信任关系视图。然后,选择编辑信任关系

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

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

12.如果信任关系与前面示例中的策略一致,则选择取消

-或-

如果信任关系与前面示例中的策略不一致,则将策略复制到策略文档控制台。然后,选择更新信任策略

如果您的实例仍未加入 Amazon ECS 集群,请完成下一节中的步骤。

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

1.打开 AWS Batch 控制台

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

3.在计算资源部分中,复制子网安全组的值。

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

5.在导航窗格上,选择子网

6.对于计算环境中的每个子网,选择描述。然后,查看自动分配公共 IPv4 地址值。

如果自动分配公共 IPv4 地址的值为,则在子网中启动的实例具有以下属性:

  • 一个公共 IPv4 地址
  • 一个路径目的地为 0.0.0.0/0 的路由表
  • 一个设为目标的互联网网关(例如:igw-1a2b3c4d

如果自动分配公共 IPv4 地址的值为,则在子网中启动的实例具有以下属性:

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

**注意:**有关详细信息,请参阅以下文章中的 Routing(路由)部分:示例: 具有 NAT 且服务器位于私有子网中的 VPC

7.在导航窗格中,选择安全组

8.对于计算环境中指定的每个安全组,选择出站规则视图。然后,验证是否存在具有以下设置的规则:

  • 对于类型,选择所有流量
  • 对于协议,选择全部
  • 对于端口范围,选择全部
  • 对于目标,选择 0.0.0.0/0

重要信息:如果该规则不存在,请选择编辑。然后,创建该规则。要设置更严格的出站流量规则,请为类型选择 HTTPS (443),为目标选择 0.0.0.0/0

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

10.选择 VPC 的网络访问控制列表。

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

**重要信息:**如果您修改了 ACL,请添加一条规则,允许从子网到互联网的出站 IPv4 HTTPS 流量。有关详细信息,请参阅使用安全组控制流向 AWS 资源的流量使用网络访问控制列表控制子网流量。要更改 VPC、子网或安全组,请创建新的计算环境。

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

注意:本文中的步骤并未涵盖所有可能的根本原因以及对其进行故障排除的方法。要对卡滞在 RUNNABLE(可运行)状态的 AWS Batch 作业进行更多故障排除,请使用 AWS CloudTrail。将用户名属性设置为 aws-batch,然后查找事件,以调查计划作业期间发生的错误。

相关信息

使用 SSH 连接到 Linux 实例

使用 RDP 连接到 Windows 实例

AWS 官方
AWS 官方已更新 1 年前