Não há muito para melhorar na performance do MongoDB como um sysadmin. Na verdade, há apenas alguns poucos parâmetros que você pode mudar no servidor. A afinação real ocorre nas consultas e nos índices que precisam estar presentes. E, para esse fim, a ferramenta ‘dex’ é super valiosa.
Dex é uma ferramenta de linha de comando que pode analisar os logs do MongoDB, comparar as consultas que estão conectadas à instância MongoDB em execução e dizer quais índices devem ser adicionados para ajudar no seu desempenho.
Instalando Dex para MongoDB
A ferramenta dex é instalada por meio do pip, o gerenciador de pacotes Python. Para RHEL/CentOS, faça o seguinte:
$ yum install python-pip $ pip install dex
Uma vez concluída, a ferramenta de linha de comando dex estará disponível para você.
Execute dex para melhorar o desempenho do seu MongoDB
Em seguida, execute a ferramenta dex nos seus registros MongoDB e sua instância MongoDB em execução.
$ cd /var/log/mongodb/ $ dex -f mongod.log mongodb://localhost
Isso irá ler todos os registros no arquivo ‘mongod.log’ e verificar, para cada consulta, se existem os índices necessários. Se eles não existirem, você pode encontrar uma saída como esta:
$ dex -f mongod.log mongodb://localhost { 'runStats': { 'linesRecommended': 66, 'linesProcessed': 190, 'linesPassed': 522 }, 'results': [ { 'queryMask': '{"$query":{"columnId":""}}', 'namespace': 'collection.table', 'recommendation': { 'index': '{"columnId": 1}', 'namespace': 'collection.table', 'shellCommand': 'db["collection"].ensureIndex({"columnId": 1}, {"background": true})' }, 'details': { 'count': 55, 'totalTimeMillis': 213856, 'avgTimeMillis': 3888 } } ]
Se não há nada a relatar, a saída se parece com isto:
$ dex -f mongod.log mongodb://localhost { 'runStats': { 'linesRecommended': 0, 'linesProcessed': 10934, 'linesPassed': 41372 }, 'results': [] }
Ele verificou 10.934 linhas no arquivo mongod.log e não pôde relatar quaisquer melhorias. Boa notícia: o MongoDB parece estar rodando muito bem!
Parâmetros dex adicionais: consultas de log lenta, watch mode
Talvez você não queira verificar todas as consultas no log. Você pode adicionar o parâmetro –slowms para verificar apenas as consultas que excedam esse limite de tempo de log lento.
$ dex -f mongod.log mongodb://localhost --slowms 200
O comando acima irá verificar somente as consultas que excederam 200ms.
Alternativamente, você pode usar o parâmetro –watch e não analisar todo o arquivo de log na inicialização, mas apenas processar as novas entradas. Isso pode ser útil se os logs já ultrapassam alguns GBs de tamanho e você não quer se preocupar em analisar esses valores antigos.
$ dex -f mongod.log mongodb://localhost --watch
Isso acelera significativamente a inicialização do dex.
Aplicando recomendações de desempenho do MongoDB
A ferramenta dex oferece uma maneira realmente simples de aplicar os índices que são recomendados: o comando shell é impresso na saída! Aqui está um exemplo:
... 'recommendation': { 'index': '{"columnId": 1}', 'namespace': 'collection.table', 'shellCommand': 'db["collection"].ensureIndex({"columnId": 1}, {"background": true})' }, ...
O shellCommand na saída é o comando exato para criar o índice.
A fim de aplicá-lo, conecte-se à instância MongoDB em execução usando o cliente da ferramenta mongo, o segundo argumento é a coleção que deseja abrir.
$ mongo collection > db["collection"].ensureIndex({"columnId": 1}, {"background": true})
O resultado é o índice que está sendo adicionado em uma forma de segundo plano: isso não bloqueia as linhas, e o aplicativo pode continuar funcionando. Há algumas pegadinhas nos índices de segundo plano no MongoDB, mas para mim eles superam a desvantagem de ter tanto uma leitura+escrita de bloqueio sobre os dados.
Se você está trabalhando com MongoDB, certifique-se de usar a ferramenta dex para ajudar a solucionar problemas de desempenho.
***
Mattias Geniar faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://ma.ttias.be/mongodb-performance-tuning-with-dex/