46 votes

ruby/ruby on rails détection des fuites de mémoire

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

  • Existe-t-il de bons outils permettant de trouver les fuites de mémoire en Ruby/rails ?
  • Quel type de codage provoque des fuites de mémoire dans Ruby ?

40voto

Dave Nolan Points 2280

Quelques conseils pour trouver 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'espace objet.

Les deux dernières vous aideront à identifier les schémas d'utilisation spécifiques qui gonflent l'utilisation de la mémoire, et vous pourrez travailler à partir de là.

En ce qui concerne les modèles de codage spécifiques, l'expérience montre qu'il faut surveiller tout ce qui concerne les fichiers, le traitement des images, le travail avec des chaînes de caractères massives, etc.

Je vérifierais que vous utilisez la bibliothèque XML la plus appropriée - ReXML est connue pour être lente et réputée pour ses fuites (je n'en ai aucune preuve !). Vérifiez également si vous pouvez memoize des opérations coûteuses.

9 votes

Le post pour Bleak House date de 2007, est-ce encore une option valable aujourd'hui ?

22voto

Daniel Beardsley Points 6802

Une méthode super simple pour enregistrer l'utilisation de la mémoire après ou avant chaque requête (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 pourriez vouloir charger script/console et essayer l'instruction d'abord pour vous assurer qu'elle fonctionne sur votre machine.

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

Puis, lorsque l'utilisation de la mémoire augmente à cause d'une requête, vérifiez les journaux. Bien sûr, cela ne sera utile que si vous avez une fuite de mémoire qui se produit par grands sauts, et non par petits incréments.

0 votes

D'où vient la méthode log_ram ?

7 votes

Sous osx vous pouvez utiliser vmmap #{Process.pid}

6voto

Jean Points 9655

Les fuites de mémoire sont un problème dans l'implémentation actuelle de Ruby. Un bon point de départ pour aborder ce sujet est le suivant http://whytheluckystiff.net/articles/theFullyUpturnedBin.html Le site Whytheluckystiff n'existe plus mais vous pouvez trouver l'article original ici : https://viewsourcecode.org/why/hacking/theFullyUpturnedBin.html

Pour une réponse plus spécifique sur les problèmes liés aux processus ruby longs, voir https://just.do/2007/07/18/heap-fragmentation-in-a-long-running-ruby-process/

vous pourriez peut-être essayer passenger (mod_rails) https://web.archive.org/web/20130901072209/http://nubyonrails.com/articles/ask-your-doctor-about-mod_rails

5voto

Vetal4eg Points 106

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

2voto

kohlerm Points 1672

Passez à jruby et utilisez le Analyseur de mémoire Eclipse . Il n'existe pas d'outil comparable pour Ruby à l'heure actuelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X