Quiero solucionar problemas de uso excesivo de memoria en mi instancia de Linux de Amazon Elastic Compute Cloud (Amazon EC2).
Descripción corta
Cuando las instancias de EC2 de Linux utilizan mucho la memoria, esto puede provocar una degradación del rendimiento del sistema o un bloqueo. Estos problemas de rendimiento suelen producirse debido a pérdidas de memoria, procesos que consumen muchos recursos o una asignación de memoria insuficiente. Para resolver estos problemas, utiliza primero las herramientas del sistema Linux para identificar la causa raíz del problema. A continuación, sigue los pasos de solución de problemas para determinar la causa del problema.
Resolución
Identificación de la causa principal del problema
Para identificar la causa del problema, identifica los patrones de uso de memoria de la instancia de EC2. Para comprobar el uso actual de la memoria, ejecuta el siguiente comando:
free -h
Resultado de ejemplo:
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
Para buscar procesos con uso intensivo de memoria en tu instancia de EC2 de Linux, ejecuta el comando top:
top
Resultado de ejemplo:
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
Para buscar los procesos que consumen la mayor cantidad de memoria de la instancia, ejecuta el siguiente comando:
ps aux --sort=-%mem | head -n 5
Resultado de ejemplo:
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
Una alta actividad de intercambio puede ralentizar considerablemente el sistema. Para obtener más información, consulta Habilitación del volumen de intercambio del almacén de instancias para las instancias M1 y C1 de EC2.
Para comprobar la actividad de intercambio, ejecuta el siguiente comando:
vmstat 1 5
Resultado de ejemplo:
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
Solución del problema en función de los patrones de uso de la memoria
La instancia tiene una tasa de uso de intercambio alta
Sigue estos pasos:
-
Para reducir la capacidad de intercambio, ejecuta el siguiente comando:
sudo sysctl vm.swappiness=10
-
Para borrar el intercambio, ejecuta el siguiente comando:
# 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
Importante: Si la memoria física de la instancia no es suficiente para el comando swap, es posible que se produzcan errores de falta de memoria (OOM).
-
Si la instancia necesita más espacio, ejecuta el siguiente comando:
sudo dd if=/dev/zero of=/swapfile bs=1G count=8
Hay problemas de memoria en todo el sistema
Sigue estos pasos:
-
Para comprobar si hay errores de OOM, ejecuta los siguientes comandos:
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
-
Para supervisar el uso de memoria de la instancia, ejecuta el siguiente comando:
watch -n 1 free -m
-
Para comprobar las páginas de memoria disponibles, ejecuta el siguiente comando:
cat /proc/buddyinfo
Para obtener más información, consulta Tipos de instancias de Amazon EC2.
Hay pérdidas de memoria en las aplicaciones Java
Sigue estos pasos:
- Para ajustar el tamaño del montón, ejecuta el siguiente comando:
java -Xms2g -Xmx4g -jar application.jar
Nota: Sustituye 2g and 4g por los tamaños de montón mínimo y máximo para tu aplicación.
- Para activar el registro de recopilación de elementos no utilizados (GC), ejecuta el siguiente comando:
java -Xlog:gc*=debug:file=gc.log -jar application.jar
Nota: Sustituye gc.log por el nombre y la ruta del archivo de registro.
- Para usar el recopilador de elementos no utilizados G1 para administrar mejor la memoria de la instancia, ejecuta el siguiente comando:
java -XX:+UseG1GC -jar application.jar
Nota: Sustituye -XX:+UseG1GC por el algoritmo de recopilación de elementos no utilizados que prefieras.
Hay problemas con los servidores de bases de datos
Sigue estos pasos:
-
Para supervisar procesos específicos del servidor de bases de datos, ejecuta el siguiente comando:
ps -eo pid,ppid,cmd,%mem,%cpu,rss,vsz | grep mysql
-
Para comprobar el uso del grupo de búferes de InnoDB, ejecuta el siguiente comando:
mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "Buffer pool"
-
Para analizar el uso de memoria de cada conexión, ejecuta el siguiente comando:
mysql -e "SHOW VARIABLES LIKE '%buffer%';"
Para obtener información sobre cómo optimizar el rendimiento del servidor de bases de datos, consulta Prácticas recomendadas para trabajar con MySQL.
Información relacionada
Recopilación de métricas, registros y seguimientos con el agente de CloudWatch