2012-11-09 19 views
15

Ich habe eine Rails 3.2.8 App läuft auf Heroku Cedar mit Ruby 1.9.3. Die App läuft gut, wenn sie gestartet wird, aber nach ungefähr einem Tag ununterbrochener Verwendung, sehe ich R14-Fehler in meinen Protokollen. Sobald die Speicherfehler beginnen, gehen sie nicht mehr verloren, auch wenn die App mehrere Stunden nicht benutzt wird.Wie kann ich ein Speicherleck auf Heroku finden?

Sollte der Garbage Collector nach einer Weile nicht mehr benötigte Objekte bereinigen und die Speicherlast reduzieren? Es scheint, dass dies auf Heroku nicht passiert. Im Allgemeinen beginnt die Speicherauslastung nach dem Ausführen einiger Berichte mit mehreren tausend Datenzeilen zu steigen, obwohl die Ergebnisse paginiert werden.

Wie kann ich das Speicherleck finden? Plugins wie dreek_house sind veraltet oder laufen in der Heroku-Umgebung nicht gut. Kann ich die GC-Einstellungen anpassen, um sie aggressiver zu machen?

Antwort

5

Der GC sollte die Säuberung tun, und tut es wahrscheinlich.

Sie können den GC mit GC.start erzwingen; wenn viele Objekte nicht gesammelt wurden, wird dies, aber ich vermute, dass das nicht das Problem ist.

Ist es möglich, dass Sie irgendwie eine Reihe von Objekten erstellen und diese niemals freigeben, indem Sie zwischengespeicherte Kopien behalten oder so?

Ich bin nicht vertraut mit den vorhandenen Tools, um dies zu überprüfen, aber Sie können überprüfen, welche Objekte existieren mit ObjectSpace. Zum Beispiel:

ObjectSpace.each_object.with_object(Hash.new(0)){|obj, h| h[obj.class] +=1 } 
# => a Hash with the number of objects by class 

Wenn Sie eine unerwartete Zahl für ein Ihre Klassen, zum Beispiel bekommen, müßten Sie eine bessere Vorstellung davon, wo zu suchen.

-1

Installieren Sie das Add-on New Relic. Es enthält eine Reihe nützlicher Messwerte, mit denen Sie die Ursache des Lecks ermitteln können. Ich denke, es ist im Allgemeinen eine bessere Idee zu versuchen, um zu sehen, welcher Teil des Codes am längsten dauert, und vielleicht versuchen, das zu optimieren, anstatt den GC ganz zu optimieren.

Einige der nützlichen Funktionen, die New Relic bietet, sind zum Beispiel die Quelle der am längsten laufenden SQL-Abfrage. Ich ermutige Sie, es zu versuchen.

+2

Ich habe ein neues Relikt installiert, aber es gibt mir nicht den Grad an Detail, den ich brauche –

+1

newrelic ist ziemlich nutzlos, um Speicherprobleme zu beheben. Es gibt Ihnen einige GC-Informationen, aber nichts, um ein Problem zu identifizieren. – 2mia

+0

Einverstanden. NewRelic ist hilfreich für viele Dinge, aber das Debugging von Speicherlecks gehört nicht dazu. – bloudermilk

Verwandte Themen