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.
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:
fonte
Algumas coisas mudaram nos últimos anos no MongoDB.
TL; DR
Se o mecanismo de armazenamento MMAPv1 for usado no
working set
tamanho do MongoDB, ele deverá caber na RAM . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ramSe o motor de armazenamento WiredTiger é usado em MongoDB, não precisa se preocupar sobre a memória RAM está apto para
working set
ou não . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-enginefonte