ruby / ruby on rails wykrywanie wycieków pamięci
Napisałem małą aplikację internetową używającą ruby on rails, jej głównym celem jest przesyłanie, przechowywanie i wyświetlanie wyników z plików xml(pliki mogą mieć nawet kilka MB). Po uruchomieniu przez około 2 miesiące zauważyłem, że proces kundel zużywa około 4GB pamięci. Zrobiłem kilka badań na temat debugowania wycieków pamięci ruby i nie mogłem znaleźć zbyt wiele. Mam dwa pytania.
- czy są jakieś dobre narzędzia, które można wykorzystać do znalezienia wycieków pamięci w Ruby/rails?
- Jaki rodzaj wzorców kodowania przyczyną wycieków pamięci w ruby?
7 answers
Kilka wskazówek, jak znaleźć wycieki pamięci w Railach:
- Użyj wtyczkiBleak House
- zaimplementuj monitorowanie Scout w szczególności profiler użycia pamięci
wdrożenie monitoringu FiveRuns- spróbuj innego simple memory usage logger
Pierwszy to graficzna eksploracja wykorzystania pamięci przez obiekty w przestrzeni obiektów.
Dwa ostatnie pomogą Ci zidentyfikować konkretne wzorce użytkowania, które są pompowanie zużycia pamięci i możesz stamtąd pracować.
Jeśli chodzi o konkretne wzorce kodowania, z doświadczenia trzeba obserwować wszystko, co dotyczy plików io, przetwarzania obrazu, pracy z masywnymi strunami i tym podobne.
Chciałbym sprawdzić, czy używasz najbardziej odpowiedniej biblioteki XML - rexml jest znany z powolnego i uważanego za nieszczelny (nie mam na to dowodów!). Sprawdź również, czy możesz zapamiętać drogie operacje.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-01 10:19:11
Super prosta metoda logowania użycia pamięci po lub przed każdym żądaniem (tylko dla Linuksa).
#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
Możesz załadować skrypt / konsolę i najpierw wypróbować instrukcję, aby upewnić się, że działa na twoim pudełku.
puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip
Następnie po prostu monitor top, gdy żądanie sprawia, że zużycie pamięci skoczyć, idź sprawdzić dzienniki. To oczywiście pomoże tylko wtedy, gdy masz wyciek pamięci, który występuje w dużych skokach, a nie małych przyrostach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 19:46:52
Wyciek pamięci jest problemem w obecnej implementacji ruby dobrym miejscem do rozpoczęcia o tym jest
http://whytheluckystiff.net/articles/theFullyUpturnedBin.html Whytheluckystiff website doesn ' t existing but You can find the original article here: http://viewsourcecode.org/why/hacking/theFullyUpturnedBin.html
Aby uzyskać bardziej szczegółową odpowiedź na problemy z długotrwałymi procesami ruby zobacz http://zdavatz.wordpress.com/2007/07/18/heap-fragmentation-in-a-long-running-ruby-process/
Może mógłbyś dać pasażera (mod_rails) spróbować http://nubyonrails.com/articles/ask-your-doctor-about-mod_rails
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-02 08:43:52
Powinieneś rzucić okiem na ruby-prof .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-10 14:47:53
Przełącz się na jruby i użyj Eclipse Memory Analyzer. W tej chwili nie ma porównywalnego narzędzia do Rubiego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-10 15:35:45
Teraz, możesz uruchomić następujące, aby uzyskać pamięć w formacie, który R może odczytać. Zakładam, że Twoja linia logu wygląda następująco:
1234567890 RAM USAGE: 27456K
Uruchom to (lub zmodyfikuj do suite):
$ grep 'RAM USAGE' fubar.log | awk '{print s " " $1 " " $4; s++}' | sed 's/K//g' > mem.log
Następnie możesz uruchomić to:
#!/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
I uzyskać ładny wykres.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 08:46:26
Te perełki zadziałały dla mnie:
Dodaje w logach rails identyfikator procesu i użycie pamięci, idealne do śledzenia wycieków pamięci
Log parser do identyfikacji działań, które znacznie zwiększają rozmiar sterty maszyn wirtualnych
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-17 21:03:00