2014-10-13 14 views
8

Po wdrożeniu naszej aplikacji Rails (4.0.9, Ruby 2.1.2), zauważamy, że żądania do naszej aplikacji zawieszają się po pewnym czasie, zwykle około 1 dnia.Żądania utknęły w oprogramowaniu ActiveRecord :: QueryCache middleware

Korzystając z klejnotu rack_timer, jesteśmy w stanie dowiedzieć się, jakie wnioski utknęły w oprogramowaniu middleware ActiveRecord :: QueryCache.

Rack Timer (incoming) -- ActiveRecord::QueryCache: 925626.7731189728 ms 

Po usunięciu aplikacji wygląda na normalną. Rozumiem jednak, że celem tego oprogramowania pośredniczącego jest zwiększenie wydajności, więc usuwanie to tylko tymczasowe rozwiązanie. Używamy mysql (5.1.67) z adapterem mysql2 (0.3.13)

Aktualizacja: Zaraz po tym, jak opublikowałem to pytanie, serwer zaczął się zawieszać, tym razem żądania zablokowały się w ActionDispatch :: Routing :: RouteSet

I, [2014-10-13T23:17:03.661346 #32498] INFO -- : Rack Timer (Application Action) -- ActionDispatch::Routing::RouteSet: 3667661.2360477448 ms 
I, [2014-10-13T23:17:03.661946 #32498] INFO -- : Rack Timer (Application Action) -- ActionDispatch::Routing::RouteSet: 4373914.719343185 ms 

Czy wiesz, że może to spowodować jakikolwiek powód?

Z góry dziękuję.

+0

Sprawdź swoje drugie pytanie, odpowiedziałem tam. – Bowersbros

+1

Czy znalazłeś rozwiązanie? Mam ten sam problem z postgres na heroku. –

+1

Każda aktualizacja w tej sprawie? Zgodnie z kanałem jest "inne pytanie", ale nie mogę go znaleźć .. – jalagrange

Odpowiedz

1

Najbardziej prawdopodobną przyczyną jest utrata połączenia z bazą danych (zapora sieciowa, konfiguracja serwera ...) i Railsy nie zauważyły, więc upłynął limit czasu wewnątrz ActiveRecord::QueryCache. Gdy Rails zauważy, że połączenie zginęło, ponownie nawiązuje połączenie i kontynuuje wykonywanie.

Spróbuj ustawić parametr read_timeout w pliku database.yml na około 10 sekund i sprawdź ustawienia połączenia i serwera.

+0

Jeśli się nie mylę, gdy używany jest 'QueryCache', baza danych nie jest osiągnięta (dlatego jest to pamięć podręczna), więc myślę, że musi być związana z używaną implementacją pamięci podręcznej (' mem_cache', itp. ..) –

+0

Nawet jeśli nie jest używane, połączenie zostanie nawiązane, jeśli dobrze je zapamiętam, a problem "zawieszania się" może wystąpić w tej fazie. – fjyaniez

Powiązane problemy