Algumas coisas para esclarecer aqui:
- Você verá apenas as consultas lentas registradas por padrão (> 100ms), você poderá ter milhões de consultas executadas nesse limite que nunca será registrado
- A maneira de descobrir qual é a causa das operações lentas é observar as estatísticas quando as operações lentas estão sendo registradas
- Você deve executar novamente as consultas com .explain () para verificar se eles estão usando o índice que você acho que eles são
Em termos de estatísticas, existem duas maneiras básicas de obtê-las. Primeiro, e mais rápido, é mongostat e mongotop . Esses dois utilitários são fornecidos com o MongoDB e podem ser usados para descobrir o que seu banco de dados está fazendo.
A outra opção é MMS (o Serviço de Monitoramento do MongoDB) - é gratuito e permite representar graficamente todas as estatísticas relevantes ao longo do tempo, para que você possa determinar o que é spiking / dipping quando você vê lentidão. Eu recomendo instalar o munin-node se você seguir esse caminho (veja MMS docs) porque ele lhe dará uma visão das estatísticas de IO, assim como as estatísticas do MongoDB.
Normalmente, você está procurando um dos itens a seguir:
- Falhas de página - se isso estiver aumentando, suas consultas estão causando paginação em disco - isso é uma ordem de magnitude mais lenta que as operações na memória e precisa ser minimizada.
- Memória residente - intimamente relacionada a falhas de página, isso representa seu conjunto de trabalho na memória. Você menciona que seu conjunto de dados tem de 2 a 3 vezes o tamanho da RAM, mas você incluiu índices nessa estimativa (consulte o
Há muitas outras coisas para analisar, mas é um bom começo, dada a sua descrição. Lembre-se, se você tiver contenção de memória, o mais novo é mais provável que já esteja na memória. Como você está usando um ID seqüencial, eu esperaria que os IDs antigos (a menos que atualizados ou tocados recentemente) apareçam no log de consultas lentas com mais frequência do que os novos IDs (é assim que o sistema operacional geralmente gerencia a memória - consulte LRU para mais).
Em termos de lidar com esse tipo de problema de desempenho, além de adicionar mais RAM, você deve analisar:
- Removendo índices desnecessários que podem ocupar espaço
- Veja as consultas índice coberto , se possível ( não há necessidade de página nos dados, apenas o índice)
- Verifique suas configurações de leitura antecipada - um tópico longo e complexo - consulte aqui e aqui para mais informações (e mais informações em geral)