跳至内容

如何对我的 EC2 Linux 实例中的高内存使用率问题进行故障排除?

3 分钟阅读
0

我想对我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例中的高内存使用率问题进行故障排除。

简短描述

当 EC2 Linux 实例的内存利用率较高时,可能会导致系统性能下降或死机。这些性能问题通常是由于内存泄漏、资源密集型进程或内存分配不足而导致的。要解决这些问题,首先使用 Linux 系统工具来确定问题的根本原因。然后,按照故障排除步骤找出问题原因。

解决方法

确定问题的根本原因

要确定问题的原因,请确定您的 EC2 实例的内存使用模式。要检查当前的内存使用情况,请运行以下命令:

free -h

输出示例:

      total       used        free        shared      buff/cache   available
Mem:  15Gi        7.2Gi       2.1Gi       1.2Gi       5.7Gi        6.3Gi
Swap: 8Gi         6.5Gi       1.5Gi

要在您的 EC2 Linux 实例上查找内存密集型进程,请运行 top 命令:

top

输出示例:

    top - 14:23:45 up 15 days, 3:42, 1 user, load average: 2.15, 1.98, 1.75
Tasks: 256 total,   2 running, 254 sleeping,   0 stopped,   0 zombie
%Cpu(s): 24.8 us, 12.3 sy,  0.0 ni, 62.1 id,  0.8 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  32768.0 total,   2453.2 free,  24156.4 used,   6158.4 buff/cache
MiB Swap:   4096.0 total,   3012.5 free,   1083.5 used.   2537.2 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  1234 mysql     20   0   18.2g  15.1g   5.1g S  45.0  47.2   220:31 mysqld
  5678 tomcat    20   0   12.8g  11.2g   124m S  85.2  70.1   445:22 java

要查找在您的实例中消耗最多内存的进程,请运行以下命令:

ps aux --sort=-%mem | head -n 5

输出示例:

USER   PID   %CPU %MEM  VSZ    RSS   TTY  STAT  START TIME    COMMAND
mysql  1234  45.0 47.2  18.2g  15.1g ?    Ssl   Jan10 220:31  mysqldjava
       5678  85.2 70.1  12.8g  11.2g ?    Ssl   Jan12 445:22  javaapache
       9012  25.3 23.8  4.2g   3.8g  ?    Ss    Jan12 178:44  httpd

高交换活动会显著降低系统速度。有关详细信息,请参阅为 M1 和 C1 EC2 实例启用实例存储交换卷

要检查交换活动,请运行以下命令:

vmstat 1 5

输出示例:

    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0 6650880  2150012 189408 5678024 45  67   234   567 300 450 65 15 10 10  0

根据您的内存使用模式对问题进行故障排除

您的实例的交换使用率很高

完成以下步骤:

  1. 要减少交换次数,请运行以下命令:

    sudo sysctl vm.swappiness=10
  2. 要清除交换,请运行以下命令:

    # Find processes using most swap
    $ smem -s swap -r
    
    # For specific process, check its swap usage
    $ grep VmSwap /proc/[PID]/status
    
    # Restart specific high-swap-usage processes during low-traffic periods
    $ systemctl restart [service-name]
    
    # Use Extreme caution when running this command - can cause OOM kills if physical memory is insufficient:
    $ sudo swapoff -a && sudo swapon -a

    重要事项: 如果实例的物理内存不足以执行 swap 命令,则可能会出现内存不足 (OOM) 错误。

  3. 如果您的实例需要更多空间,请运行以下命令:

    sudo dd if=/dev/zero of=/swapfile bs=1G count=8

存在系统范围的内存问题

完成以下步骤:

  1. 要检查 OOM 错误,请运行以下命令:

    sudo grep -i 'out of memory' /var/log/syslog
    sudo dmesg | grep -i 'out of memory'
    sudo journalctl -k | grep -i 'oom'
    sudo grep -i 'killed process' /var/log/messages
  2. 要监控您的实例的内存使用情况,请运行以下命令:

    watch -n 1 free -m
  3. 要检查可用的内存页面,请运行以下命令:

    cat /proc/buddyinfo

有关信息,请参阅 Amazon EC2 实例类型

您的 Java 应用程序中存在内存泄漏

完成以下步骤:

  1. 要调整堆大小,请运行以下命令:
    java -Xms2g -Xmx4g -jar application.jar
    注意:2g4g 替换为应用程序的最小和最大堆大小。
  2. 要开启垃圾回收 (GC) 日志记录,请运行以下命令:
    java -Xlog:gc*=debug:file=gc.log -jar application.jar
    注意:gc.log 替换为您的日志文件名和路径。
  3. 要使用 G1 垃圾回收器更好地管理您的实例内存,请运行以下命令:
    java -XX:+UseG1GC -jar application.jar
    注意:-XX:+UseG1GC 替换为您的首选垃圾回收算法。

您的数据库服务器出现问题

完成以下步骤:

  1. 要监视特定的数据库服务器进程,请运行以下命令:

    ps -eo pid,ppid,cmd,%mem,%cpu,rss,vsz | grep mysql
  2. 要检查 InnoDB 缓冲池的使用情况,请运行以下命令:

    mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "Buffer pool"
  3. 要分析每个连接的内存使用情况,请运行以下命令:

    mysql -e "SHOW VARIABLES LIKE '%buffer%';"

有关如何优化数据库服务器性能的信息,请参阅使用 MySQL 的最佳实践

相关信息

使用 CloudWatch 代理收集指标、日志和跟踪信息

AWS 官方已更新 1 年前