我想对我的 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
根据您的内存使用模式对问题进行故障排除
您的实例的交换使用率很高
完成以下步骤:
-
要减少交换次数,请运行以下命令:
sudo sysctl vm.swappiness=10
-
要清除交换,请运行以下命令:
# 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) 错误。
-
如果您的实例需要更多空间,请运行以下命令:
sudo dd if=/dev/zero of=/swapfile bs=1G count=8
存在系统范围的内存问题
完成以下步骤:
-
要检查 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
-
要监控您的实例的内存使用情况,请运行以下命令:
watch -n 1 free -m
-
要检查可用的内存页面,请运行以下命令:
cat /proc/buddyinfo
有关信息,请参阅 Amazon EC2 实例类型。
您的 Java 应用程序中存在内存泄漏
完成以下步骤:
- 要调整堆大小,请运行以下命令:
java -Xms2g -Xmx4g -jar application.jar
注意: 将 2g 和 4g 替换为应用程序的最小和最大堆大小。
- 要开启垃圾回收 (GC) 日志记录,请运行以下命令:
java -Xlog:gc*=debug:file=gc.log -jar application.jar
注意: 将 gc.log 替换为您的日志文件名和路径。
- 要使用 G1 垃圾回收器更好地管理您的实例内存,请运行以下命令:
java -XX:+UseG1GC -jar application.jar
注意: 将 -XX:+UseG1GC 替换为您的首选垃圾回收算法。
您的数据库服务器出现问题
完成以下步骤:
-
要监视特定的数据库服务器进程,请运行以下命令:
ps -eo pid,ppid,cmd,%mem,%cpu,rss,vsz | grep mysql
-
要检查 InnoDB 缓冲池的使用情况,请运行以下命令:
mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "Buffer pool"
-
要分析每个连接的内存使用情况,请运行以下命令:
mysql -e "SHOW VARIABLES LIKE '%buffer%';"
有关如何优化数据库服务器性能的信息,请参阅使用 MySQL 的最佳实践。
相关信息
使用 CloudWatch 代理收集指标、日志和跟踪信息