Um Guia para Analisar Métricas de Desempenho do MongoDB com mongotop e mongostat

Use mongotop e mongostat para identificar coleções quentes, pressão de recursos, picos de conexão e padrões lentos no MongoDB.

Um Guia para Analisar Métricas de Desempenho do MongoDB com mongotop e mongostat

Problemas de desempenho no MongoDB geralmente se manifestam como páginas lentas, gravações acumuladas ou picos repentinos de conexão. mongotop e mongostat, instalados com as Ferramentas de Banco de Dados do MongoDB, fornecem uma visão rápida no terminal do que o servidor está fazendo no momento.

Este guia mostra como interpretar essas ferramentas durante incidentes comuns e, em seguida, conectar a saída a possíveis próximas verificações, como índices, formato de consulta, pooling de conexões e pressão de disco.

Entendendo o mongotop

mongotop fornece uma visão em tempo real das operações de leitura e gravação que ocorrem em suas instâncias MongoDB. Ele exibe o tempo gasto por cada coleção em operações de leitura ou gravação durante um intervalo especificado. Isso é particularmente útil para identificar quais coleções estão experimentando mais atividade e podem ser uma fonte potencial de degradação de desempenho.

Principais Métricas Fornecidas pelo mongotop:

  • ns: O namespace da coleção (banco_de_dados.coleção).
  • total: Tempo gasto lendo e escrevendo no namespace durante o intervalo de amostragem.
  • read: Tempo gasto em atividade de leitura durante o intervalo de amostragem.
  • write: Tempo gasto em atividade de gravação durante o intervalo de amostragem.

Como Usar o mongotop:

Você pode executar mongotop diretamente do seu terminal, desde que tenha as ferramentas de banco de dados MongoDB instaladas e acessíveis no seu PATH. Por padrão, ele atualiza a cada segundo. Você também pode especificar um intervalo em segundos.

mongotop

Para especificar um intervalo de atualização (por exemplo, a cada 5 segundos):

mongotop 5

Para executar mongotop contra uma instância MongoDB em execução em um host e porta diferentes:

mongotop --host <hostname> --port <porta>

Interpretando a Saída do mongotop:

  • Alto tempo de write em uma coleção específica: A coleção está vendo atividade intensa de gravação. Verifique o volume de gravação, crescimento de documentos, índices tocados por gravações e se a carga de trabalho deve ser fragmentada.
  • Alto tempo de read: Verifique os planos de consulta para essa coleção. Índices ausentes, conjuntos de resultados grandes e varreduras de agregação geralmente aparecem aqui.
  • Coleções com tempo total consistentemente alto: Estas são suas coleções mais quentes. Monitore de perto seus índices, conjunto de trabalho e padrões de consulta.

Entendendo o mongostat

mongostat fornece uma visão geral mais ampla e em tempo real do desempenho e utilização de recursos de uma instância MongoDB. Ele coleta e exibe uma variedade de métricas sobre o estado do servidor, incluindo operações por segundo, tráfego de rede, E/S de disco e uso de memória.

Principais Métricas Fornecidas pelo mongostat:

  • insert: Operações por segundo para inserções.
  • query: Operações por segundo para consultas.
  • update: Operações por segundo para atualizações.
  • delete: Operações por segundo para exclusões.
  • getmore: Operações por segundo para operações getmore (usadas para cursores).
  • command: Operações por segundo para comandos.
  • dirty ou dirty %: Dados modificados no cache WiredTiger na memória, mas ainda não gravados no disco. O nome exato da coluna depende da versão do MongoDB e da ferramenta.
  • used ou used %: Uso do cache WiredTiger. O nome exato da coluna depende da versão do MongoDB e da ferramenta.
  • conn: Número atual de conexões.
  • networkIn: Tráfego de rede recebido pelo servidor (em bytes).
  • networkOut: Tráfego de rede enviado pelo servidor (em bytes).
  • res: Tamanho da memória residente usada pelo processo MongoDB (em MB).
  • qr|qw: Número de operações de leitura e gravação enfileiradas, quando a coluna está disponível.
  • ar|aw: Número de clientes de leitura e gravação ativos, quando a coluna está disponível.

Como Usar o mongostat:

mongostat também é um utilitário de linha de comando. Semelhante ao mongotop, ele atualiza periodicamente, com um intervalo padrão de 5 segundos. Você pode especificar um intervalo diferente e detalhes de conexão.

mongostat

Para especificar um intervalo de atualização (por exemplo, a cada 2 segundos):

mongostat 2

Para conectar a uma instância MongoDB remota:

mongostat --host <hostname> --port <porta>

