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

上次更新日期:2021 年 5 月 7 日

我的 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 可能会受到限制。如果在实例上将积分规范设置为标准,您可以将规范更改为不受限制。有关更改积分规范的信息,请参阅修改可突增性能实例的积分规范

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

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

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

设备中没有剩余空间错误

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

您可以使用以下一种方法来释放文件系统上的空间:

方法 1:使用 EC2 串行控制台

如果您为 Linux 启用了 EC2 串行控制台,则可以使用它来排查受支持的基于 Nitro 的实例类型问题。串行控制台可帮助您排查启动问题、网络配置和 SSH 配置问题。串行控制台无需网络连接即可连接到您的实例。您可以使用 Amazon EC2 控制台或 AWS CLI 来访问串行控制台。

在使用串行控制台之前,请在账户层面授予对串行控制台的访问权限。然后,创建 AWS Identity and Access Management(IAM)策略,授予对 IAM 用户的访问权限。此外,每个使用串行控制台的实例都必须至少包含一个基于密码的用户。如果您的实例无法访问,并且尚未配置对串行控制台的访问权限,请按照方法 2:使用救援实例中的说明进行操作。有关为 Linux 配置 EC2 串行控制台的信息,请参阅配置对 EC2 串行控制台的访问权限

方法 2:使用救援实例

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

  • 如果您的实例受实例存储支持或具有包含数据的实例存储卷,则在实例停止时数据将丢失。有关更多信息,请参阅确定实例的根设备类型
  • 如果您的实例是 Amazon EC2 Auto Scaling 组的一部分,则停止实例可能会终止实例。使用 Amazon EMR、AWS CloudFormation 或 AWS Elastic Beanstalk 启动的实例可能是 AWS Auto Scaling 组的一部分。在这种情况下,是否会发生实例终止取决于您的 Auto Scaling 组的实例缩减保护设置。如果您的实例是 Auto Scaling 组的一部分,则在开始执行解决步骤之前,暂时从 Auto Scaling 组中删除该实例
  • 停止和启动实例会更改实例的公共 IP 地址。在将外部流量路由到您的实例时,最佳做法是使用弹性 IP 地址,而不是公有 IP 地址。如果您使用 Amazon 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) 问题的更多信息,请参阅内存耗尽:终止进程