Por que minha instância de banco de dados do Amazon RDS está usando 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). Grandes quantidades de memória swap estão sendo utilizadas, embora eu tenha memória livre suficiente alocada. Por que a memória swap está sendo usada quando tenho memória suficiente?

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 Volumes de swap de armazenamento de instâncias. Como a maioria das instâncias de banco de dados do RDS usa Linux (exceto o SQL Server), às vezes seu banco de dados pode usar memória swap.

As instâncias de banco de dados do RDS exigem páginas na RAM somente 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 tiverem sido usadas recentemente. É 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 se você 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. Verifique 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 essas métricas para ver 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 permanecer consistentemente baixa, você poderá alterar o tamanho da instância de banco de dados do RDS para uma 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 com uma granularidade 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. Use o Monitoramento avançado para identificar aumentos ou diminuições que ocorrem por apenas um segundo e para ver 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.

Você também pode ativar o Performance Insights para identificar eventos de SQL e de espera que estão consumindo 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. O Performance Insights pode ajudá-lo a 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 revisar todos os encadeamentos em execução no seu banco de dados. 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 a ID correta 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. 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, siga estas etapas:

1.    Classifique os IDs de processo na página Monitoramento avançado para que você possa ver o ID dos processos que estão consumindo a CPU máxima.

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. Isso fornece o ID do processo que corresponde ao valor do ID do processo de SHOW FULL PROCESSLIST.

Depois de ter o ID de processo correta, você pode mapear o ID do processo com a consulta. Você pode usar o ID para identificar a causa raiz do alto uso da memória e da CPU. Você pode visualizar o processo do sistema operacional usando 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 está consumindo 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 está consumindo grandes quantidades de memória. O ID de tópico é o que o SQL Server chama de ID do processo Kernal (KPID).

No Amazon 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

Ao usar o ID do processo do sistema operacional do Monitoramento avançado, você pode ver qual processo está consumindo mais memória. 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;

Você pode usar o endereço do processo para identificar a sessão dentro do banco de dados executando a seguinte consulta:

select sid,serial#,username, status from v$session where PADDR='<ADDR from above query>';

Informações relacionadas

Visão geral do monitoramento do Amazon RDS