2009-10-28 2 views
1

Je rencontre des problèmes avec un processus Ruby de longue vie sur notre serveur, qui ne nettoie pas Tempfiles. J'utilise hijack pour injecter dans le processus & inspecter les choses, en utilisant, par exemple,Débogage de la corbeille de Ruby

ObjectSpace.each_object(ActiveRecord::Base){|o| puts o} 

- se révèle que les tempfiles en question sont référencées par une instance de l'un de nos sous-classes ActiveRecord, et les les instances ne sont pas collectées.

Je n'ai pas été capable de comprendre ce qui référençait ces instances AR & en les gardant en vie. Des astuces pour accéder à n'importe quel graphe d'objet utilisé par le garbage collector?

Répondre

2

Le garbage collector de Ruby est un algorithme de balayage: pas marqué.

Voici quelques lectures sur le sujet du débogage des problèmes de mémoire GC: http://blog.evanweaver.com/articles/2009/04/09/ruby-gc-tuning/

Les seules choses dans votre application de rails qui sont à vie longue sont les classes et modules. Avec cela à l'esprit certains endroits à regarder sont:

1) sont ces instances de disques actifs étant amassés dans une variable classe 2) étant en quelque sorte mis en cache par middleware rack 3) étant maintenue sur le pool de connexion de base de données d'enregistrement actif 4) utilisez-vous des finaliseurs ruby ​​(connus pour des fuites de mémoire lorsqu'ils sont utilisés de manière incorrecte) voir eigenclass.org/hiki/deferred-finalizers-in-Ruby

Désolé de ne publier que quelques idées et quelques solutions. J'espère que cela vous fait penser à de nouvelles directions.

bénédictions, TWP

+0

Pouvons-nous obtenir une mise à jour cette réponse? Cet article est lié à certains correctifs et autres, mais ils sont tous pour Ruby 1.8. Merci beaucoup! –

Questions connexes