为什么我的 EC2 Linux 实例无法访问,并且一项或多项状态检查失败?

上次更新日期:2021 年 9 月 8 日

我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例无法访问,且有一项或多项状态检查失败。如何排查状态检查失败问题?

简短描述

Amazon EC2 使用两种状态检查监控每个 EC2 实例的运行状况:

系统状态检查

系统状态检查用于检测运行您的实例的底层主机是否存在问题。如果底层主机因网络、硬件或软件问题而没有响应或无法访问,则此状态检查将失败。

实例状态检查

实例状态检查失败表明无法访问实例。导致此问题的原因是出现操作系统级别的错误,如下所示:

  • 未能启动操作系统
  • 未能正确挂载卷
  • CPU 和内存耗尽
  • 内核崩溃

警告:以下某些解决方案要求先停止,然后再启动实例。在停止并启动实例之前,请注意以下事项:

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

有关更多信息,请参阅停止和启动实例 – 概览

解决方法

1.    通过查看实例状态检查指标,确定实例状态检查或系统状态检查是否失败。

2.    如果系统状态检查失败,请参阅我的实例的系统状态检查失败。如何排查此问题?

如果实例状态检查失败,请查看实例的系统日志以确定失败的原因。根据在系统日志中找到的数据,使用以下某项解决方案:

未能启动操作系统

未能正确挂载卷

由于挂载点无法正确挂载,实例状态检查可能会失败,如以下示例所示:

[FAILED] Failed to mount /
See 'systemctl status mnt-nvme0n1p1.mount' for details.
[DEPEND] Dependency failed for Local File Systems.

CPU 和内存耗尽

CPU 利用率高

如果 CPU 利用率指标等于或接近 100%,实例可能不具有足够的计算容量供内核运行。

对于 T2 或 T3 实例,请检查 CloudWatch 指标表中的 CPU 积分指标以确定 CPU 积分是否等于或接近零。如果 CPU 积分为零,则 CPU 利用率指标在实例的基线性能处显示饱和稳定状态。基准性能可能是 20%、40% 等等,具体取决于实例类型。

指示 CPU 利用率等于或接近 100%,或者对于 T2 或 T3 实例指示其处于饱和平稳状态的 CloudWatch 指标表示状态检查因实例资源的过度利用而失败。有关如何排查此问题的说明,请参阅由于资源的过度利用,我的 EC2 Linux 实例的实例状态检查失败。如何排查此问题?

块储存设备错误、软件错误或内核崩溃可能会导致不寻常的 CPU 使用突增。如果 CPU 利用率指标为 100%,且系统日志中包含与块储存设备相关的错误、内存问题或其他不寻常的系统错误,请重启实例或停止并启动实例。

内存不足

高内存压力可能会导致实例状态检查失败。在以下示例中,操作系统内存不足并停止消耗内存最多的进程。

[115879.769795] Out of memory: kill process 20273 (httpd) score 1285879 or a child
[115879.769795] Killed process 1917 (php-cgi) vsz:467184kB, anon-rss:101196kB, file-rss:204kB

默认情况下,不会将 EC2 内存和磁盘指标发送到 CloudWatch。但是,您可以使用 CloudWatch 代理将其他指标发送到 CloudWatch 以进行监控

要排查并解决内存不足问题,请考虑将实例升级到更大的实例类型。或者,向实例添加交换存储空间以减轻内存压力。有关更多信息,请参阅以下内容:

磁盘已满错误

如果系统日志中包含磁盘已满错误,说明实例可能已经因为根设备已满而进入紧急模式。

$: service apache2 restart
Error: No space left on device

$: /etc/init.d/mysql restart
[....] Restarting mysql (via systemctl): mysql.serviceError: No space left on device
        
        
root@example:~# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       7.7G  7.7G     0 100% /

内核崩溃

如果在操作过程中内核检测到致命的内部错误,会发生内核崩溃错误。如果在操作系统启动期间发生错误,那么内核可能无法正确加载。这可能会导致操作系统启动失败。以下是内核崩溃错误消息的示例:

Linux version
2.6.16-xenU (builder@xenbat.amazonsa) (gcc version 4.0.1 20050727 (Red Hat4.0.1-5)) #1 SMP Mon May 28 03:41:49 SAST 2007
Kernel command
line:  root=/dev/sda1 ro 4
Registering block device major 8
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(8,1)