MongoDB limite de la mémoire

j'utilise mongo pour stocker des fichiers journaux. MongoDB et mysql tournent sur la même machine, virtualiser mongo env n'est pas une option. Je crains que je vais bientôt rencontrer des problèmes perf que la table logs se développe très rapidement. Y a-t-il un moyen de limiter la mémoire résidente de mongo pour qu'elle ne mange pas toute la mémoire disponible et ralentisse excessivement le serveur mysql?

machine DB: Debian 'lenny' 5

autres solutions (veuillez commenter):

  • comme nous avons besoin de toutes les données historiques, nous ne pouvons pas utiliser des collections plafonnées, mais je pense également utiliser un script cron qui Dumpe et supprime les anciennes données

  • devrais-je également envisager d'utiliser des touches plus petites, comme suggéré sur d'autres forums?

18
demandé sur Vlad Zloteanu 2010-12-06 13:04:15

3 réponses

Hey Vlad, vous avez quelques stratégies simples ici en ce qui concerne les logs.

la première chose à savoir est que Mongo peut généralement gérer beaucoup d'inserts successifs sans beaucoup de RAM. La raison en est simple, vous n'insérez ou mettez à jour que des trucs récents. Donc la taille de l'indice augmente, mais les données seront constamment bippées.

autrement dit, Vous pouvez décomposer l'utilisation de la RAM en deux parties principales: index & data.

Si vous effectuez une journalisation typique,la partie de données est constamment évacuée, donc seul l'index reste en mémoire vive.

La deuxième chose à savoir est que vous pouvez atténuer l'indice problème en mettant les journaux en petits seaux. Pensez-y de cette façon. Si vous récupérez tous les journaux dans une collection de date-tamponnée (appelez-la logs20101206 ), alors vous pouvez également contrôler la taille de l'index en RAM.

pendant que vous roulez sur les jours, l'ancien index va flush de RAM et il ne sera pas accessible à nouveau, donc il va simplement disparaître.

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

cette méthode de journalisation par jours aide aussi à supprimer les anciennes données. Dans trois mois, lorsque vous avez terminé avec les données, vous faites tout simplement db.logs20101206.drop() et la collecte disparaît instantanément. Notez que vous ne récupérez pas l'espace disque (il est tout pré-alloué), mais de nouvelles données se rempliront la place vide.

devrais-je également envisager d'utiliser des touches plus petites, comme suggéré sur d'autres forums?

Oui.

En fait, je l'ai intégré dans 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 en fait enregistrées en logs.a . Il est vraiment facile de dépenser plus d'espace sur les "champs" que sur les" valeurs", donc il vaut la peine de réduire les "champs" et d'essayer d'abstraire loin d'ailleurs.

13
répondu Gates VP 2010-12-06 20:28:30

pour la version 3.2+, qui utilise le moteur wiredTiger, l'option --wiredTigerCacheSizeGB est pertinente à la question. Vous pouvez le régler si vous savez exactement ce que vous faites. Je ne sais pas si c'est une bonne pratique, il suffit de lire le document et de le soulever ici.

1
répondu pu.guan 2016-12-02 08:32:30

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

Limite MongoDB l'utilisation de la mémoire sur Windows sans la Virtualisation

0
répondu Kdeveloper 2011-12-16 13:45:02