跳至内容

如何对卡在 RUNNABLE 状态的 AWS Batch 作业进行故障排除?

4 分钟阅读
0

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

简短描述

当某个作业没有待处理的依赖项且 AWS Batch 能够调度该作业时,AWS Batch 会将该作业移至 RUNNABLE 状态。一旦映射到作业队列的计算环境中有足够的可用资源,RUNNABLE 作业就会启动。

如果运行作业所需的资源不可用,则该作业可能会一直卡在 RUNNABLE 状态

**注意:**以下解决方法用于对在 Amazon Elastic Container Service (Amazon ECS) 容器中运行的 AWS Batch 作业进行故障排除。这些容器可以在 Amazon Elastic Compute Cloud (Amazon EC2) 实例上或 AWS Fargate 计算环境中运行。要对在 Amazon Elastic Kubernetes Service (Amazon EKS) 上运行的 AWS Batch 作业进行故障排除,请参阅 Amazon EKS 上的 AWS Batch

解决方法

首先,确定您卡住的作业是否阻塞了先进先出 (FIFO) 队列。如果此操作未能解决问题,请自动执行故障排除以确定问题,或手动对问题进行故障排除。

检查 FIFO 队列是否被阻塞

由于以下问题,作业可能会在先进先出 (FIFO) 队列的起始位置卡在 RUNNABLE 状态:

  • 作业未使用公平分享调度,因此排在其后的所有其他作业均无法运行。
  • 您的 AWS 账户存在配置错误。
  • 您的账户无权访问作业所需的实例。例如,您的账户可能需要 GPU 实例类型。

要解除对 FIFO 队列的阻塞,请使用 GetJobQueueSnapshot 找到阻塞该队列的作业,然后关闭该作业

自动执行故障排除流程

使用 AWSSupport-TroubleshootAWSBatchJob 运行手册对卡在 RUNNABLE 状态的 AWS Batch 作业进行故障排除。或者,完成以下部分中的步骤以手动对问题进行故障排除。

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

完成以下步骤:

  1. 打开 AWS Batch 控制台
  2. 在导航窗格中,选择 Dashboard(控制面板)。
  3. Job queue overview(作业队列概述)部分的 RUNNABLE 列中,选择卡在 RUNNABLE 状态的作业。将显示您的作业的详细信息页面。
  4. 选择 Containers(容器)选项卡,然后记下 vCPUsMemoryGPUs 的值,以完成步骤 9–10。
  5. 在导航窗格中,选择 Job queues(作业队列),然后选择您的作业队列。
  6. Environment order(环境顺序)选项卡中,确定与您的作业队列关联的计算环境。
  7. 在导航窗格中,选择 Environments(环境),然后选择一个计算环境以查看其权限。
  8. Status(状态)部分中,确认该计算环境的 Status(状态)列为 Valid(有效)。
    **注意:**当出现间歇性或暂时性错误时,计算环境的状态可能需要几分钟才能从 Valid(有效)更改为 Invalid(无效)。
  9. Details(详细信息)选项卡中,验证与环境关联的服务角色是否具有所有必要的权限
  10. Status(状态)部分中,验证 State(状态)列是否为 Enabled(已启用)。
  11. Compute resources(计算资源)选项卡中,查看 Maximum vCPUs 的值。该值必须足够高,以便 AWS Batch 能够增加 Desired vCPUs(所需 vCPU 数)来运行作业。
    **注意:**如果您使用的是 Fargate 计算环境,请参阅“检查计算环境的网络和安全设置”部分。
  12. 验证 Desired vCPUs(所需 vCPU 数)是否等于或大于运行作业所必需的 vCPU 数量。
  13. 如果 Desired vCPUs(所需 vCPU 数)为 0,请检查适用于您的 Amazon EC2 实例类型的内存和 CPU 资源量。如果 Desired vCPU(所需 vCPU 数)大于 0,或者您的作业仍处于 RUNNABLE 状态,请完成以下部分中的步骤。

对每个计算环境重复步骤 6-14。

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

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

对于当前运行您的作业的计算环境,请完成以下步骤:

  1. 打开 Amazon ECS 控制台
  2. 在导航窗格中,选择 Clusters(集群),然后选择包含您的作业的集群。
    **注意:**集群名称以计算环境的名称开头,后跟 _Batch_ 以及由数字和字母组成的随机哈希。
  3. 选择 Infrastructure(基础设施)选项卡。
  4. Container instances(容器实例)部分中,找到您的容器实例,然后验证您的容器实例是否可用于运行作业。

如果集群有可运行您的作业的可用容器实例,请检查 Docker 进程守护程序Amazon ECS 容器代理的状态。有关详细信息,请参阅如何对断开连接的 Amazon ECS 代理进行故障排除?

如果 Amazon ECS 集群中没有实例,请检查您是否可以在您的计算环境中创建实例。

按需型计算环境

完成以下步骤:

  1. 打开 Amazon EC2 控制台

  2. 在导航窗格中,选择 Auto Scaling(自动扩缩),然后选择 Auto Scaling Groups(自动扩缩组)。

  3. 在搜索框中,输入您的计算环境的名称,然后选择您的计算环境。
    **注意:**Amazon EC2 可以为同一个计算环境创建多个自动扩缩组。

  4. 对于每个自动扩缩组,选择 Activity(活动)选项卡,然后在 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 服务配额

