DataARTIGO

Melhora de desempenho do MongoDB com ‘dex’

Dex é uma ferramenta de linha de comando que pode analisar os logs do MongoDB.

Não há muito para melhorar na performance do MongoDBMongoDB19 conteúdosMongoDB e LGPD: Quais os recursos disponíveis?Data · jul 2019Laravel & MongoDB: saiba mais sobre embedded documentsData · abr 2021LEFT JOIN no MongoDB, não é magia… É Aggregation Framework!!!Data · set 2019Ver tudo em Data 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 PythonPython56 conteúdosVSCode + Python + Alexa: Desenvolva e teste skills para alexa localmente com pythonDev (Back & Front) · out 2025Dominando decoradores em Python: um guia completo com exemplosDev (Back & Front) · jan 2025Desenvolvimento de software: diferenças entre Python, JavaScript e JavaGestão Dev & TI · nov 2024Ver tudo em Dev (Back & Front) . 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/

Trabalha com programação de linguagens e servidores há mais de 10 anos. Atualmente, trabalha na Nucleus como desenvolvedor e engenheiro de sistemas. Seus interesses incluem Linux, Apache, MySQL e PHP.

Ver perfil