如何解决 AWS Batch 中的“设备上没有剩余空间”错误?

2 分钟阅读
0

当 AWS Batch 作业失败时,我收到错误消息“No space left on device”(设备上没有剩余空间)。如何解决此问题?

简短描述

AWS Batch 可能会返回**“设备上没有剩余空间”**错误,原因有两个:

  • Amazon Elastic Block Store (Amazon EBS) 上托管的 Docker 卷上没有足够的磁盘空间。
  • (仅适用于 Amazon Linux 1)您已达到原定设置 Docker 存储限制 10 GiB。

要解决此错误,请首先验证托管在 Amazon EBS 上的 Docker 卷是否有足够的磁盘空间。如果磁盘空间不足,请增加 Amazon EBS 卷的大小。如果有足够的磁盘空间,则增加原定设置 Docker 存储限制。

这两种解决方案都需要创建新的自定义启动模板新的计算环境。您无法向 AWS Batch 中的现有计算环境添加新的自定义启动模板。

**注意:**Amazon Elastic Container Service (Amazon ECS) 优化的 Amazon Linux Amazon Machine Image (AMI) 1 已弃用。当您在 AWS Batch 中创建托管式计算环境时,Amazon ECS 优化的 Amazon Linux 2 AMI 是原定设置使用的镜像。有关更多信息,请参阅 AMI 存储配置。本文仅出于向后兼容性的原因提及 Amazon Linux 1

  • 如果您有某个 AWS Batch 计算环境在使用 ECS 优化型 Amazon Linux 1 AMI 来启动 Amazon Elastic Compute Cloud(Amazon EC2)实例,最佳实践是创建一个新的计算环境。然后,AWS Batch 将在创建新环境时使用最新可用的 ECS 优化型 Amazon Linux 2 AMI。
  • 如果您在使用 ECS 优化型 Amazon Linux 2 AMI 启动的 Amazon EC2 实例上运行的作业看到**“No space left on device”**(设备上没有剩余空间)错误,请增加根卷(/dev/xvda)的大小,以便为容器提供更多可用存储空间。

解决方法

**注意:**如果您在运行 AWS Command Line Interface (AWS CLI) 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI。您还可以使用 AWS CloudShell 运行以下命令。

验证在 Amazon EBS 上托管的 Docker 卷是否有足够的磁盘空间

按照确定 Docker 的可用存储部分或 AMI 存储配置中的说明进行操作。

如果磁盘空间不足,请参阅本文的增加 AWS Batch 中 Amazon EBS 卷的大小部分。

–或者–

如果磁盘空间充足,请参阅本文的**(仅适用于 Amazon Linux 1)提高原定设置 Docker 存储限制**部分。

增加 AWS Batch 中 Amazon EBS 卷的大小

1.    创建一个新的自定义启动模板,用于调整 AWS Batch 计算资源上的 Docker 数据卷(原定设置 ECS 优化型 AL2 镜像上的 /dev/xvda)的大小(添加大于当前值的 “VolumeSize”)。有关说明,请参阅启动模板支持

注意:如果您使用的是 Amazon Linux 1,请确保输入所需的 Docker 卷(/dev/xvda/dev/xvdcz)作为 DeviceName 值。

2.    创建一个新的计算环境,使用新的启动模板。

**注意:**相关 Amazon EC2 实例会在 AWS Batch 启动实例时显示新的驱动器大小。

(仅适用于 Amazon Linux 1)提高原定设置 Docker 存储限制

1.    使用可提高原定设置 Docker 存储限制的 MIME 分段归档格式创建新的自定义启动模板。有关更多信息,请参阅启动模板中的 Amazon EC2 用户数据

示例 MIME 分段文件覆盖了 AWS Batch 计算资源的原定设置 Docker 镜像设置

Content-Type: multipart/mixed; boundary="==BOUNDARY=="
MIME-Version: 1.0

--==BOUNDARY==
Content-Type: text/cloud-boothook; charset="us-ascii"
#cloud-boothook
#!/bin/bash
cloud-init-per once docker_options echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=20G"' >> /etc/sysconfig/docker

--==BOUNDARY==--

重要提示:如果使用 AWS CLI 或 AWS SDK,则必须先对用户数据进行 base64 编码。然后,在调用 CreateLaunchTemplate API 时提交该字符串作为 UserData 参数的值。

2.    创建一个新的计算环境,使用新的启动模板。


AWS 官方
AWS 官方已更新 2 年前