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:
-
Para reduzir a troca, execute o seguinte comando:
sudo sysctl vm.swappiness=10
-
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).
-
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:
-
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
-
Para monitorar o uso da memória em sua instância, execute o seguinte comando:
watch -n 1 free -m
-
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:
- 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.
- 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.
- 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:
-
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
-
Para verificar o uso do pool de buffer do InnoDB, execute o seguinte comando:
mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "Buffer pool"
-
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