Por que minha instância de banco de dados do Amazon RDS usa memória swap quando tenho memória suficiente?

7 minuto de leitura
0

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 Ativar o volume de swap do armazenamento de instâncias 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 esvaziadas para trocar espaço se não estiverem em uso. É uma prática recomendada permitir que o sistema operacional (SO) troque páginas antigas em vez de forçar o sistema operacional a manter as páginas na memória. Isso garante que haja RAM livre suficiente disponível para consultas futuras.

O uso do swap do Linux não é limpo com frequência porque limpar o uso do 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 do swap para sua instância de banco de dados do RDS, primeiro verifique as métricas de desempenho do banco de dados com base na carga de trabalho do aplicativo. Consulte as métricas FreeableMemory e SwapUsage do Amazon CloudWatch para entender o padrão geral de uso da 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 livre suficiente disponível, o uso do swap não deve afetar o desempenho da instância de banco de dados do RDS. Se a memória livre for consistentemente baixa, altere a classe da 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 avançado para revisar as métricas em intervalos de apenas um segundo. O Monitoramento avançado coleta estatísticas no nível do host, e o CloudWatch coleta dados do nível do hipervisor a cada 60 segundos. O Monitoramento avançado identifica aumentos ou diminuiçõ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 Visualização de métricas do sistema operacional usando logs do CloudWatch.

Também é possível ativar o Performance Insights para identificar eventos de SQL e de espera que consomem muita troca ou memória na instância de banco de dados do RDS. O Performance Insights coleta os dados no nível do banco de dados e os exibe no painel do Performance Insights. Use o Performance Insights para solucionar problemas relacionados ao desempenho do banco de dados. Para obter mais informações, consulte Monitoramento da carga do banco de dados com o Performance Insights no Amazon RDS.

Amazon RDS para MySQL

Se você tiver pouca memória livre, execute SHOW FULL PROCESSLIST para ver todos os encadeamentos executados no seu banco de dados. Para mais informações, consulte a instruçã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 avançado. Para visualizar o ID correto do processo, modifique o grupo de parâmetros de 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:

  1. Classifique os IDs do processo na página do Monitoramento avançado para que você veja os IDs dos processos que consomem o máximo de CPU.
  2. Execute a consulta a seguir como usuário principal:
    select * from performance_schema.threads where THREAD_OS_ID in (ID shown in the Enhanced Monitoring window)\G
    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 (10374, 1432)\G
    Para obter mais informações, consulte a tabela de tópicos no site do MySQL.
  3. 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.
  4. 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 avançado. Para obter mais informações, consulte Visualização de métricas do sistema operacional 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 avançado 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 avançado pode identificar um ID de tópico específico que consome grandes quantidades de memória. O ID de tópico é o que o RDS para SQL Server chama de ID do processo Kernel (KPID).

No RDS para SQL Server, execute a seguinte consulta para obter o ID de processo do servidor (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 revisar 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 avançado. Em seguida, execute a consulta a seguir para obter o endereço do processo para a 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 avançado, compare as métricas FreeMemory e FreeableMemory. Se as métricas forem diferentes, isso pode mostrar que uma grande quantidade de memória é 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 Como limpar cache do buffer.

**Observação:**limpar o cache do buffer pode afetar negativamente o desempenho do banco de dados.

Informações relacionadas

Ferramentas de monitoramento do Amazon RDS