View a markdown version of this page

Solucionar problemas de falta de memória em bancos de dados do Aurora MySQL - Amazon Aurora

Solucionar problemas de falta de memória em bancos de dados do Aurora MySQL

Quando uma instância de banco de dados do Aurora MySQL fica com pouca memória, o sistema operacional pode encerrar o processo do banco de dados, provocando uma reinicialização não planejada. Para ajudar a evitar essas reinicializações, o Aurora MySQL inclui recursos de gerenciamento de memória que monitoram a memória do sistema e realizam ações automáticas de recuperação quando a memória está baixa. Essas ações ajudam a evitar a indisponibilidade do banco de dados devido a esgotamento de memória.

Os seguintes parâmetros controlam esse comportamento:

  • aurora_enable_memory_management: disponível somente no Aurora MySQL SQL 8.4.

    • Quando definido como ON (padrão), o Aurora gerencia automaticamente as ações de recuperação de memória e o parâmetro aurora_oom_response é ignorado.

    • Defina como OFF para controlar manualmente as ações de recuperação por meio de aurora_oom_response.

  • aurora_oom_response: uma lista separada por vírgulas de ações de recuperação. Uma string vazia desabilita todas as ações. Disponível no Aurora MySQL versão 3. Disponível também no Aurora MySQL 8.4, mas é considerado somente quando aurora_enable_memory_management está definido como OFF.

Ações de resposta a OOM

As ações a seguir podem ser incluídas em aurora_oom_response, listadas das menos às mais agressivas.

Ação O que ela faz Observações
print Registra em log consultas e conexões que consomem muita memória no log de erros. Nenhuma consulta ou conexão é encerrada. Disponível no Aurora MySQL versões 3 e 8.4.
tune Reduz os caches internos de tabela (table_open_cache, table_definition_cache) para liberar memória. Os tamanhos do cache são restaurados quando a memória volta ao normal. As entradas anteriormente armazenadas em cache não são restauradas; novas entradas são adicionadas somente quando consultas subsequentes as acessam. Disponível no Aurora MySQL versões 3 e 8.4. Somente instâncias provisionadas. Não há suporte no Sem Servidor v2.
tune_buffer_pool Reduz o grupo de buffers do InnoDB para liberar memória. O tamanho do grupo de buffers é restaurado quando a memória volta ao normal. As páginas anteriormente armazenadas em cache que foram removidas não são recarregadas automaticamente; novas páginas são armazenadas em cache somente quando consultas subsequentes as acessam. Somente Aurora MySQL versão 3 (3.06 e posterior) e Aurora MySQL 8.4. Compatível com instâncias provisionadas com apenas 2 vCPUs. Não é compatível com o Sem Servidor v2.
decline Rejeita novas consultas com um erro enquanto a memória está baixa. Disponível no Aurora MySQL versões 3 e 8.4.
kill_query Encerra a execução de consultas SELECT, começando com os maiores consumidores de memória, até que a memória volte ao normal. A DDL, outras DMLs e as transações não são afetadas. Disponível no Aurora MySQL versões 3 e 8.4. Mutuamente excludente com kill_connect: se ambos estiverem definidos, somente kill_connect será ativado.
kill_connect Encerra as conexões de usuário, revertendo as respectivas transações ativas e encerrando as instruções DDL. Veja abaixo o comportamento específico da versão.
Importante

É necessário emparelhar tune_buffer_pool com kill_query ou kill_connect no valor do parâmetro aurora_oom_response. Sem um deles, o redimensionamento do grupo de buffers não ocorre mesmo quando tune_buffer_pool está incluído.

Comportamento kill_connect específico da versão

Versão do Aurora MySQL Comportamento
Aurora MySQL 3.04-Aurora MySQL 3.10 Encerra as conexões de usuário para liberar memória suficiente e permitir que o banco de dados se recupere da pressão de memória.
Aurora MySQL 3.11 e posterior, Aurora MySQL 8.4 Encerra as conexões de usuário para liberar memória suficiente e permitir que o banco de dados se recupere da pressão de memória. Também encerra qualquer conexão de usuário que tente alocar memória durante a pressão de memória.

