détection de fuite de mémoire ruby ??/ ruby ??on rails
-
03-07-2019 - |
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?
La solution
Quelques conseils pour détecter les fuites de mémoire dans Rails:
- utilisez le Bleak House plug-in
- implémentez la surveillance de Scout en particulier le profileur d'utilisation de la mémoire
-
implémente la surveillance FiveRuns - essayez un autre enregistreur d'utilisation de la mémoire simple
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:
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
Connectez l'analyseur pour identifier les actions qui augmentent considérablement la taille du segment de mémoire virtuelle