Ir para o conteúdo

Como soluciono problemas de alta utilização de memória na minha instância Linux do EC2?

5 minuto de leitura
0

Quero solucionar problemas de alto uso de memória na minha instância Linux do Amazon Elastic Compute Cloud (Amazon EC2).

Breve descrição

Quando as instâncias Linux do EC2 apresentam alta utilização de memória, isso pode levar à degradação ou bloqueio do desempenho do sistema. Esses problemas de desempenho geralmente ocorrem devido a vazamentos de memória, processos que consomem muitos recursos ou alocação insuficiente de memória. Para resolver esses problemas, primeiro use as ferramentas do sistema Linux para identificar a causa raiz do problema. Em seguida, siga as etapas de resolução para a causa do problema.

Resolução

Identificar a causa raiz do problema

Para identificar a causa do problema, identifique os padrões de uso de memória da sua instância do EC2. Para verificar o uso atual da memória, execute o seguinte comando:

free -h

Exemplo de saída:

      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 encontrar processos que consomem muita memória em sua instância Linux do EC2, execute o comando top:

top

Exemplo de saída:

    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 encontrar processos que consomem mais memória em sua instância, execute o seguinte comando:

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

Exemplo de saída:

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

A alta atividade de troca pode diminuir significativamente a velocidade do seu sistema. Para mais informações, consulte Habilitar o volume de troca do armazenamento de instâncias M1 e C1 do EC2.

Para verificar a atividade de troca, execute o seguinte comando:

vmstat 1 5

Exemplo de saída:

    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

Solucione seu problema com base em seus padrões de uso de memória

Sua instância tem uma alta taxa de uso de troca

Conclua as etapas a seguir:

  1. Para reduzir a troca, execute o seguinte comando:

    sudo sysctl vm.swappiness=10
  2. Para limpar a troca, execute o seguinte 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: se a memória física da instância não for suficiente para o comando swap, você poderá receber erros de falta de memória (OOM).

  3. Se sua instância precisar de mais espaço, execute o seguinte comando:

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

Há problemas de memória em todo o sistema

Conclua as etapas a seguir:

  1. Para verificar se há erros de OOM, execute os seguintes 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 monitorar o uso da memória em sua instância, execute o seguinte comando:

    watch -n 1 free -m
  3. Para verificar as páginas de memória disponíveis, execute o seguinte comando:

    cat /proc/buddyinfo

Para obter mais informações, consulte Tipos de instância do Amazon EC2.

Há vazamentos de memória nas aplicações Java

Conclua as etapas a seguir:

  1. Para ajustar o tamanho da pilha, execute o seguinte comando:
    java -Xms2g -Xmx4g -jar application.jar
    Observação: substitua 2g e 4g pelos tamanhos mínimo e máximo de pilha da sua aplicação.
  2. Para ativar o registro em log de coleta de resíduos (GC), execute o seguinte comando:
    java -Xlog:gc*=debug:file=gc.log -jar application.jar
    Observação: substitua gc.log pelo nome e caminho do arquivo de log.
  3. Para usar o coletor de resíduos G1 para gerenciar melhor a memória da sua instância, execute o seguinte comando:
    java -XX:+UseG1GC -jar application.jar
    Observação: substitua -XX:+UseG1GC pelo seu algoritmo de coleta de resíduos preferido.

Há problemas com os servidores do banco de dados

Conclua as etapas a seguir:

  1. Para monitorar processos específicos do servidor de banco de dados, execute o seguinte comando:

    ps -eo pid,ppid,cmd,%mem,%cpu,rss,vsz | grep mysql
  2. Para verificar o uso do pool de buffer do InnoDB, execute o seguinte comando:

    mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "Buffer pool"
  3. Para analisar o uso da memória para cada conexão, execute o seguinte comando:

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

Para obter mais informações sobre como otimizar o desempenho do servidor de banco de dados, consulte Práticas recomendadas para trabalhar com o MySQL.

Informações relacionadas

Coletar métricas, logs e rastreamentos com o atendente do CloudWatch

AWS OFICIALAtualizada há um ano