我的 AWS Batch 计算环境中的任务失败并返回以下错误: “DockerTimeoutError: Could not transition to created; timed out after waiting 4m0s." 我想解决这个错误。
简短描述
如果您的 Docker 启动和** Docker 创建** API 调用花费的时间超过 4 分钟,则 AWS Batch 会返回 DockerTimeoutError 错误。
**注意:**Amazon Elastic Container Service(Amazon ECS)容器代理设置的默认超时限制为 4 分钟。
以下原因最常导致此错误:
- AWS Batch 计算环境的 ECS 实例卷承受着来自队列中所有其他任务的高 I/O 压力。这些任务可能会消耗突增余额。
- 已停止的 ECS 容器的清理速度不够快,无法释放 Docker 进程守护程序。如果您使用自定义的亚马逊机器映像(AMI)而不是 AWS Batch 提供的默认 AMI,则可能会遇到 Docker 问题。
如果这两个问题都不是导致错误的原因,则采取以下措施来进一步解决问题:
解决方法
解决突增余额的问题
查看您的 ECS 实例的突增余额
**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 Troubleshoot AWS CLI errors。此外,应确保您使用的是最新版本的 AWS CLI。
完成以下步骤:
- 打开 Amazon ECS 控制台。
- 在导航窗格上,选择集群。然后,选择包含您的作业的集群。
注意:集群的名称以计算环境的名称开头,然后是_Batch_ 以及由数字和字母组成的随机哈希。
- 选择基础设施选项卡。
- 从容器实例 行下方的基础设施列中,选择您的**实例 ID **。
**注意:**要查找失败任务的实例 ID,请运行 AWS Batch describe-jobs AWS CLI 命令。实例 ID 显示在 containerInstanceArn 的输出中。
- 在 Amazon EC2 控制台中,确保该实例仍处于选中状态。然后在存储部分,选择您的 volumeID 的链接。
- 在块设备弹出窗口中,对于 Volume ID,选择您的卷。
- 选择监控选项卡。然后,选择突增余额来检查您的突增余额指标。如果您的突增余额下降到 0,那么你的突增余额就会耗尽。
为您的托管计算环境创建启动模板
**注意:**如果您更改启动模板,则必须创建新的计算环境。
完成以下步骤:
- 打开 Amazon EC2 控制台,然后选择启动模板。
- 选择创建启动模板。
- 对于 AMI ID,选择默认 Amazon ECS 优化过的 AMI。
- 在存储(卷)部分,在卷类型列中选择卷类型。然后,在大小 (GiB) 列中输入一个整数值。
**注意:**如果您为卷类型选择预配置 IOPS 固态硬盘 (io1),请输入 IOPS 允许的整数值。
- 选择创建启动模板。
- 使用新的启动模板创建新的托管计算环境。
使用您的 AMI 创建 AWS Batch 计算环境
**注意:**如果您更改 AMI,则必须创建新的计算环境,因为您无法更新 AMI ID 参数。
完成以下步骤:
- 打开 Amazon EC2 控制台。
- 选择启动实例。
- 按照设置向导中的步骤创建您的实例。
重要事项:在添加存储页面上,修改实例的卷类型或大小。卷大小越大,基准性能越高,补充突增余额的速度也越慢。要在高 I/O 负载下获得更好的性能,请将卷更改为 io1 类型。
- 从您的实例创建计算资源 AMI。
- 创建一个包含您 AMI ID 的 AWS Batch 计算环境。
解决 Docker 问题
默认情况下,Amazon ECS 容器代理会自动清理已停止的任务和您的容器实例未使用的 Docker 映像。如果您使用新映像运行新任务,则您的容器存储空间可能会填充您未使用的 Docker 映像。AWS Batch 的默认 AMI 会优化您的 Amazon ECS 清理设置。
完成以下步骤:
- 使用 SSH 连接到 AWS Batch 计算环境的容器实例。
- 要检查 Amazon ECS 容器代理,请运行 inspect ecs-agent Docker 命令。然后,查看输出中的 env 部分。
**注意:**要加快任务和映像清理速度,请减少以下变量的值:
ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION
ECS_IMAGE_CLEANUP_INTERVAL
ECS_IMAGE_MINIMUM_CLEANUP_AGE
ECS_NUM_IMAGES_DELETE_PER_CYCLE
您还可以使用可调整的参数进行自动任务和映像清理。
- 使用更新后的值创建新 AMI。
-或-
使用包含新环境变量的用户数据创建启动模板。
使用更新后的值创建新 AMI
完成以下步骤:
- 在 /etc/ecs/ecs.config 文件中设置代理配置参数。
- 重启容器代理。
- 从您的实例创建计算资源 AMI。
- 创建一个包含您 AMI ID 的 AWS Batch 计算环境。
使用包含新环境变量的用户数据创建启动模板
完成以下步骤:
-
使用用户数据创建启动模板。
例如,以下 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==--
有关 MIME 多部分文件的更多信息,请参阅 cloud-init 网站上的 MIME multi-part file。
-
使用新的启动模板创建托管计算环境。
相关信息
发布 CloudWatch 指标的 AWS 服务
计算资源 AMI
GitHub 网站上的 amazon-ecs-agent