Interpretando a Saída do mongostat:

  • Altas taxas de insert, query, update ou delete: Indica carga operacional pesada. Monitore essas métricas juntamente com outras para entender se o sistema está acompanhando.
  • Alto conn: Um grande número de conexões pode sobrecarregar os recursos do servidor. Investigue o pooling de conexões em sua aplicação se isso estiver inesperadamente alto.
  • Alto networkIn ou networkOut: Sugere transferência significativa de dados. Isso pode ser devido a consultas grandes, tráfego de replicação ou conjuntos de resultados grandes sendo retornados.
  • Alto res: O processo MongoDB está consumindo muita RAM. Certifique-se de que seu servidor tenha memória suficiente e verifique consultas ineficientes ou grandes conjuntos de dados que possam contribuir para o alto uso de memória.
  • Alto qr|qw: Indica que leituras ou gravações estão sendo enfileiradas, o que geralmente aponta para contenção de recursos ou uma carga de trabalho que o servidor não consegue processar rápido o suficiente.
  • Altos valores de dirty ou cache used: Se a pressão do cache WiredTiger permanecer alta, seu conjunto de trabalho pode não caber confortavelmente na memória, ou as gravações em disco podem estar atrasadas.
  • Consultas lentas com baixas taxas de operação: Use o profiler, o log de consultas lentas ou explain() para verificar se as consultas estão varrendo muitos documentos. A saída moderna do mongostat não expõe de forma confiável uma única porcentagem de falta de índice para implantações WiredTiger.

Casos de Uso Práticos e Cenários de Solução de Problemas

Cenário 1: Desempenho Lento da Aplicação

  1. Execute mongostat: Observe as taxas de qr, aw, insert, query, update, delete. Se qr ou aw estiverem altos, ou se as taxas de operação estiverem altas, mas não parecerem estar processando rapidamente, sugere um acúmulo.
  2. Execute mongotop: Identifique quais coleções estão experimentando mais read ms e write ms. Uma coleção com alta atividade de gravação pode estar desacelerando outras operações.
  3. Verifique os planos de consulta: Para as coleções quentes identificadas pelo mongotop, execute explain("executionStats") em consultas lentas representativas.
  4. Analise networkIn/networkOut no mongostat: Se estiverem excepcionalmente altos, procure por conjuntos de resultados grandes, agregações grandes ou tráfego de replicação.

Cenário 2: Alto Uso de CPU ou Memória

  1. Execute mongostat: Monitore res (memória residente) e uso de CPU (muitas vezes observável através de ferramentas do sistema como top ou htop, mas mongostat dá uma perspectiva específica do banco de dados). Alto res pode se correlacionar com o cache do WiredTiger (used %).
  2. Examine mongotop: Altos ms de leitura/gravação em coleções específicas podem contribuir para alto uso de CPU.
  3. Observe as taxas de operação do mongostat: Se inserções/atualizações/exclusões forem extremamente altas, isso naturalmente consome CPU.
  4. Investigue o cache WiredTiger e métricas de disco: Se o cache sujo permanecer alto enquanto as gravações da aplicação diminuem, compare a saída do MongoDB com a latência do disco do host e a saturação de E/S.

Cenário 3: Atraso de Replicação

Embora mongotop e mongostat não meçam diretamente o atraso de replicação, eles são cruciais para entender a causa do atraso.

  1. Execute mongostat no primário: Procure por alto qr ou aw, altas taxas de operação de gravação ou alto uso de CPU/memória. Se o primário estiver sobrecarregado, ele não consegue escrever eficientemente em seu oplog, levando a atraso nos secundários.
  2. Execute mongostat no secundário: Observe suas operações de leitura/gravação. Se o secundário estiver lento para aplicar entradas do oplog, pode ser devido a recursos insuficientes no secundário ou consultas/operações ineficientes sendo aplicadas.

Dicas e Melhores Práticas

  • Execute Ferramentas Regularmente: Não espere que problemas de desempenho surjam. Monitore suas instâncias MongoDB proativamente.
  • Estabeleça Linhas de Base: Entenda como é o "normal" para sua implantação. Isso facilita a identificação de desvios.
  • Combine com Outras Ferramentas: mongotop e mongostat são excelentes para instantâneos em tempo real. Para análise histórica, considere usar o monitoramento de desempenho integrado do MongoDB (por exemplo, db.serverStatus(), db.stats()) ou ferramentas externas como Prometheus com o MongoDB Exporter, ou serviços de monitoramento de provedores de nuvem.
  • Entenda Seu Conjunto de Trabalho: Saber o tamanho do seu conjunto de dados ativo é crucial para o gerenciamento de memória e para entender a eficácia do cache WiredTiger.
  • Foco nos Planos de Consulta: Use explain("executionStats") e o log de consultas lentas para confirmar se índices ausentes ou ineficientes estão causando varreduras.
  • Considere o Pooling de Conexões: Altas contagens de conn podem muitas vezes ser mitigadas implementando um pooling de conexões adequado na camada de sua aplicação.

Conclusão

Use mongostat para entender a pressão no nível do servidor e mongotop para encontrar as coleções que estão recebendo mais atenção de leitura ou gravação. Quando qualquer ferramenta apontar para uma área quente, confirme a causa com planos de consulta, logs de consultas lentas, métricas do host e comportamento de conexão da aplicação antes de alterar índices ou dimensionar a implantação.