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?
Author: BalusC, 2008-10-02

7 answers

Kilka wskazówek, jak znaleźć wycieki pamięci w Railach:

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.

 37
Author: Dave Nolan,
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.

 17
Author: Daniel Beardsley,
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

 6
Author: Jean,
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 .

 5
Author: Vetal4eg,
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.

 2
Author: kohlerm,
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.

 2
Author: Sardathrion,
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:

MemoryLogic

Dodaje w logach rails identyfikator procesu i użycie pamięci, idealne do śledzenia wycieków pamięci

Oink

Log parser do identyfikacji działań, które znacznie zwiększają rozmiar sterty maszyn wirtualnych

 0
Author: nothing-special-here,
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