Como solucionar problemas e resolver a utilização elevada da CPU em instâncias do Amazon DocumentDB?

8 minuto de leitura
0

Estou observando uma utilização elevada da CPU em instâncias de banco de dados do Amazon DocumentDB (compatível com MongoDB).

Breve descrição

A utilização da CPU das instâncias do Amazon DocumentDB ajuda você a entender o desempenho dos recursos atualmente alocados para a workload contínua.

Você pode observar um aumento na utilização da CPU pelos seguintes motivos:

  • Workloads pesadas iniciadas pelo usuário
  • Consultas não eficientes
  • O gravador no cluster está sobrecarregado porque a carga de leitura não está balanceada no cluster
  • O leitor tem uma configuração de hardware inferior à do gravador e não consegue se sincronizar com a elevada workload de gravação
  • Tarefas internas, como coleta de resíduos no cluster do Amazon DocumentDB
  • Muitas conexões de banco de dados (ociosas)
  • Pequenos surtos de conexões

Para identificar as principais fontes de uso da CPU em uma instância do Amazon DocumentDB, analise estes aspectos:

  • Métricas do Amazon CloudWatch
  • Performance Insights
  • Consultas de banco de dados nativas
  • Verifique a eficiência das consultas
  • Configurações de registro em log agressivo

Depois de identificar a causa, analise e otimize sua workload para reduzir o uso da CPU. Se o problema persistir, aumente o tamanho da instância com base na workload.

Resolução

Use métricas do CloudWatch

O Amazon DocumentDB se integra ao CloudWatch e permite que você reúna e analise métricas operacionais dos clusters.

As métricas do CloudWatch permitem que você identifique a CPU e seus padrões métricos proporcionais durante longos períodos. Analise essas métricas e, em seguida, monitore-as no console do CloudWatch:

  • Use DatabaseConnections e DatabaseConnectionsMax para identificar o número de conexões abertas em um cronograma relevante.
  • Use WriteIOPs, ReadIOPs, ReadThroughput e WriteThroughput para entender a workload geral em sua instância do Amazon DocumentDB.
  • Use DocumentsDeleted, DocumentsInserted, DocumentsReturned e DocumentsUpdated. As métricas podem ajudar você a entender a workload do usuário na instância do Amazon DocumentDB.
  • Se você usa as classes de instância T3 ou T4, analise CPUCreditBalance e CPUSurplusCreditBalance para verificar o controle de utilização computacional.

Use métricas do Performance Insights

Use o Performance Insights do Amazon DocumentDB para identificar consultas que contribuem para a carga do banco de dados e o estado de espera. Na opção Gerenciar métricas, use a média de sessões ativas para analisar a carga e a distribuição da CPU (system%, user% ou total%).

Uma média de carga maior que o número de vCPUs indica que a instância está sob uma carga pesada. Por exemplo, a média de carga pode ser menor que as vCPUs da classe de instância de banco de dados. Isso indica que o controle de utilização da CPU pode não ser a causa da latência do aplicativo. Verifique a média da carga e analise os estados de espera relevantes para entender a origem do uso adicional da CPU, como E/S, bloqueios e trava.

Use consultas de banco de dados nativas

As consultas nativas podem ajudar você a analisar a workload e verificar o uso da CPU. Use o shell do MongoDB para executar essa consulta. Isso lista todas as operações que estão atualmente em execução em uma instância do Amazon DocumentDB:

db.adminCommand({currentOp: 1, $all: });

Essa consulta usa o comando currentOp para listar todas as consultas bloqueadas ou executadas por mais de 10 segundos:

db.adminCommand({aggregate: 1,
                 pipeline: [{$currentOp: {}},
                            {$match: {$or: [{secs_running: {$gt: 10}},
                                            {WaitState: {$exists: true}}]}},
                            {$project: {_id:0,
                                        opid: 1,
                                        secs_running: 1,
                                        WaitState: 1,
                                        blockedOn: 1,
                                        command: 1}}],
                 cursor: {}
                });

Para analisar os resultados de uso do sistema, execute essa consulta na instância em que você observa uso elevado da CPU. Essa consulta retorna um agregado de todas as consultas executadas em cada namespace. Ela também lista todas as tarefas internas do sistema e o número exclusivo de estados de espera por namespace.

db.adminCommand({aggregate: 1,
                 pipeline: [{$currentOp: {allUsers: true, idleConnections: true}},
                            {$group: {_id: {desc: "$desc", ns: "$ns", WaitState: "$WaitState"}, count: {$sum: 1}}}],
                 cursor: {}
                });

Observação: a métrica GARBAGE_COLLECTION nas tarefas internas é a implementação do MVCC no cluster do Amazon DocumentDB. Essa é uma varredura em segundo plano que remove versões inativas de documentos e está relacionada ao número de atualizações ou exclusões de seu banco de dados. O processo de varredura é acionado com base nos limites internos em um nível de coleta e resulta em IOPs de leitura/gravação e uso da CPU.