如果自动扩缩组的 Recent events(近期事件)中仅显示成功的事件,请完成“检查容器实例的 IAM 角色”部分中的步骤。

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

竞价型计算环境

完成以下步骤:

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格中,选择 Spot Requests(竞价型请求)。
  3. 选择 Request type(请求类型),然后选择 Request type = fleet(请求类型 = 实例集)。
  4. 选择您的竞价型请求。
  5. 对于 Status(状态),选择 Active(活动)。
  6. 选择 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”
  7. 为您的计算环境选择适当的竞价百分比。如果您更改了竞价,请务必创建新的计算环境。有关详细信息,请参阅竞价型实例定价历史记录
    **注意:**AWS Batch 会代表您创建竞价型实例集请求。请勿手动修改竞价型实例集请求,否则您的计算环境可能会失效。

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

检查容器实例的 IAM 角色

完成以下步骤:

  1. 打开 AWS Batch 控制台
  2. 在导航窗格中,选择 Environments(环境),然后选择您的计算环境。
  3. Details(详细信息)选项卡中,记下 Instance role(实例角色)的名称。
  4. 打开 IAM 控制台
  5. 在搜索框中,输入 Instance role(实例角色)的名称,然后选择您的实例角色。
  6. 选择 Permissions(权限)选项卡。在 Permissions policies(权限策略)部分中,确认您已将 AmazonEC2ContainerServiceforEC2Role 托管策略附加到该角色。如果您已附加策略,请继续执行步骤 11。
  7. 选择 Add permissions(添加权限),然后选择 Attach policies(附加策略)。
  8. Other permissions policies(其他权限策略)部分,在搜索框中输入 AmazonEC2ContainerServiceforEC2Role
  9. 选择 AmazonEC2ContainerServiceforEC2Role,然后选择 Add permissions(添加权限)。
  10. 选择 Trust relationships(信任关系)选项卡,然后选择 Edit trust policy(编辑信任策略)。
  11. 确认信任策略是否包含以下语句:
{  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  1. 如果信任策略包含上述语句,请选择 Cancel(取消)。如果信任策略不包含上述语句,请将该语句添加到您的策略中。然后,选择 Update policy(更新策略)。

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

检查计算环境的网络和安全设置

完成以下步骤:

  1. 打开 AWS Batch 控制台
  2. 在导航窗格中,选择 Environments(环境),然后选择您的计算环境。
  3. Compute resources(计算资源)部分中,记下 Subnets(子网)和 Security groups(安全组)的值。
  4. 打开 Amazon Virtual Private Cloud (Amazon VPC) 控制台
  5. 在导航窗格中,选择 Subnets(子网)。
  6. 选择计算环境中的每个子网,然后在 Details(详细信息)选项卡中确定 Auto-assign public IPv4 address(自动分配公共 IPv4 地址)的值。
    如果 Auto-assign public IPv4 address(自动分配公共 IPv4 地址)的值为 Yes(是),则在子网中启动的实例具有以下属性:
    一个公共 IPv4 地址
    一个路由目标为 0.0.0.0/0 的路由表
    一个设为目标的互联网网关,例如:igw-1a2b3c4d
    如果 Auto-assign public IPv4 address(自动分配公共 IPv4 地址)的值为 No(否),则在子网中启动的实例具有以下属性:
    一个私有 IPv4 地址
    一个路由目标为 0.0.0.0/0 的路由表
    一个设为目标的 NAT 网关,例如:nat-12345678901234567
    **注意:**有关详细信息,请参阅路由
  7. 在导航窗格中,选择 Security groups(安全组)。
  8. 对于计算环境中的每个安全组,选择 Outbound rules(出站规则)选项卡。然后,验证是否存在具有以下设置的规则:
    对于 Type(类型),选择 All traffic(所有流量)。
    对于 Protocol(协议),选择 All(全部)。
    对于 Port range(端口范围),选择 All(全部)。
    对于 Destination(目标),选择 0.0.0.0/0
    **重要事项:**如果规则不存在,请选择 Actions(操作),然后选择 Edit outbound rules(编辑出站规则)。然后,创建该规则。要设置更严格的出站流量规则,请为 Type(类型)选择 HTTPS (443),为 Destination(目标)选择 0.0.0.0/0
  9. 在导航窗格中,选择 Network ACLs(网络 ACL)。
  10. 选择 VPC 的网络访问控制列表(网络 ACL)。
  11. Inbound rules(入站规则)和 Outbound rules(出站规则)选项卡中,确认该网络 ACL 允许所有流量流入和流出关联子网。

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

如果您的实例仍未加入 Amazon ECS 集群,请连接到您的实例。检查 Docker 进程守护程序Amazon ECS 容器代理的状态。有关详细信息,请参阅如何对断开连接的 Amazon ECS 代理进行故障排除?

**注意:**要进一步对卡在 RUNNABLE 状态的 AWS Batch 作业进行故障排除,请使用 AWS CloudTrail。将 Username(用户名)属性设置为 aws-batch,以搜索在计划任务期间发生的错误。

相关信息

使用 SSH 连接到 Linux 实例

使用 RDP 连接到 Windows 实例

Introducing new alerts to help users detect and react to blocked job queues in AWS Batch(引入新警报以帮助用户检测并响应 AWS Batch 中被阻塞的作业队列)

AWS Batch 引入了作业队列快照来查看排在作业队列前面的作业

AWS 官方已更新 4 个月前