MongoDB: requisitos de RAM

20

É suficiente ter todo o índice na memória / ram ou o mongodb tenta alocar o máximo de ram possível para armazenar até os dados para leituras rápidas?

Eu gostaria de rodar o mongodb + outros aplicativos e parece que o mongodb é o único que não me permite definir um intervalo de RAM, digamos "max_memory_allocated_or_reserved = 8GB".

Se não há como fazê-lo, devo explicar ao oom-killer que o mongod é o processo "ruim" que não é a melhor prática na minha opinião ...

ledy
fonte

Respostas:

18

A verdadeira razão pela qual você não pode fazer o que pede (limita a memória) é porque o MongoDB não gerencia a memória que usa diretamente - permite que o SO faça isso. A memória do MongoDB apenas mapeia todos os seus dados e, em seguida, faz com que a página do sistema operacional entre e saia da memória, conforme necessário. Como resultado, não há gerenciamento direto da quantidade usada possível até que o MongoDB implemente isso de uma maneira completamente diferente, ou o sistema operacional permita (não é possível no Linux desde os 2,4 dias).

Atualmente, a única maneira de realmente segregar recursos é usar uma solução de virtualização e isolar o MongoDB em sua própria VM. Sim, há custos indiretos envolvidos (embora os hipervisores tenham melhorado muito), mas no momento esse é o preço a ser pago por esse nível de controle de recursos.

Em termos do OOM Killer, mesmo sem outros processos no host, desde que o conjunto de dados e os índices em geral excedam a memória disponível, o MongoDB pode encontrar problemas com o OOM Killer. Isso ocorre devido ao modo como os dados são paginados na memória - se não houver pressão na memória (nada mais quer memória residente) e você continuar adicionando / tocando em novos dados e índices, eventualmente crescerá para consumir toda a RAM disponível. Daí a recomendação de sempre configurar algumas trocas ao executar o MongoDB:

https://docs.mongodb.com/manual/administration/production-notes/#swap

Obviamente, os dados da LRU serão paginados primeiro, outros processos também poderão ocupar o res mem, mas o conceito ainda se aplica, a menos que você carregue o conjunto de dados na memória e permaneça estático. A melhor coisa a fazer se você estiver preocupado é inseri-lo no MMS e acompanhar o uso ao longo do tempo:

http://mms.mongodb.com

Atualização: agosto de 2015

Desde que escrevi essa resposta, as coisas mudaram um pouco e as informações estão um pouco desatualizadas. Por exemplo, o Linux agora tem cgroups e tecnologias relacionadas ( contêineres do Docker, por exemplo) que amadureceram a ponto de permitirem isolar e limitar melhor os recursos ( incluindo memória ) consumidos por qualquer processo em um ambiente de produção, mesmo aquele que usa mapeamento de memória como o MongoDB.

Além disso, com o advento de novos mecanismos de armazenamento além do MMAP, como o WiredTiger no MongoDB 3.0+, você pode usar a funcionalidade incorporada para limitar o tamanho do cache do MongoDB. Portanto, os requisitos de RAM agora realmente dependem de como você escolhe configurar o MongoDB, em que ambiente o executa e em qual mecanismo de armazenamento você escolhe.

Adam C
fonte
sobre o WiredTiger: " O storage.wiredTiger.engineConfig.cacheSizeGB limita apenas o tamanho do cache do WiredTiger, não a quantidade total de memória usada pelo mongod. O cache do WiredTiger é apenas um componente da RAM usada pelo MongoDB. O MongoDB também usa automaticamente todos os memória livre na máquina através do cache do sistema de arquivos ... "
Stefan Rogin
certo, mas o mesmo pode ser dito de qualquer aplicativo que pagina os dados fora do disco, o cache do FS não é mais o método principal de armazenamento em cache dos dados, como era antes com os arquivos mapeados na memória no mecanismo de armazenamento MMAP
Adam C
6

O MongoDB utilizará a memória livre disponível para armazenamento em cache e trocará para o disco conforme necessário para gerar memória para outros aplicativos no mesmo servidor. Para obter o melhor desempenho, você precisará de RAM suficiente para manter em memória seus índices e dados usados ​​com freqüência ("conjunto de trabalho").

Leitura útil:

Stennie
fonte
3

Algumas coisas mudaram nos últimos anos no MongoDB.

TL; DR

Se o mecanismo de armazenamento MMAPv1 for usado no working settamanho do MongoDB, ele deverá caber na RAM . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram

Se o motor de armazenamento WiredTiger é usado em MongoDB, não precisa se preocupar sobre a memória RAM está apto para working setou não . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine

Diagnóstico de memória para o mecanismo de armazenamento WiredTiger

O tamanho do meu conjunto de trabalho deve caber na RAM?

Não.

Como calculo a quantidade de RAM necessária para o meu aplicativo?

Com o WiredTiger, o MongoDB utiliza o cache interno do WiredTiger e o cache do sistema de arquivos.

Alterado na versão 3.2: A partir do MongoDB 3.2, o cache interno do WiredTiger, por padrão, usará o maior dos seguintes itens:

60% da RAM menos 1 GB ou 1 GB.

efkan
fonte
bem, essa resposta não ajuda muito, nem é terrivelmente precisa.
Philip Schiff