2012-11-17 7 views
5

So habe ich diese Schiene App mit einem schrecklichen Speicher-Leck-Problem. Ich betreibe es auf Heroku, und während der letzten paar Tage, während ich versucht habe herauszufinden, was um alles in der Welt es verursacht, musste ich die App ständig alle 5 Stunden neu starten oder der Speicher überschreitet 512 und Meine App stürzt ab.Memory Leak in Schienen App ... String Albtraum

Ich benutze Oink, und ich sehe nichts fischiges mit meinen instanziierten Klassen. Die einzige Sache ist, dass mit jeder Seitenladung der verwendete Speicher schleicht. Es spielt keine Rolle, welche Seite ich lade, es ist scheinbar zufällig.

New Relic war auch nicht viel Hilfe, da es nicht mit einer bestimmten Controller-Aktion zu tun hat.

Das einzige, was ich finden konnte, war mit ObjectSpace, die eine enorme Anzahl von String-Objekten im Speicher ergab, und die Zahl wächst und wächst. Ich benutzte ein kleines Werkzeug, um den Wert der Zeichenfolgen zu protokollieren, und sie sind alle leer. Nicht Null ... aber Leerzeichen. Meine Produktions-App hat regelmäßig mehr als 200.000 String-Objekte im Einsatz.

Hat jemand eine Idee, woraus diese möglicherweise kommen könnten? Das ist wirklich anstrengend, dass ich alle fünf Stunden an meinem Computer sein muss, um meine Seite am Leben zu erhalten.

Danke!

+1

Es ist schwer, einen konkreten Ratschlag zu geben, außer nur Code zu entfernen, bis Sie das kleinstmögliche Beispiel haben, das das Problem aufweist. –

+0

Und es auf einem alternativen Server ausführen, und es mit konstanten CURL-Anforderungen zu schlagen, bis Sie repro können. – peterept

+0

Hinweis: Tun Sie nicht 'String = String1 + String2', noch' String + = String1'. Do: 'string << string 1', auf diese Weise wird kein zusätzlicher String erzeugt – apneadiving

Antwort

8

Okay, das ist absolut lächerlich, aber nach zwei Wochen der Angst und Kampf, fand ich die Lösung für dieses Leck. Es buchstäblich kamen alle auf diese eine Zeile nach unten:

ActionMailer::Base.delivery_method = :smtp 

in meiner application.rb Konfigurationsdatei.

Es hätte sein müssen:

config.action_mailer.delivery_method = :smtp 

Ich habe keine Ahnung, wie ich es falsch, aber Junge hat es verheerend auf meine App anrichten.

Weiß jemand, warum dies ein solches Problem verursachen würde? Ich verlor ungefähr ein Megabyte Speicher bei jeder einzelnen Abfrage. Verrückt.

+1

Dank dafür haben Sie wahrscheinlich gerade mir einige ernsthafte Kopfschmerzen gerettet. – tyler

+1

Wie hast du das herausgefunden? Meine Rails-App macht Strings wie verrückt und ich habe keine Ahnung, wie man verfolgt, was sie erzeugt. –

+2

@MihaRekar war es schrecklich. Ich musste buchstäblich durch monatelange Commits in die Zeit zurückgehen, jeden einzelnen laden und booten und dann den Server mit Anfragen mit dem Apache-Benchmark-Tool hämmern, bis ich die Revision gefunden hatte, die keine Probleme hatte.Dann entfernte ich Stück für Stück jede Änderung, bis ich diejenige gefunden hatte, die das Leck zum Stillstand gebracht hatte. Es hat Tage gedauert. –