No Sem Servidor v2, o Aurora responde à pressão de memória aumentando a escala verticalmente primeiro das ACUs para fornecer memória adicional. Se a pressão de memória persistir enquanto o ajuste de escala estiver em andamento, o Aurora poderá encerrar as conexões existentes para recuperar a memória. O encerramento das conexões que tentam alocar memória ocorre somente quando a instância atinge o limite máximo de ACU configurado e não consegue escalar ainda mais.

Valores padrão por versão

O Aurora MySQL configura aurora_oom_response automaticamente com base na versão do mecanismo, no tipo de instância e na memória disponível.

No Aurora MySQL 8.4, quando aurora_enable_memory_management é ON (o padrão), o Aurora gerencia automaticamente as ações de recuperação de memória, e o valor aurora_oom_response não é usado. Quando definido como OFF, o Aurora usa o valor aurora_oom_response diretamente, que está vazio por padrão, o que significa que nenhuma ação de recuperação é realizada, a menos que você as configure explicitamente. A tabela de padrões a seguir é aplicável somente ao Aurora MySQL versão 3.

Limite de instância pequena: ≤ 2 GiB para as versões 3.04 e 3.05. ≤ 4 GiB para a versão 3.06 e posterior.

Limite de instância grande: ≤ 2 GiB para as versões 3.04 e 3.05. > 4 GiB para a versão 3.06 e posterior.

Versão Tamanho da instância Provisionada Sem Servidor v2
Aurora MySQL 3.04-Aurora MySQL 3.05Pequenaprint,tuneprint
Grandedesabilitadodesabilitado
Aurora MySQL 3.06Pequenaprint,tune,decline,kill_connectprint
Grandedesabilitadodesabilitado
Aurora MySQL 3.07Pequenaprint,tune,decline,kill_connectprint
Grandeprintprint
Aurora MySQL 3.08Pequenaprint,tune,tune_buffer_pool,decline,kill_connectprint
Grandeprintprint
Aurora MySQL 3.09-Aurora MySQL 3.10Pequenaprint,tune,tune_buffer_pool,decline,kill_connectprint
Grandeprint,decline,kill_connectprint,decline,kill_connect
Aurora MySQL 3.11 e posteriorPequenaprint,tune,tune_buffer_pool,decline,kill_connectprint,decline,kill_connect
Grandeprint,decline,kill_connectprint,decline,kill_connect

Aurora Serverless v2

Não é possível realizar as ações tune e tune_buffer_pool no Aurora Sem Servidor v2. Todas as outras ações funcionam da mesma forma que nas instâncias provisionadas.

Os limites de memória se ajustam dinamicamente à medida que a instância escala as respectivas ACUs. A coluna Sem Servidor v2 na tabela de padrões acima mostra os padrões efetivos para cada versão.

Monitoramento

É possível monitorar a atividade de precaução de OOM por meio dos métodos a seguir.

Log de erros

Quando são realizadas ações de recuperação de memória, o Aurora MySQL grava mensagens no log de erros do banco de dados. O prefixo da mensagem varia de acordo com a versão e pode mudar em versões futuras:

  • Aurora MySQL versão 3: as mensagens são prefixadas com OOM crash avoidance:.

  • Aurora MySQL versão 8.4: as mensagens são prefixadas com Aurora memory management:.

Essas mensagens incluem:

  • Pressão de memória detectada e recuperada: notificações com memória total e disponível.

  • Detalhes de consultas ou conexões encerradas para recuperação de memória.

  • Consultas candidatas identificadas pela ação print.

Para visualizar o log de erros, consulte Logs de erro do Aurora MySQL.

Métricas do Amazon CloudWatch

As métricas do CloudWatch a seguir rastreiam a atividade de precaução de OOM em nível de instância.

