Data

19 abr, 2016

Melhora de desempenho do MongoDB com ‘dex’

Publicidade

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/