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

上次更新时间:2019 年 7 月 19 日

我的 AWS Batch 计算环境中的作业因以下错误而失败:“DockerTimeoutError:无法转换到已创建;等待 4m0s 后超时”。如何解决此错误?

简短描述

docker startdocker create 调用超过 4 分钟时,您会收到此错误。Amazon Elastic Container Service (Amazon ECS) 容器代理设置的默认超时限制为 4 分钟。

错误可能是由以下问题导致的:

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

如果这些问题都未导致错误,请尝试以下操作:

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

解决方法

解决突发余额问题

要检查您的 ECS 实例的突发余额,请执行以下操作:

1.    打开 Amazon ECS 控制台

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

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

3.    选择 ECS 实例选项卡。

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

注意:要查找失败作业的实例 ID,请运行 aws batch describe-jobs –jobs awsExampleJobID 命令。实例 ID 显示在 containerInstanceArn 的输出中。

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

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

7.    选择监控选项卡,然后选择突发余额来检查您的突发余额指标

注意:如果您的突发余额降到 0,则表示您的突发余额已耗尽。

要为您的托管计算环境创建启动模板,请执行以下操作:

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

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

2.    选择创建启动模板

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

4.    在存储(卷)部分中,在卷类型列中选择卷类型,然后在大小 (GiB) 列中输入整数值。

注意:如果您为卷类型选择预配置 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.    使用您的新启动模板来创建托管计算环境


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助吗?