如何因资源过度使用而未通过状态检查的 EC2 Linux 实例进行故障排除?

2 分钟阅读
0

我的 Amazon Elastic Compute Cloud(Amazon EC2)Linux 实例由于资源过度使用而未通过实例状态检查。

简短描述

以下是运行状况检查可能会因资源过度使用而失败的三个最常见原因:

  • 您的实例的 CPU 利用率接近 100%,并且该实例的剩余计算容量不足以让内核运行。
  • 根设备 100% 已满,正在阻止其他进程完成或启动。
  • 在实例上运行的进程使用了其所有内存,从而阻止了内核运行。

解决方法

停止并启动实例

警告:

  • 当停止实例时,存储在实例存储卷中的数据会丢失。在停止实例之前,请务必保存数据备份。与 EBS 支持的卷不同,实例存储卷是临时性的,不支持数据持久化。有关详细信息,请参阅停止实例时发生的情况
  • 实例上的停止和启动操作会强制内核停止任何正在运行的进程。这是将资源返回给操作系统的临时解决方案。如果您没有消除问题的根本原因,则过度使用仍然存在。
  • Amazon EC2 在启动或开始时自动分配给实例的静态公有 IPv4 地址在停止和开始后会发生变化。要保留公有 IPv4 地址,让其在停止实例后不会发生变化,请使用弹性 IP 地址

有关详细信息,请参阅停止并启动实例

查看 Amazon CloudWatch CPU 利用率指标

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

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

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

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

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

设备上没有剩余空间错误

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

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

方法 1: 使用适用于 Linux 实例的 EC2 Serial Console

如果您启用了适用于 Linux 实例的 EC2 Serial Console,则可以使用它对支持的基于 Nitro 的实例类型和裸机实例进行故障排除。串行控制台可帮助您解决启动问题、网络配置和 SSH 配置问题。串行控制台无需有效的网络连接,即可连接到您的实例。您可以使用 Amazon EC2 控制台或 AWS CLI 访问串行控制台。

如果您之前未使用过 EC2 Serial Console,确保在尝试连接之前查看先决条件配置访问权限。如果您的实例无法访问,并且您尚未配置对串行控制台的访问权限,请按照方法 2: 使用救援实例中的说明进行操作。有关配置 EC2 Serial Console 的信息,请参阅配置对 EC2 Serial Console 的访问权限

方法 2: 使用救援实例

**警告:**以下过程需要停止实例。当停止实例时,存储在实例存储卷中的数据会丢失。在停止实例之前,请务必保存数据备份。与 EBS 支持的卷不同,实例存储卷是临时性的,不支持数据持久化。有关详细信息,请参阅停止实例时发生的情况

1.    在您的虚拟私有云(VPC)中启动新的 EC2 实例。使用与受损实例相同的亚马逊机器镜像(AMI)和可用区。此新实例将成为您的救援实例。

或者,使用您可以访问的现有实例。现有实例必须使用相同的 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 命令查看可用磁盘设备及其挂载点,以确定正确的设备名称。

**注意:**您可能会收到如下错误消息:

“...错误的 fs 类型、错误的选项、/dev/nvme2n1 上错误的超级块、缺少代码页或帮助程序或其他错误。”

上述错误是由与 XFS 文件系统的 UUID 冲突引起的。如果您收到此错误,请参阅为什么我无法挂载我的 Amazon EBS 卷?

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

du -shcm /rescue/var/lib/* |sort -n

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

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

$ sudo umount /rescue

如果卸载操作不成功,则可能需要停止或重启救援实例才能完全卸载。

11.    将辅助卷(/dev/sdf)与救援实例分离。然后,将其作为 /dev/xvda(根卷)挂载到原始实例。

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

您可以使用以下步骤调整根 EBS 卷的大小:

1.    请求修改 EBS 卷大小

2.    使用救援实例调整卷大小后扩展 Linux 文件系统

内存不足错误

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

有关如何解决**内存不足(OOM)**问题的详细信息,请参阅内存不足:终止进程

要检查内存错误日志(内存不足),请执行方法 2.使用救援实例至第 7 步“装载卷”中的步骤。

然后,使用以下命令在日志中搜索内存不足警报(具体取决于您的 Linux 发行版):

Amazon Linux 1 和 Amazon Linux 2

sudo grep -i -r 'out of memory' /var/log/

Amazon Linux 2023

$ sudo journalctl -p err | grep -i "out of memory"

-或-

$ sudo dmesg | grep -i "out of memory"

有关如何解决**内存不足(OOM)**问题的详细信息,请参阅内存不足:终止进程

页面分配失败

当内核内存分配器分配请求失败时,就会出现页面分配失败。发生这种情况时,会向系统日志中添加一则页面分配失败消息。

要排除并解决此内存不足问题,请考虑将实例升级到更大的实例类型。或者,对于使用临时实例存储卷的实例,请向实例添加交换存储以缓解内存压力。

有关设置交换空间的详细信息,请参阅以下内容:

**注意:**当 RAM 量已满时,实例会使用交换空间。您可以将交换空间用于 RAM 量较少的实例,但不能替代 RAM 较多的实例。由于交换空间位于实例的硬盘上,因此与实际 RAM 相比,性能较慢。要获得更多或更快的内存,请考虑增加您的实例大小。

有关页面分配失败的详细信息,请参阅 Red Hat 网站上的什么是页面分配失败

相关信息

为什么我的 EC2 Linux 实例无法访问并且其状态检查失败?

在更改我的 EC2 Linux 实例的实例类型之前,我需要采取哪些操作?

如何诊断 EC2 Windows 实例上 CPU 利用率高的问题?

AWS 官方
AWS 官方已更新 10 个月前