MétricaDescriçãoDisponível a partir deUnidade
AuroraMemoryHealthStateIndica o estado de integridade da memória. 0 significa íntegro (sem pressão de memória), 5 significa pressão de memória moderada e 10 significa pressão grave de memória.Aurora MySQL 3.06.1 e posterior, Aurora MySQL 8.4Indicador
AuroraMemoryNumDeclinedSqlTotalO número incremental de consultas recusadas como parte de uma tentativa de evitar OOM.Aurora MySQL 3.06.1 e posterior, Aurora MySQL 8.4Contagem
AuroraMemoryNumKillConnTotalO número incremental de conexões fechadas como parte de uma tentativa de evitar o OOM.Aurora MySQL 3.06.1 e posterior, Aurora MySQL 8.4Contagem
AuroraMemoryNumKillQueryTotalO número incremental de consultas encerradas como parte de uma tentativa de evitar OOM.Aurora MySQL 3.06.1 e posterior, Aurora MySQL 8.4Contagem
AuroraMillisecondsSpentInOomRecoveryO tempo decorrido desde que a integridade da memória caiu abaixo do estado normal.Aurora MySQL 3.08.0 e posterior, Aurora MySQL 8.4Milissegundos
AuroraNumOomRecoverySuccessfulO número de vezes em que a integridade da memória foi restaurada ao estado normal.Aurora MySQL 3.08.0 e posterior, Aurora MySQL 8.4Contagem
AuroraNumOomRecoveryTriggeredO número de vezes em que a integridade da memória caiu abaixo do estado normal.Aurora MySQL 3.08.0 e posterior, Aurora MySQL 8.4Contagem

As seguintes métricas gerais do CloudWatch também são úteis para monitorar a pressão da memória:

MétricaDescriçãoUnidade
FreeableMemoryA quantidade de memória disponível. Relata o valor MemAvailable de /proc/meminfo.Bytes
SwapUsageA quantidade de espaço de troca usada.Bytes

Para ver a lista completa de métricas em nível de instância do Aurora MySQL, consulte Métricas no nível da instância do Amazon Aurora.

Variáveis de status globais

As variáveis de status a seguir fornecem informações sobre o estado OOM (sem memória). Disponível no Aurora MySQL versão 3.06.0 e posterior.

VariávelDescrição
Aurora_oom_responseAs ações de resposta a OOM no momento ativas para essa instância de banco de dados.
aurora_oom_avoidance_recovery_stateSe a recuperação de OOM é ACTIVE ou INACTIVE.
aurora_oom_statusEstado atual da integridade da memória do banco de dados: íntegra (sem pressão de memória), pressão de memória moderada ou pressão grave de memória. Disponível somente na versão 3.

Para consultar: SHOW GLOBAL STATUS LIKE 'aurora_oom%';.

Para ver a lista completa de variáveis de status globais do Aurora MySQL, consulte Variáveis de status globais do Aurora MySQL.

Insights de Performance

Se o Insights de Performance estiver habilitado, você poderá usar métricas de memória no nível do sistema operacional para monitorar a pressão de memória e detectar eventos de OOM. As seguintes métricas estão disponíveis nos contadores os.memory e os.swap:

MétricaDescrição
os.memory.outOfMemoryKillCountO número de encerramentos OOM durante o último intervalo de coleta. Um valor diferente de zero indica que o sistema operacional encerrou um processo devido a esgotamento de memória, o que normalmente resulta na reinicialização do banco de dados.
os.memory.totalA quantidade total de memória, em kilobytes.
os.memory.freeA quantidade de memória não atribuída, em kilobytes.
os.memory.activeA quantidade de memória atribuída, em kilobytes.
os.memory.cachedA quantidade de memória utilizada para o armazenamento em cache da E/S no sistema de arquivos, em quilobytes.
os.memory.dirtyA quantidade de páginas de memória modificadas, mas ainda não gravadas no armazenamento, em quilobytes.
os.memory.inactiveA quantidade de páginas de memória usadas com menos frequência, em kilobytes.
os.memory.db.residentSetSizeA quantidade de memória usada pelo processo de banco de dados (excluindo a memória compartilhada), em bytes.
os.memory.db.cacheA quantidade de memória usada para cache de página pelo processo do banco de dados, em bytes.
os.memory.db.swapA quantidade de memória de troca usada pelo processo do banco de dados, em bytes.
os.swap.inA quantidade de memória transferida do disco, em quilobytes.
os.swap.outA quantidade de memória transferida para o disco, em quilobytes.

É possível monitorar os.memory.outOfMemoryKillCount para detectar quando o sistema operacional encerrou o processo do banco de dados devido à falta de memória. Para ver a lista completa de contadores de sistema operacional, consulte Métricas de sistema operacional do Insights de Performance.

Performance Schema

Se performance_schema estiver habilitado, você poderá usar tabelas de resumo de memória para identificar quais componentes e conexões estão consumindo mais memória. Para obter mais informações, consulte Solução de problemas de uso de memória para bancos de dados Aurora MySQL.