Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
如何对因资源过度使用而未通过状态检查的 EC2 Linux 实例进行故障排除?
我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例因可用资源不足而未通过实例状态检查。
简短描述
您的实例可能由于资源使用而无法通过状态运行状况检查,原因如下:
- 实例的 CPU 利用率接近 100%,且该实例的剩余计算容量不足以让内核运行。
- 根设备已满 (100%),导致其他进程无法完成或启动。
- 实例上运行的进程耗尽了所有内存,导致内核无法运行。
解决方法
**重要事项:**在停止并启动实例之前,请执行以下操作。
- 创建您的 Amazon Elastic Block Store (Amazon EBS) 卷的快照。
**注意:**如果您的实例由实例存储支持,或者具有包含数据的实例存储卷,则 Amazon EC2 会在实例停止时删除这些数据。 - 暂时将该实例从其 Amazon EC2 Auto Scaling 组中移除。
**注意:**如果您停止 Amazon EC2 Auto Scaling 组中的实例,则可以根据缩容保护设置终止该实例。使用 Amazon EMR、AWS CloudFormation 或 AWS Elastic Beanstalk 启动的实例可能位于 Auto Scaling 组中。 - 将实例关闭行为设置为 Stop(停止),以确保实例在您停止时不会终止。
停止并启动您的实例,以强制内核停止正在运行的进程。这是将资源返回给操作系统 (OS) 的临时解决方案。要解决过度使用问题,请执行以下操作以解决根本原因。
**注意:**当停止或启动某个实例时,该实例的公共 IP 地址将发生变化。最佳做法是使用弹性 IP 地址而不是公共 IP 地址将外部流量路由到您的实例。
检查实例的 CloudWatch CPU 指标
检查实例的 Amazon CloudWatch CPUUtilization 指标是否等于或接近 100%。如果是,请重启您的实例以使实例恢复正常状态。如果重启后问题仍然出现,则表明该实例的 CPU 需求量高于您的实例类型所提供的 CPU 量。
要解决此问题,请将您的实例类型更改为 CPU 可用性更高的实例类型。
如果您的实例是可突增性能实例(例如 T2、T3 或 T3a),请检查其 CPUCreditBalance 指标。如果积分余额接近零,则 Amazon EC2 会限制实例 CPU。如果您将实例的 Credit specification(积分规范)设置为 Standard(标准),请将该规范更改为 Unlimited(无限制)。
检查实例的系统日志中是否有错误
检查系统日志中是否有 "No space left on device" 或 "Out of memory" 错误。
对 "No space left on device" 错误进行故障排除
如果包含所列文件夹的文件系统已满,则您会收到类似于以下示例的错误:
"OSError: [Error 28] No space left on device '/var/lib/'"
在上述示例中,/var/lib 已满。
要释放空间,请使用 EC2 Serial Console 连接到受支持的基于 Nitro 的实例类型和受支持的裸机实例。然后,删除不需要的文件。使用 EC2 Serial Console 时,无需有效的连接即可连接到您的实例。
如果您之前没有使用过 EC2 Serial Console,请确保遵循先决条件。如果您的实例无法访问并且您尚未配置对串行控制台的访问权限,则无法使用 EC2 Serial Console。
如果您无法使用 EC2 Serial Console,请完成以下步骤,以启动救援实例并删除不需要的文件:
-
在您的虚拟私有云 (VPC) 中启动新的救援实例。使用与状态检查失败的实例相同的亚马逊机器映像 (AMI) 和可用区。
**注意:**您也可以使用与原始实例位于同一可用区并使用相同的 AMI 的现有实例。 -
从原始实例中分离 Amazon Elastic Block Store (Amazon EBS) 根卷,例如 /dev/xvda 或 /dev/sda1。记下根卷的设备名称。
-
将卷作为辅助设备 (/dev/sdf) 附加到救援实例。
-
要为您附加到救援实例的卷创建挂载点目录,请运行以下命令:
sudo mkdir /rescue**注意:**请将 /rescue 替换为您的挂载点目录名称。
-
以根用户身份运行以下命令,以识别正确的设备名称:
sudo -i # lsblk**注意:**附加到救援实例的设备可能有不同的设备名称。
-
要将卷挂载到新目录,请运行以下命令:
sudo mount /dev/xvdf1 /rescue**注意:**请将 dev/xvdf1 替换为根卷的设备名称,并将 /rescue 替换为您的挂载点目录名称。如果您在运行上述命令时收到错误,请参阅为什么我无法挂载我的 Amazon EBS 卷?
-
要识别占用空间最多的文件,请运行以下命令:
du -shcm /rescue/var/lib/* |sort -n -
要释放空间,请删除不需要的大文件。
-
要从救援实例中卸载辅助设备,请运行以下命令:
sudo umount /rescue
**注意:**请将 /rescue 替换为您的挂载点目录名称。
如果卸载操作失败,请停止或重启救援实例。然后,重新运行上述命令。
从救援实例中分离辅助卷。
将该卷作为 /dev/xvda 或 /dev/sda1 根卷附加到原始实例。
启动实例,然后验证该实例是否响应。
如果可用存储空间仍然不足,请完成以下步骤以调整 EBS 根卷的大小:
- 请求修改 EBS 卷大小。
- 按照上述部分中的步骤 1-8 启动救援实例。
- 扩展 Linux 文件系统。
对 "Out of memory" 错误进行故障排除
如果您的实例内存不足,则您会收到以下错误:
"Out of memory: kill process"
当实例内存不足时,内核没有足够的内存来运行,Amazon EC2 会结束其他进程以释放内存。有关故障排除步骤,请参阅内存不足:终止进程。
要检查内存日志,请按照上述部分中的步骤 1-8 启动救援实例。然后,根据您的 Linux 发行版运行以下命令,在日志中搜索 "out of memory" 消息:
Amazon Linux 2 (AL2):
sudo grep -i -r 'out of memory' /var/log/
Amazon Linux 2023 (AL2023):
sudo journalctl -p err | grep -i "out of memory"
-or-
sudo dmesg | grep -i "out of memory"
对 "page allocation failure" 进行故障排除
当内核内存分配器分配请求失败时,您会收到 "page allocation failure" 错误。
要解决此问题,最佳做法是将实例升级到更大的实例类型。或者,对于使用临时实例存储卷的实例,请使用交换文件或硬盘分区向实例添加交换存储,以缓解内存压力。
**注意:**当 RAM 已满时,实例会使用交换空间。对于 RAM 较小的实例,您可以使用交换空间。但是,交换空间不能替代更多的 RAM。由于交换空间位于实例的硬盘上,因此与 RAM 相比,性能较慢。要获得更多或更快的内存,必须增加实例大小。
使用 atop 调查并预防资源问题
使用 atop 监控工具识别可能引发问题的资源使用模式和进程,以免其导致系统故障。atop 工具可帮助您持续监控系统并排查系统问题。
**注意:**atop 工具仅在安装后才会记录数据。您无法检索安装 atop 工具之前的历史性能数据。
使用 atop 工具检查以下资源:
- 查看 /var/log/atop/ 中的历史数据,以分析故障发生时的系统和进程。
- 查找消耗大量资源的进程。
- 检查导致故障的内存、CPU 和磁盘使用模式。
