如何解决 AWS Batch 中的“DockerTimeoutError”错误?

上次更新日期:2022 年 2 月 3 日

我的 AWS Batch 计算环境中的任务失败并返回了以下错误:“DockerTimeoutError:无法转换到已创建;等待 4m0s 后超时”。 如何对 AWS Batch 中的“DockerTimeoutError”错误进行故障排除?

简短描述

如果您的 docker 启动docker 创建 API 调用花费的时间超过四分钟,那么 AWS Batch 会返回 DockerTimeoutError 错误。

注意:Amazon Elastic Container Service (Amazon ECS) 容器代理设置的默认超时限制为 4 分钟。

出现该错误的原因有很多,但通常是由以下原因之一引起的:

  • AWS Batch 计算环境的 ECS 实例卷处于您队列的所有其他任务带来的高输入/输出压力下。这些任务(在 ECS 实例上创建并运行)可能会耗尽突发余额。要解决此问题,请遵循本文中解决突发余额问题部分中的步骤。
  • 清理已停止的 ECS 容器的速度不够快,无法释放 Docker 守护进程。如果您使用的是自定义 Amazon 系统映像 (AMI) 而不是 AWS Batch 提供的默认 AMI,您可能会遇到 Docker 问题。默认 AMI for AWS Batch 会优化您的 Amazon ECS 清理设置。要解决此问题,请遵循本文中解决任何 Docker 问题部分中的步骤。

如果这两个问题都不是导致错误的原因,则可以通过执行以下操作进一步解决问题:

  • 检查您的 Docker 日志确认错误的来源。
  • 在 ECS 集群中的 ECS 实例上运行与 AWS Batch 计算环境关联的 Amazon ECS 日志收集器脚本

解决方法

解决任何突发余额问题

检查您的 ECS 实例的突发余额

1.    打开 Amazon ECS 控制台

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

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

3.    选择 ECS 实例选项卡。

4.    从 EC2 实例列中,选择您的实例。

注意:要查找失败任务的实例 ID,请运行 AWS Batch describe-jobs 命令。实例 ID 显示在 containerInstanceArn 的输出中。

5.    在 Amazon EC2 控制台的 Descriptions(描述)选项卡上,从 Block devices(块储存设备)中选择您的卷的链接。

6.    在块储存设备弹出窗口中,对于 EBS ID,选择您的卷。

7.    选择 Monitoring(监控)选项卡。然后,选择 Burst Balance(突发余额)以检查突发余额指标。注意:如果您的突发余额降到 0,则表示您的突发余额已耗尽。

为您的托管式计算环境创建启动模板

注意:如果更改启动模板,您必须创建新的计算环境。

1.    打开 Amazon EC2 控制台,然后选择启动模板

2.    选择创建启动模板

3.    对于 AMI ID,请选择默认的 Amazon ECS 优化的 AMI。

4.    在 Storage (Volumes)(存储(卷))部分的 Volume type(卷类型)列中选择卷类型。然后,在 Size(GiB)(大小 (GiB))列中输入一个整数值。

注意:如果您为卷类型选择 Provisioned IOPS SSD (io1)(预置 IOPS SSD (io1)),请输入 IOPS 允许的整数值。

5.    选择创建启动模板

6.    使用您的新启动模板创建新的托管式计算环境。

使用您的 AMI 创建 AWS Batch 计算环境

注意:如果更改 AMI,您必须创建新的计算环境,因为无法更新 AMI ID 参数。

1.    打开 Amazon EC2 控制台

2.    选择启动实例

3.    遵循设置向导中的步骤来创建您的实例。

重要提示:添加存储页面上,修改您的实例的卷类型或大小。卷大小越大,基准性能就越高,且卷补充突发余额的速度就越慢。要获得高 I/O 负载的更好性能,请将卷更改为 io1 类型。

4.    通过您的实例创建计算资源 AMI

5.    为包含您的 AMI ID 的 AWS Batch 创建计算环境

解决任何 Docker 问题

默认情况下,Amazon ECS 容器代理会自动清理已停止的任务和您的容器实例未使用的 Docker 镜像。如果您使用新映像运行新任务,那么容器存储空间可能会填满未使用的 Docker 镜像。

1.    针对您的 AWS Batch 计算环境,使用 SSH 连接到容器实例

2.    要检查 Amazon ECS 容器代理,请运行 Docker inspect ecs-agent 命令。然后,查看输出中的 env 部分。

注意:您可以减小以下变量的值,以加快任务和映像清理速度:

  • ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION
  • ECS_IMAGE_CLEANUP_INTERVAL
  • ECS_IMAGE_MINIMUM_CLEANUP_AGE
  • ECS_NUM_IMAGES_DELETE_PER_CYCLE

此外,您可以对自动化任务和图像清理使用可调参数

3.    使用更新的值创建新 AMI。

– 或者 –

使用包含新环境变量的用户数据创建启动模板。

要使用更新的值创建新 AMI,请执行以下操作:

1.    在 /etc/ecs/ecs.config 文件中设置您的代理配置参数。

2.    重启您的容器代理。

3.    通过您的实例创建计算资源 AMI。

4.    为包含您的 AMI ID 的 AWS Batch 创建计算环境。

要使用包含新环境变量的用户数据创建启动模板,请执行以下操作:

1.    使用用户数据创建启动模板

例如,以下 MIME 分段文件中的用户数据会覆盖计算资源的默认 Docker 镜像清理设置:

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
--==MYBOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"
#!/bin/bash
echo ECS_IMAGE_CLEANUP_INTERVAL=60m >> /etc/ecs/ecs.config
echo ECS_IMAGE_MINIMUM_CLEANUP_AGE=60m >> /etc/ecs/ecs.config
--==MYBOUNDARY==--

2.    使用您的新启动模板来创建托管式计算环境。


这篇文章对您有帮助吗?


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