Por que minha instância de banco de dados do Amazon RDS usa memória swap quando tenho memória suficiente?
Estou executando uma instância de banco de dados do Amazon Relational Database Service (Amazon RDS). A instância usa grandes quantidades de memória swap, embora eu tenha memória livre suficiente alocada. Quero solucionar esse problema.
Breve descrição
As instâncias do Amazon Elastic Compute Cloud (Amazon EC2) que executam Linux utilizam memória swap quando um sistema exige mais memória do que a alocada. Para obter mais informações, consulte Habilitar volume de troca do armazenamento de instância para instâncias M1 e C1 do EC2. Como a maioria das instâncias de banco de dados do RDS usa Linux (exceto o SQL Server), seu banco de dados pode usar memória swap.
As instâncias de banco de dados do RDS só exigem páginas na RAM quando as páginas são acessadas no momento, como ao executar consultas. Outras páginas que são trazidas para a RAM por meio de consultas executadas anteriormente são descarregadas para o espaço de troca se não estiverem em uso. É uma prática recomendada permitir que o sistema operacional (SO) faça swap de páginas antigas em vez de forçá-lo a manter as páginas na memória. Isso garante que haja RAM livre suficiente disponível para consultas futuras.
O uso de swap do Linux não é limpo com frequência porque limpar o uso de swap exige uma sobrecarga extra para realocar o swap quando necessário e ao recarregar páginas. Como resultado, se o espaço de troca for usado em sua instância de banco de dados do RDS, mesmo que uma única vez, as métricas SwapUsage não retornarão a zero. A memória swap também pode ser utilizada ao usar HugePages que são compatíveis com o Amazon RDS para Oracle e HugePages no Amazon RDS para PostgreSQL. As HugePages são maiores do que o tamanho padrão do Linux de dois megabytes.
Resolução
Para entender o comportamento de uso de swap em sua instância de banco de dados do RDS, primeiro verifique as métricas de desempenho do banco de dados com base no workload da aplicação. Consulte as métricas FreeableMemory e SwapUsage do Amazon CloudWatch para entender o padrão geral de uso de memória da sua instância de banco de dados do RDS. Verifique se há uma diminuição na métrica FreeableMemory que ocorre ao mesmo tempo que um aumento na métrica SwapUsage. Isso pode indicar que há pressão na memória da instância de banco de dados do RDS. Para obter mais informações, consulte Como posso solucionar problemas de pouca memória livre em um banco de dados do Amazon RDS para MySQL?
Se houver memória liberável suficiente disponível, o uso de swap não deve afetar o desempenho da instância de banco de dados do RDS. Se a memória liberável for consistentemente baixa, altere a classe da sua instância de banco de dados do RDS para uma classe de instância maior que tenha mais memória.
Para monitorar a memória swap, ative o Monitoramento aprimorado para analisar as métricas em intervalos de apenas um segundo. O Monitoramento aprimorado coleta estatísticas no nível do host, e o CloudWatch coleta dados do nível do hipervisor a cada 60 segundos. O Monitoramento aprimorado identifica aumentos ou reduções que ocorrem por apenas um segundo e indica a CPU e a memória usadas por processos individuais. Para obter mais informações, consulte Visualizar métricas do SO usando CloudWatch Logs.
Também é possível ativar o Insights de Performance para identificar eventos de SQL e de espera que consomem muito swap ou memória na instância de banco de dados do RDS. O Insights de Performance coleta os dados no nível do banco de dados e os exibe no painel do Insights de Performance. Use o Insights de Performance para solucionar problemas relacionados ao desempenho do banco de dados. Para obter mais informações, consulte Monitorar a carga de banco de dados com o Insights de Performance do Amazon RDS.
Amazon RDS para MySQL
Se você tiver pouca memória liberável, execute SHOW FULL PROCESSLIST para ver todas as threads executadas no seu banco de dados. Para obter mais informações, consulte SHOW PROCESSLIST statement (Declaração SHOW PROCESSLIST) no site do MySQL. O ID do processo da saída de SHOW FULL PROCESSLIST não corresponderá ao ID do processo exibido pelo Monitoramento aprimorado. Para visualizar o ID correto do processo, modifique o grupo de parâmetros do banco de dados associado ao banco de dados para o parâmetro Performance_Schema. Esse é um parâmetro estático, portanto, você deve reinicializar a instância de banco de dados do RDS.
Observação: para evitar o tempo de inatividade, modifique o parâmetro e reinicialize o banco de dados fora do horário de pico de tráfego.
Depois que a memória atingir o uso desejado, conclua as seguintes etapas:
- Classifique os IDs do processo na página do Monitoramento aprimorado para que você veja os IDs dos processos que consomem o máximo de CPU.
- Execute a consulta a seguir como usuário principal:
Por exemplo, se a memória máxima for consumida pelo Thread_OS_Id 10374 e 1432, execute a seguinte consulta:select * from performance_schema.threads where THREAD_OS_ID in (ID shown in the Enhanced Monitoring window)\G
Para obter mais informações, consulte The threads table (A tabela de threads) no site do MySQL.select * from performance_schema.threads where THREAD_OS_ID in (10374, 1432)\G - Obtenha a coluna PROCESSLIST_ID da saída dessa consulta. Essa coluna fornece o ID do processo que corresponde ao valor do ID do processo de SHOW FULL PROCESSLIST.
- Depois de ter o ID de processo correto, mapeie o ID do processo com a consulta. Use o ID do processo para identificar a causa raiz do alto uso da memória e da CPU.
Para visualizar o processo do sistema operacional, use o Monitoramento aprimorado. Para obter mais informações, consulte Como visualizar métricas do SO no console do RDS.
Amazon RDS para PostgreSQL
Para identificar o processo que consome grandes quantidades de memória, mapeie o ID do processo na lista de processos do Monitoramento aprimorado para a consulta exata. Para identificar o processo, execute a seguinte visualização pg_stat_activity:
select * from pg_stat_activity where pid=(the PID of your process);
Em seguida, ajuste as consultas para consumir menos recursos computacionais.
Amazon RDS para SQL Server
O Monitoramento aprimorado pode identificar um ID de thread específico que consome grandes quantidades de memória. O ID de thread é o que o RDS para SQL Server chama de ID do processo kernel (kernel process ID, KPID).
No RDS para SQL Server, execute a seguinte consulta para obter o ID de processo do servidor (server process ID, SPID) que corresponde ao KPID:
select * from sys.sysprocesses where kpid = '<Value of Thread ID from Enhanced Monitoring>' ;
Depois de ter o ID do processo do servidor, por exemplo, 69, execute o seguinte comando para analisar o que está sendo feito pelo SPID 69:
dbcc inputbuffer(69)
Amazon RDS para Oracle
Para identificar o processo que consome mais memória, use o ID do processo do sistema operacional do Monitoramento aprimorado. Em seguida, execute a consulta a seguir para obter o endereço do processo da sessão:
select ADDR from v$process where SPID=OS_PID;
Para identificar a sessão dentro do banco de dados, use o endereço do processo para executar a seguinte consulta:
select sid,serial#,username, status from v$session where PADDR='<ADDR from above query>';
Quando você tiver ativado o Monitoramento aprimorado, compare as métricas FreeMemory e FreeableMemory. Se as métricas forem diferentes, isso pode mostrar que uma grande quantidade de memória está sendo usada no cache ou na memória inativa. Esse uso de memória pode levar a um alto uso de swap. Talvez seja necessário limpar o cache. Para obter mais informações sobre como limpar o cache, consulte Descarregar o cache do buffer.
Observação: limpar o cache do buffer pode afetar negativamente o desempenho do seu banco de dados.
Informações relacionadas
- Idioma
- Português
Vídeos relacionados


Conteúdo relevante
- feita há um ano
- feita há um ano