web-dev-qa-db-fra.com

MongoDB limite la mémoire

J'utilise mongo pour stocker les fichiers journaux. MongoDB et mysql s’exécutant sur la même machine, la virtualisation de mongo env n’est pas une option. Je crains d’être bientôt confronté à des problèmes de performances, car la table des journaux se développe très rapidement. Existe-t-il un moyen de limiter la mémoire résidente de mongo afin qu’elle ne consomme pas toute la mémoire disponible et ne ralentisse excessivement le serveur mysql?

Base de données: Debian 'Lenny' 5

Autres solutions (veuillez commenter):

  • Comme nous avons besoin de toutes les données historiques, nous ne pouvons pas utiliser de collections limitées, mais je considère également l’utilisation d’un script cron qui vide et supprime les anciennes données.

  • Devrais-je aussi envisager d'utiliser des clés plus petites, comme suggéré sur d'autres forums?

19
Vlad Zloteanu

Hey Vlad, vous avez quelques stratégies simples concernant les journaux.

La première chose à savoir est que Mongo peut généralement gérer de nombreuses insertions successives sans beaucoup de RAM. La raison en est simple, vous insérez ou mettez à jour uniquement des éléments récents. La taille de l'index augmente donc, mais les données sont constamment paginées.

En d'autres termes, vous pouvez décomposer l'utilisation de la RAM en deux parties principales: index & data.

Si vous utilisez une journalisation classique, les données sont constamment vidées, de sorte que seul l'index reste réellement dans la RAM.

La deuxième chose à savoir est que vous pouvez atténuer le problème d’index en plaçant les journaux dans des compartiments plus petits. Pense-y de cette façon. Si vous collectez tous les journaux dans une collection datée (appelez-la logs20101206), vous pouvez également contrôler la taille de l'index dans la RAM.

Au fil des jours, l'ancien index s'effacera de RAM et il ne sera plus consulté, il disparaîtra donc simplement.

mais je pense aussi à utiliser un script cron qui vide et supprime les anciennes données

Cette méthode de journalisation par jours permet également de supprimer les anciennes données. En trois mois, lorsque vous avez terminé avec les données, vous ne faites que db.logs20101206.drop() et la collecte disparaît instantanément. Notez que vous ne récupérez pas d'espace disque (tout est pré-alloué), mais les nouvelles données rempliront l'emplacement vide.

Devrais-je aussi envisager d'utiliser des clés plus petites, comme suggéré sur d'autres forums?

Oui.

En fait, je l'ai intégré à mes objets de données. Donc, j'accède aux données en utilisant logs.action ou logs->action, mais en dessous, les données sont réellement enregistrées dans logs.a. Il est très facile de passer plus de temps sur les "champs" que sur les "valeurs". Il est donc intéressant de réduire les "champs" et d'essayer de les supprimer ailleurs.

13
Gates VP

Pour la version 3.2+, qui utilise le moteur wiredTiger, l'option --wiredTigerCacheSizeGB est pertinente pour la question. Vous pouvez le définir si vous savez ce que vous faites exactement. Je ne sais pas si c'est une bonne pratique, lisez simplement le document et soulevez-le ici.

1
pu.guan

Pour Windows, il semble possible de contrôler la quantité de mémoire utilisée par MongoDB, voir ce tutoriel sur Captain Codeman:

Limiter l'utilisation de la mémoire MongoDB sous Windows sans virtualisation

0
Kdeveloper