Verifique a eficiência das consultas

Verifique a sobrecarga do índice para consultas de gravação

Excesso de índices ou muitos índices não utilizados associados ao seu banco de dados podem contribuir para a sobrecarga adicional nas gravações. Analise as estatísticas do índice para analisar o uso do índice e identificá-los.

Verifique o plano de explicação da consulta

As consultas podem ser executadas lentamente porque exigem uma varredura completa da coleção para escolher os documentos relevantes. Crie índices apropriados para melhorar a velocidade da consulta.

Use o comando explicar para identificar os campos nos quais você deseja criar índices. Você também pode usar os logs do profiler para capturar consultas de longa execução e os detalhes de suas operações.

Verifique as estatísticas das coleções

Verifique essas estatísticas das coleções que você usa:

  • Examine a seção Principais consultas no Performance Insights para identificar as coleções que mais contribuem para a carga.
  • Analise as estatísticas da coleção para entender a quantidade de operações de inserção, atualização e exclusão realizadas nela. Você também pode analisar a quantidade de varreduras de índice e varreduras integrais de coleção realizadas.
  • Divida suas coleções para reduzir o tamanho do documento a ser processado, especialmente se você tiver um grande número de operações de atualização.

Verifique as configurações de registro em log agressivo

A auditoria de eventos é priorizada sobre o tráfego do banco de dados. Se a auditoria não for necessária, você poderá desativá-la. Se você precisar de auditoria, defina o parâmetro audit_logs para registrar em log somente os eventos necessários. Planeje o aumento da carga e, em seguida, mude para uma classe de instância maior, se necessário.

Para logs do profiler, verifique se o valor correto está definido para o parâmetro profiler_threshold_ms para evitar registro em log agressivo. Analise a workload do seu aplicativo para identificar o limite correto necessário para categorizar uma consulta como de longa execução.

Confirme se você ativou a opção exportação de logs para os logs que você deseja exportar para o CloudWatch.

Use práticas recomendadas

Descarregue a workload de leitura para o leitor

Se você tiver várias instâncias de banco de dados em um cluster do Amazon DocumentDB, descarregue a workload de leitura para sua instância de leitura. Ao se conectar como um conjunto de réplicas, especifique a readPreference para a conexão. Se você especificar uma preferência de leitura de secondaryPreferred, o cliente tentará rotear as consultas de leitura para suas réplicas. O cliente tenta rotear consultas de gravação para sua instância de banco de dados primária.

Observe que os leitores têm uma consistência eventual. Se uma workload exigir uma consistência mais forte de leitura após gravação, use a preferência de leitura dinâmica e substitua-a no nível da consulta. Por exemplo, você pode usar secondaryPreferred como padrão no nível da conexão para que as consultas sejam enviadas para secundário. Se você tiver consultas que exijam uma consistência mais forte de leitura após gravação, você pode substituir o padrão. Neste exemplo:

db.collection.find().readPref("primary")

Adicione uma ou mais instâncias do leitor ao cluster

Se você tiver um cluster do Amazon DocumentDB com uma única instância de banco de dados (somente gravador), adicione uma ou várias instâncias de banco de dados do leitor ao cluster. Em seguida, use readPreference=secondaryPreferred para lidar com a carga de maneira eficaz.

Use o Amazon DocumentDB Profiler para identificar consultas lentas

Use o Amazon DocumentDB Profiler para registrar em log as consultas lentas. Se uma consulta aparecer repetidamente nos logs de consultas lentas, talvez você precise de um índice adicional para aprimorar o desempenho.

Procure consultas de longa execução que tenham um ou mais estágios que executem pelo menos um estágio COLLSCAN. Isso indica que o estágio de consulta precisa ler todos os documentos da coleção para fornecer uma resposta à consulta.

Para obter mais informações, consulte Criação de perfis de consultas de execução lenta no Amazon DocumentDB (compatível com MongoDB).

Crie uma notificação de alarme com o CloudWatch

Crie um alarme do CloudWatch que notifique você quando a métrica de utilização da CPU exceder um limite específico.

Aumente a escala verticalmente da classe de instância das suas instâncias de banco de dados

Se não houver mais escopo de ajuste de consulta, aumente a escala verticalmente da classe de instância de instâncias no cluster para lidar com a workload.

Observação: se você aumentar a escala verticalmente de uma classe de instância, isso aumentará o custo. Para obter mais informações, consulte Preços do Amazon DocumentDB.

Informações relacionadas

Escale clusters do Amazon DocumentDB

Desempenho e utilização de recursos

Como indexar no Amazon DocumentDB (compatível com MongoDB)

AWS OFICIAL
AWS OFICIALAtualizada há um ano