ruby/ruby on rails memory-leak-detection
-
03-07-2019 - |
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?
Lösung
Einige Tipps Speicherlecks in Rails zu finden:
- verwenden, um die Bleak House Plugin
- Scout Überwachung speziell die Speichernutzung Profiler
-
implementieren FiveRuns Überwachung - versuchen Sie einen anderen
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:
Fügt bei Prozess-id und der Speichernutzung in Ihre rails-Protokolle, ideal für das aufspüren von Speicherlecks
Log parser, die Handlungen zu identifizieren, die signifikant höhere VM-heap-Größe