Saltar al contenido

¿Cómo soluciono los problemas de uso excesivo de memoria en mi instancia de EC2 de Linux?

5 minutos de lectura
0

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:

  1. Para reducir la capacidad de intercambio, ejecuta el siguiente comando:

    sudo sysctl vm.swappiness=10
  2. 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).

  3. 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:

  1. 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
  2. Para supervisar el uso de memoria de la instancia, ejecuta el siguiente comando:

    watch -n 1 free -m
  3. 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:

  1. 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.
  2. 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.
  3. 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:

  1. 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
  2. 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"
  3. 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

OFICIAL DE AWSActualizada hace un año