Frage

Ich schrieb eine kleine web-app mit ruby, ruby on rails, Ihr Hauptzweck ist das hochladen, speichern und anzeigen der Ergebnisse von xml-Dateien(kann bis zu mehreren MB) Dateien.Nach dem ausführen von etwa 2 Monaten habe ich bemerkt, dass der Bastard Prozess war mit über 4 GB Speicher.Ich habe einige der Forschung auf Debuggen von ruby memory-leaks und konnte nicht viel.Also ich habe zwei Fragen.

  • Gibt es irgendwelche guten Werkzeuge, die verwendet werden können, zum Auffinden von Speicherlecks in Ruby/rails?
  • Welche Art der Kodierung Muster Ursache von Speicherlecks in ruby?
War es hilfreich?

Lösung

Einige Tipps Speicherlecks in Rails zu finden:

Die erste ist eine graphische Erforschung der Speichernutzung durch Objekte im Object.

Die letzten beiden helfen Ihnen, bestimmte Nutzungsmuster zu identifizieren, die Speichernutzung aufblasen, und Sie können von dort aus arbeiten.

Wie für bestimmte Codierung-Muster, aus Erfahrung haben Sie etwas zu sehen, die mit Datei io, Bildverarbeitung zu tun hat, die Arbeit mit massiven Saiten und dergleichen.

Ich würde überprüfen, ob Sie die am besten geeignete XML-Bibliothek verwenden - REXML bekannt ist langsam und angenommen wird, dass undicht zu sein (ich habe keinen Beweis dafür!). Prüfen Sie auch, ob Sie können memoize teure Operationen.

Andere Tipps

Eine super einfache Methode Speichernutzung zu protokollieren nach oder vor jeder Anfrage (nur für 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

Sie mögen vielleicht Skript / Konsole laden und versuchen, zunächst die Anweisung, um sicherzustellen, dass es auf Ihrem System funktioniert.

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

Dann einfach oben überwachen, wenn eine Anforderung Speicherauslastung Sprung macht, gehen die Protokolle überprüfen. Dies wird natürlich nur helfen, wenn Sie einen Speicherverlust haben, die in großen Sprüngen auftreten, nicht winzig-Schritte.

Speicherleck ist ein Problem in der aktuellen Ruby-Implementierung ein guter Anfang dieser ist http://whytheluckystiff.net/articles/theFullyUpturnedBin.html Whytheluckystiff Website existiert nicht mehr, aber Sie können den Originalartikel finden Sie hier: http: // viewsourcecode. org / warum / Hacking / theFullyUpturnedBin.html

für eine bestimmte Antwort auf Probleme mit langen Laufe Rubin Prozesse sehen http: // zdavatz .wordpress.com / 2007/07/18 / Heap-Fragmentierung-in-a-long-running-Rubin-Prozess /

vielleicht könnten Sie Passagier (mod_rails) einen Versuch geben http: // nubyonrails .com / articles / ask-your-Arzt-zu-mod_rails

Sie sollten einen Blick geben ruby-prof .

Zur jruby und verwenden Sie die Eclipse-Memory Analyzer . Es gibt kein vergleichbares Werkzeug für Ruby im Moment.

Nun können Sie die folgenden Funktionen erhalten die Speicher in einem Format ausführen, die R lesen kann. Ich gehe davon aus, dass Ihre Log-Zeile wie folgt aussieht:

1234567890 RAM USAGE: 27456K

Führen Sie diese (oder Suite ändern):

$ grep 'RAM USAGE' fubar.log | awk '{print s " " $1 " " $4; s++}' | sed 's/K//g' > mem.log

Dann können Sie diese ausführen:

#!/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

und einen schönen Graphen erhalten.

Diese Edelsteine für mich gearbeitet:

MemoryLogic

Fügt bei Prozess-id und der Speichernutzung in Ihre rails-Protokolle, ideal für das aufspüren von Speicherlecks

Quiek

Log parser, die Handlungen zu identifizieren, die signifikant höhere VM-heap-Größe

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top