Est-ce suffisant d'avoir tout l'index en mémoire/ram ou mongodb essaie-t-il même d'allouer autant de RAM que possible pour stocker même les données pour des lectures rapides?
Je voudrais exécuter mongodb + d'autres applications et il semble que mongodb soit la seule qui ne me permette pas de définir une plage de RAM, pour dire "max_memory_allocated_or_reserved = 8GB".
S'il n'y a aucun moyen de le faire, je devrais expliquer à oom-killer que mongod est le "mauvais" processus qui n'est pas la meilleure pratique à mon avis ...
La vraie raison pour laquelle vous ne pouvez pas faire ce que vous demandez (limiter la mémoire) est que MongoDB ne gère pas directement la mémoire qu'il utilise - il laisse le système d'exploitation le faire. MongoDB ne fait que mapper la mémoire de toutes ses données et a ensuite la page du système d'exploitation dans et hors de la mémoire selon les besoins. En conséquence, il n'y a pas de gestion directe de la quantité utilisée possible jusqu'à ce que MongoDB implémente cela d'une manière complètement différente, ou que le système d'exploitation le permette (pas possible sous Linux depuis les 2,4 jours).
La seule façon de vraiment séparer les ressources à l'heure actuelle est d'utiliser une solution de virtualisation et d'isoler MongoDB dans sa propre machine virtuelle. Oui, il y a des frais généraux impliqués (bien que les hyperviseurs se soient beaucoup améliorés), mais pour le moment, c'est le prix à payer pour ce niveau de contrôle des ressources.
En ce qui concerne OOM Killer, même sans aucun autre processus sur l'hôte, tant que votre ensemble de données et vos index dépassent globalement la mémoire disponible, MongoDB peut rencontrer des problèmes OOM Killer. Cela est dû à la façon dont les données sont paginées hors de la mémoire - s'il n'y a pas de pression de mémoire (rien d'autre ne veut de mémoire résidente), et que vous continuez à ajouter/toucher de nouvelles données et index, puis finalement elles augmenteront pour consommer toute la RAM disponible. D'où la recommandation de toujours configurer un swap lors de l'exécution de MongoDB:
https://docs.mongodb.com/manual/administration/production-notes/#swap
Bien sûr, les données LRU seront paginées en premier, d'autres processus peuvent également prendre la res mem, mais le concept s'applique toujours, sauf si vous chargez votre ensemble de données en mémoire et qu'il reste statique. La meilleure chose à faire si vous êtes inquiet est de le mettre dans MMS et de suivre l'utilisation au fil du temps:
Mise à jour: août 2015
Depuis que j'ai écrit cette réponse, les choses ont quelque peu évolué et les informations sont un peu dépassées. Par exemple, Linux a maintenant cgroups et les technologies connexes ( conteneurs Docker par exemple) qui ont mûri au point de vous permettre de mieux isoler et limiter les ressources (- y compris la mémoire ) consommé par n'importe quel processus dans un environnement de production, même celui qui utilise le mappage de mémoire comme MongoDB.
De plus, avec l'avènement de nouveaux moteurs de stockage au-delà de MMAP comme WiredTiger dans MongoDB 3.0+, vous pouvez utiliser la fonctionnalité intégrée pour limiter la taille du cache pour MongoDB. Par conséquent, les exigences de RAM dépendent désormais vraiment de la façon dont vous choisissez de configurer MongoDB, de l'environnement dans lequel vous l'exécutez et du moteur de stockage que vous choisissez.
MongoDB utilisera la mémoire libre disponible pour la mise en cache et échangera sur le disque si nécessaire pour fournir de la mémoire à d'autres applications sur le même serveur. Pour de meilleures performances, vous voudrez avoir suffisamment RAM pour conserver vos indices et les données fréquemment utilisées ("working set") en mémoire.
Lecture utile:
Quelque chose a changé au fil des ans à propos de MongoDB.
TL; DR
Si le moteur de stockage MMAPv1 est utilisé sur MongoDB working set
la taille doit correspondre [~ # ~] bélier [~ # ~] . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram
Si le moteur de stockage WiredTiger est utilisé sur MongoDB, pas besoin de se soucier de RAM est adapté pour working set
ou non . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine
Diagnostics de mémoire pour le moteur de stockage WiredTiger
La taille de mon ensemble de travail doit-elle être adaptée à la RAM?
Non.
Comment puis-je calculer la quantité RAM dont j'ai besoin pour mon application?
Avec WiredTiger, MongoDB utilise à la fois le cache interne WiredTiger et le cache du système de fichiers.
Modifié dans la version 3.2: à partir de MongoDB 3.2, le cache interne de WiredTiger, par défaut, utilisera le plus grand des deux:
60% de RAM moins 1 Go ou 1 Go.