由于资源的过度利用,我的 EC2 Linux 实例的实例状态检查失败。如何解决此问题?

上次更新时间:2020 年 5 月 29 日

我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例因为资源的过度利用导致其实例状态检查失败。如何解决此问题?

简短描述

您的实例因过度利用导致运行状况检查可能失败的原因有几个。下面是您的运行状况检查因资源的过度利用可能导致失败的三个最常见原因:

  • 您的实例的 CPU 利用率接近 100%,且实例没有足够的剩余计算容量供内核运行。
  • 根设备进行了完全利用,且实例在启动时会卡住。
  • 在该实例上运行的进程使用了它的全部内存,从而阻止内核运行。

解决方法

检查 Amazon CloudWatch CPU 利用率指标

查看实例的 CloudWatch 指标。如果 CPU 利用率处于或接近 100%,请使用以下选项进行问题排查:

  • 重启实例,使其返回运行正常状态。
    注意:如果您的实例的 CPU 要求高于当前实例类型可以提供的要求,重启后,将会再次发生问题。
  • 考虑将您的实例更改为满足 CPU 要求的实例类型。
  • 如果您的实例是可突增性能实例(T2、T3 或 T3a),通过列出实例的指标检查其 CPUCreditBalance。您可以使用 CloudWatch 控制台或使用 AWS 命令行界面 (AWS CLI) 列出指标。
    如果积分余额接近零,则实例 CPU 可能受到限制。如果在实例上将积分规范设置为标准,您可以将规范更改为不受限制。有关更改积分规范的信息,请参阅修改可突增性能实例的积分规范

检查实例的系统日志中有无错误

检查系统日志中有无设备中没有剩余空间内存已用尽错误。

设备中没有剩余空间错误

如果实例的系统日志中出现类似于“OSError:[Errno 28] 设备中没有剩余空间 '/var/lib/'”的错误,包含所列文件夹(在本示例中为 /var/lib)的文件系统已满。

您可以使用救援实例释放文件系统上的控件。

警告:停止并启动实例前,确保了解以下内容:

  • 当您停止和启动实例时,实例存储数据丢失。如果您的实例受实例存储支持或具有包含数据的实例存储卷,则在实例停止时数据将丢失。有关更多信息,请参阅确定实例的根设备类型
  • 如果您的实例是 Amazon EC2 Auto Scaling 组的一部分,停止实例可能会终止实例。如果您使用 Amazon EMR、AWS CloudFormation 或 AWS Elastic Beanstalk 启动实例,您的实例可能是 AWS Auto Scaling 组的一部分。在这种情况下,是否会发生实例终止取决于您的 Auto Scaling 组的实例缩减保护设置。如果您的实例是 Auto Scaling 组的一部分,则在开始执行解决步骤之前,暂时从 Auto Scaling 组中删除该实例
  • 停止和启动实例会更改实例的公共 IP 地址。在将外部流量路由到您的实例时,最佳做法是使用弹性 IP 地址而不是公有 IP 地址。如果您使用 Route 53,您可能必须在公有 IP 更改时更新 Route 53 DNS 记录
  • 如果实例的关闭行为设置为终止,则实例停止时将会终止。您可以更改实例关闭行为以避免此情况。

1.    使用相同的 Amazon 系统映像 (AMI)、在与受损实例相同的可用区中,在您的 Virtual Private Cloud (VPC) 中启动新的 EC2 实例。此新实例将成为您的“救援”实例。

或者,也可以使用您可以访问的现有实例,但前提是该实例使用与受损实例相同的 AMI,并且二者位于同一可用区中

2.    停止受损的实例

3.    从受损实例中分离 Amazon Elastic Block Store (Amazon EBS) 根卷/dev/xvda/dev/sda1)。记下根卷的设备名称(/dev/xvda/dev/sda1)。

4.    将 EBS 卷作为辅助设备 (/dev/sdf) 附加到救援实例。

5.    使用 SSH 连接到您的救援实例

6.    为附加到救援实例的新卷创建挂载点目录 (/rescue)。

$ sudo mkdir /rescue

7.    将该卷挂载到您在第 6 步中创建的目录。

$ sudo mount /dev/xvdf1 /rescue

注意:设备 (/dev/xvdf1) 可能会以不同的设备名称附加到救援实例。使用 lsblk 命令查看可用磁盘设备及其挂载点,以确定正确的设备名称。

8.    运行 du -h 命令来检查哪些文件占用的空间最多。

du -h /recovery/var/lib

9.    根据需要删除文件以释放更多空间。

10.    运行 unmount 命令以从您的救援实例中卸载辅助设备。

$ sudo umount /rescue

如果卸载操作不成功,您可能需要停止或重启救援实例,以实现干净卸载。

11.    从救援实例分离辅助卷 (/dev/sdf)。然后,将它作为 /dev/xvda(根卷)附加到原始实例。

12.    启动实例,然后验证实例是否有响应。

内存耗尽错误

如果实例的系统日志中出现“内存耗尽:终止进程”错误,则实例的内存已耗尽。当内存耗尽时,内核没有足够的内存来运行,且其他进程将被终止,以释放内存。

有关如何解决内存耗尽 (OOM) 问题的更多信息,请参阅内存耗尽:终止进程