Question

J'ai écrit une petite application Web utilisant ruby ??on rails, son objectif principal est de télécharger, stocker et afficher les résultats à partir de xml (les fichiers peuvent contenir plusieurs Mo). Après avoir fonctionné pendant environ 2 mois, j'ai remarqué que le processus bâtard utilisait environ 4 Go de mémoire. J'ai fait des recherches sur le débogage des fuites de mémoire Ruby et je n'ai pas trouvé grand chose. J'ai donc deux questions.

  • Existe-t-il de bons outils pour détecter les fuites de mémoire dans Ruby / rails?
  • Quels types de modèles de codage provoquent des fuites de mémoire en ruby?
Était-ce utile?

La solution

Quelques conseils pour détecter les fuites de mémoire dans Rails:

La première est une exploration graphique de l'utilisation de la mémoire par les objets dans l'ObjectSpace.

Les deux derniers vous aideront à identifier les modèles d'utilisation spécifiques qui gonflent l'utilisation de la mémoire, et vous pouvez travailler à partir de là.

En ce qui concerne les modèles de codage spécifiques, vous devez, par expérience, observer tout ce qui concerne le traitement de fichiers, le traitement d’images, le travail avec des chaînes volumineuses, etc.

Je voudrais vérifier si vous utilisez la bibliothèque XML la plus appropriée - ReXML est connu pour sa lenteur et son étanchéité (je n’en ai aucune preuve!). Vérifiez également si vous pouvez mémoize effectuer des opérations coûteuses.

Autres conseils

Une méthode très simple pour consigner l'utilisation de la mémoire avant ou après chaque demande (uniquement pour Linux).

#Put this in applictation_controller.rb
before_filter :log_ram # or use after_filter
def log_ram
  logger.warn 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip
end

Vous voudrez peut-être charger le script / la console et essayer d'abord la déclaration pour vous assurer qu'elle fonctionne correctement.

puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip

Ensuite, surveillez simplement en haut, lorsqu'une requête accélère votre utilisation de la mémoire, consultez les journaux. Ceci, bien sûr, n’aidera que si vous avez une fuite de mémoire qui se produit par gros sauts et non par incréments infimes.

La fuite de mémoire est un problème dans l'implémentation actuelle de ruby. Un bon point de départ pour commencer est http://whytheluckystiff.net/articles/theFullyUpturnedBin.html Le site Web Whytheluckystiff n'existe plus, mais vous pouvez trouver l'article original ici: http: // viewsourcecode. org / pourquoi / hacking / theFullyUpturnedBin.html

pour une réponse plus précise sur les problèmes liés aux processus Ruby de longue durée, voir http: // zdavatz .wordpress.com / 2007/07/18 / heap-fragmentation-in-a-running-ruby-process /

Peut-être pourriez-vous essayer passager (mod_rails) http: // nubyonrails .com / articles / demandez à votre médecin à propos de mod_rails

Vous devriez jeter un coup d'œil à ruby-prof .

Basculez vers jruby et utilisez Eclipse Memory Analyzer . Il n'y a pas d'outil comparable pour Ruby pour le moment.

Maintenant, vous pouvez exécuter ce qui suit pour obtenir la mémoire dans un format lisible par R. Je suppose que votre ligne de journal ressemble à:

1234567890 RAM USAGE: 27456K

Exécuter ceci (ou modifier en suivant):

$ grep 'RAM USAGE' fubar.log | awk '{print s " " $1 " " $4; s++}' | sed 's/K//g' > mem.log

Ensuite, vous pouvez exécuter ceci:

#!/bin/sh
rm -f mem.png
R --vanilla --no-save --slave <<RSCRIPT
    lst <- read.table("mem.log")
    attach(lst)
    m = memory / 1024.0
    summary(m)
    png(filename="mem.png", width=1024)
    plot(date, m, type='l', main="Memory usage", xlab="time", ylab="memory")
RSCRIPT

et obtenez un beau graphique.

Ces pierres précieuses ont fonctionné pour moi:

MemoryLogic

  

Ajoute l’identifiant de processus et l’utilisation de la mémoire dans vos journaux rails, ce qui est idéal pour localiser les fuites de mémoire

Oink

  

Connectez l'analyseur pour identifier les actions qui augmentent considérablement la taille du segment de mémoire virtuelle

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top