Como ajustar as configurações do sistema para o mongoDB no Linux?

3

Tentando extrair muito de uma pergunta aqui - por favor, tenha paciência comigo.

Embora as man pages do MongoDB façam várias recomendações úteis sobre as configurações do sistema, como ulimit ( link ), e outras fatores de produção ( link ) parecem misteriosamente silenciosos em coisas como memória virtual e configurações de troca.

O mais próximo que chegamos de uma dica é que "... o subsistema de memória virtual do sistema operacional gerencia a memória do MongoDB ..." ( link ).

Executando o mesmo trabalho - gravações altas e leituras altas em cerca de 10.000.000 registros em uma única coleção - no meu 4-processador, 4GB RAM macbook e uma caixa de 8-core ubuntu com 64GB de RAM eu vi um desempenho de leitura drasticamente pior no caixa linux com configurações de fábrica, e podia ouvir o disco girando constantemente, indicando alta E / S e presumivelmente trocando. Sim, outras coisas estavam acontecendo na caixa, mas havia bastante RAM livre, espaço em disco, etc .; Além disso, eu fiz não ver evidências de que o Mongo estava se expandindo para tirar proveito de toda a RAM livre, como é esperado.

As configurações padrão da caixa Linux são as seguintes: vm.swappiness = 60 vm.dirty_background_ratio = 10 vm.dirty_ratio = 20 vm.dirty_expire_centisecs = 3000 vm.dirty_writeback_centisecs = 500

Eu arrisquei alguns palpites olhando docs e blogs para outros tipos de bancos de dados (Oracle, MYSQL, etc.), experimentei e ajustei como abaixo. vm.swappiness = 10 vm.dirty_background_ratio = 5 vm.dirty_ratio = 5 vm.dirty_writeback_centisecs = 250 vm.dirty_expire_centisecs = 500

Eu vi algumas melhorias aparentes imediatas no tempo de leitura. No entanto, quando executei meus testes novamente, o desempenho da leitura continuou sendo dolorosamente lento durante gravações pesadas.

Então, eu REPRODUÇÃO a coleção de uma fonte de dados disponível - e de repente eu posso ler a 1ms ou menos por registro, enquanto fazendo o trabalho de gravação!

Então a pergunta é realmente dupla:

1) Quais são as configurações de VM apropriadas para o MongoDB no Linux? 2) (bônus) O Mongo faz alguma verificação ou otimização com o SO enquanto os dados estão sendo construídos? Em outras palavras, se eu construímos um grande conjunto de dados com configurações de VM ou I / O abaixo do ideal, Mongo faz suposições durante o processo de mapeamento de memória que não tirará proveito das otimizações no futuro?

Obviamente, não estou explorando totalmente o mapeamento de memória (eu esperava que não fosse necessário).

Qualquer ajuda apreciada ... obrigado! -j

    
por jsh 08.04.2013 / 17:51

1 resposta

1

Eu acho que o seu caso com 4 Gigs de RAM é muito bom aqui para o Neo4j, que também usa o Memory Mapped IO e, portanto, as mesmas medidas de ajuste devem ser aplicadas:

link

Então, lendo isso, eu acho que você

vm.dirty_ratio=5
vm.dirty_background_ratio=5 

são muito baixos do que altos.

    
por 30.07.2013 / 12:45