2012-11-17 12 views
5

Więc mam tę aplikację szyny z okropnym problemem wycieku pamięci. Używam go na Heroku, i przez ostatnie kilka dni, gdy próbowałem dowiedzieć się, co na ziemi powoduje to, musiałem ciągle restartować aplikację co 5 godzin lub pamięć przekracza 512 i moja aplikacja się zawiesza.Wyciek pamięci w Rails App ... string koszmar

Używam Oink i nie widzę niczego podejrzanego w moich instancjach. Jedyne, co się dzieje, to to, że przy każdym ładowaniu strony wykorzystywana pamięć skacze do góry. Nie ma nawet znaczenia, którą stronę ładuję, jest pozornie przypadkowa.

Nowy Relik również nie był przydatny, ponieważ nie ma nic wspólnego z konkretną akcją kontrolera.

Jedyne, co udało mi się znaleźć, to użycie ObjectSpace, która ujawniła ENORMOUS liczbę obiektów string w pamięci, a liczba po prostu rośnie i rośnie. Użyłem małego narzędzia do zarejestrowania wartości łańcuchów i wszystkie są puste. Nie zero ... ale białe spacje. Moja aplikacja produkcyjna regularnie korzysta z ponad 200 000 obiektów ciągów.

Czy ktoś ma pojęcie, z czego mogą pochodzić? To naprawdę podkreśla, że ​​muszę być na moim komputerze co pięć godzin, żeby utrzymać moją stronę przy życiu.

Dzięki!

+1

Trudno podać konkretną poradę, poza usuwaniem kodu, dopóki nie uzyskasz najmniejszego możliwego przykładu, który pokazuje problem i opublikujesz go pod postacią –

+0

. Uruchom go na alternatywnym serwerze i uderzaj go ciągłymi żądaniami CURL, aż do momentu, kiedy będziesz mógł je zaimportować. – peterept

+0

rada: nie rób "string = string1 + string 2", ani 'string + = string1'. Wykonaj: 'ciąg << ciąg 1', w ten sposób nie jest tworzony dodatkowy ciąg znaków – apneadiving

Odpowiedz

8

Okay, to jest absolutnie niedorzeczne, ale po dwóch tygodniach niepokoju i zmagań znalazłem rozwiązanie tego przecieku. Dosłownie wszystko sprowadzało się do tej jednej linii:

ActionMailer::Base.delivery_method = :smtp 

w moim pliku konfiguracyjnym application.rb.

To powinno być:

config.action_mailer.delivery_method = :smtp 

nie mam pojęcia jak mam to źle, ale chłopiec nie siać spustoszenie na mojej aplikacji.

Czy ktoś wie, dlaczego spowodowałoby to taki problem? W każdym pojedynczym zapytaniu traciłem około megabajta pamięci. Zwariowany.

+1

Dzięki za to, prawdopodobnie właśnie uratowałeś mi jakiś poważny ból głowy. – tyler

+1

Jak to rozgryzłeś? Moja aplikacja Railsy sprawia, że ​​Strings jest szalony i nie mam pojęcia, jak śledzić, co je tworzy. –

+2

@MihaRekar to było okropne. Dosłownie musiałem cofnąć się w czasie przez miesiące zatwierdzeń, ładując i uruchamiając każdy z nich, a następnie uderzając serwer żądaniami za pomocą narzędzia testowego Apache, dopóki nie znalazłem wersji, która nie miała żadnych problemów.Potem po kolei usuwałam każdą zmianę, aż znalazłam tę, która spowodowała zatrzymanie wycieku. Zajęło to kilka dni. –