我的 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 问题部分中的步骤。
如果这两个问题都不是导致错误的原因,则可以通过执行以下操作进一步解决问题:
解决方法
解决任何突发余额问题
检查您的 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. 使用您的新启动模板来创建托管式计算环境。
相关信息
发布 CloudWatch 指标的 AWS 服务
计算资源 AMI
amazon-ecs-agent (AWS GitHub)