为什么我的 EC2 Linux 实例由于资源过度使用而变得无响应?

2 分钟阅读
0

由于资源过度使用,我的 Amazon Elastic Compute Cloud(Amazon EC2)Linux 实例变得无响应。怎样才能防止出现这种情况?

简短描述

实例无响应有多个常见原因:

  • **内存:**默认情况下,EC2 实例不会分配交换空间。内存不足会调用 Linux 内存不足(OOM)管理器。OOM 管理器会终止进程,例如数据库、Web 服务器或 SSH 服务。
  • **网络:**若没有网络,您的系统将无法回复来自状态检查的 ARP 请求。出现这种情况时,您的实例将无法与其他主机通信。
  • **I/O 操作:**若没有磁盘 I/O,读取或写入指令会卡住。例如,创建临时文件、从系统库或数据库读取。
  • **CPU:**前面的所有任务都需要 CPU 时间才能正常运行。CPU 利用率长时间处于 100% 会使内核无法执行正常的操作系统操作。

这些问题还可能会累积成滚雪球效应。例如,您的内存不足,因此 OOM 管理器终止了一个重要的进程。现在,依赖于第一个已停止的进程的第二个进程将启动更多的 CPU 周期。如果此任务与磁盘相关,则此周期还可能会耗尽 Amazon Elastic Block Store(Amazon EBS)卷。此外,问题可能会转移到其他需要与无响应实例通信的实例。

解决方法

如果您系统的 CPU 利用率较高,或者经常由于资源过度使用而无响应,请执行以下操作:

收集信息

使用 Amazon CloudWatch 监控 CPU 利用率

使用诸如 Amazon CloudWatch 之类的监控工具来观察高资源利用率的趋势和模式

使用系统监控工具

如果您有多个服务,但不确定哪个服务在过度使用资源,则安装诸如 atop 之类的实用程序。您也可以使用诸如 htoptopsar 之类的工具。所有这些工具都有助于标识利用 CPU 最多的进程。有关详细信息,请参阅以下内容:

获取有关 CPU 利用率高的进程的更多信息

使用 pidstatps 命令获取有关进程的更多详细信息。命令输出中提供的信息可帮助您确定进程是系统进程还是用户进程。有关如何配置和使用运行这些命令所需的工具的详细信息,请参阅以下内容:

检查系统日志

检查与高 CPU 利用率相关的错误或警告。例如,使用 dmesg 命令查看内核消息,并查看 /var/log/syslog/var/log/messages 文件中的系统消息。命令输出和日志文件内容有助于确定导致问题的系统或应用程序问题。

查看命令历史记录

查看命令的历史记录,了解是否存在人为错误。命令历史记录通常位于 ~/.bash_history 文件中。

检查是否有计划作业

检查 EC2 实例上是否有任何计划作业或 cron 作业正在运行,这可能会导致高 CPU 利用率。首先,确认高 CPU 利用率的时间戳。然后运行以下命令列出 cron 作业:

sudo crontab -l
sudo cat /etc/crontab
sudo cat crontab -l -u <username>

前面的命令列出了根用户的 crontab 配置。在命令中包含 -u 选项,用于检查特定用户的 cron。然后,查找您发现问题的时间。检查您的日志,包括以下内容:

/var/log/messages
/var/log/syslog
/var/log/dmesg
/var/log/cron.log

使用 grep 命令筛选要调查的特定 cron 作业的相关条目。确认是否发生了与标识的 cron 相关的错误。

检查内存利用率

由于交换空间利用率,高内存利用率可能会导致高 CPU 利用率。使用 free 命令检查内存利用率。有关如何配置和使用必要工具的详细信息,请参阅 redhat.com 网站上的 解析 free 命令

检查网络流量

高网络流量可能会导致高 CPU 利用率,尤其是在实例正在处理大量网络请求时。使用 iftop 命令监控网络流量,必要时考虑优化网络配置或升级实例类型。有关如何配置和使用必要工具的详细信息,请参阅 redhat.com 网站上的使用 iftop 按需进行 Linux 接口分析

检查磁盘 I/O

高磁盘 I/O 可能会导致高 CPU 利用率。使用 iostat 命令监控磁盘 I/O,并标识任何可能导致高 I/O 的进程。有关详细信息,请参阅 redhat.com 网站上的 ](https://www.redhat.com/sysadmin/io-reporting-linux)Linux 命令行中的 I/O 报告[。

根据获得的数据采取措施

优化代码

如果您的应用程序导致高 CPU 利用率,则优化您的代码。为此,确定并消除性能瓶颈。诸如 perfstrace 之类的分析工具有助于识别有问题的代码。有关如何配置和使用必要工具的详细信息,请参阅以下内容:

升级您的实例

如果您的进程出于有效理由(例如大量用户)使用大量资源,则可以考虑升级您的实例

AWS Compute Optimizer 可以帮助您决定要使用的适当实例类型和大小。您也可以考虑使用 Amazon EC2 Auto Scaling 进行横向扩展。

配置 Linux 审计规则

如果您想进一步了解用户命令和配置更改,则可以配置 Linux Audit 系统来跟踪更改

防止将来过度利用

  1. 在生产中部署新应用程序之前,创建测试环境和基准,以确定必要的计算、内存、EBS 和网络。根据您的基准进行部署,同时构建容错能力。有关详细信息,请参阅以下内容: 
    在分布式系统中设计交互以防止故障
    教程: 设置经过扩展和负载均衡的应用程序
  2. 确保在实例上运行的应用程序已优化性能。优化包括调整配置文件、优化数据库查询或优化代码。
  3. 如果您的应用程序频繁使用数据库,则考虑实施缓存,以减少对数据库的查询次数。
  4. 确保您的软件已安装最新的安全补丁和错误修复。过时的软件可能会导致出现性能问题和漏洞,从而导致高 CPU 利用率。
  5. 如果您的应用程序接收高流量,则考虑使用负载均衡器在多个 EC2 实例之间分配流量。负载均衡器会降低任一个实例上的 CPU 利用率。
  6. 继续监控您的实例,并为特定的资源利用率阈值创建警报
AWS 官方
AWS 官方已更新 10 个月前