2011-01-31 11 views
6

Mam aplikację Sinatra rubinowa produkcji działającą na nginx/pasażerze, a często widzę, że żądania zostają w niewytłumaczalny sposób zatrzymane. Napisałem skrypt, aby wywoływać status pasażera na mojej grupie maszyn co dziesięć sekund i narysować wyniki na wykresie. To, co widzę:Jak uzyskać ślad stosu na wszystkich uruchomionych rubinowych pasach na pasażerach

enter image description here

Niebieska linia pokazuje kolejkę globalnej czeka wybijanie stale do 60. Jest to średnia na 4 komputerach, więc gdy niebieska linia uderza 60, oznacza to, że każda maszyna jest zapełniony na zewnątrz. Mam bieżący parametr passenger_max_pool_size ustawiony na 20, więc ma on 3-krotny maksymalny rozmiar puli, a następnie prawdopodobnie upuszcza kolejne żądania.

Moja aplikacja zależy od dwóch kluczowych zewnętrznych zasobów - zaplecza mysql Amazon RDS i instancji Redis. Być może któryś z nich okresowo staje się powolny lub nie odpowiada, co powoduje takie zachowanie?

Czy ktoś może mi doradzić, jak uzyskać ślad stosu, aby sprawdzić, czy wąskim gardłem nie jest Amazon RDS, Redis, czy coś innego?

Dzięki!

Odpowiedz

4

Wyjaśniłem to - miałem parametr konfiguracyjny SAVE w Redis, który był uruchamiany raz na minutę. Najwyraźniej operacje rozwidlenia/zapisywania redis blokują moją aplikację. Zmieniam parametr konfiguracyjny na "3600 1", co oznacza, że ​​zapisuję swoją bazę danych tylko raz na godzinę, co jest OK, ponieważ używam jej jako pamięci podręcznej (dane utrzymują się w MYSQL).

+0

mogę wiedzieć, jak długo było to czekanie? AFAIK, auto-save powinien znajdować się w tle i powinien opóźniać tylko wtedy, gdy kopiuje strony pamięci, które powinny znajdować się na górze 300ms. – seppo0010

+0

Empirycznie, wydaje się, że mój węzeł redis blokowałby się przez kilka sekund, powiedziałbym, że widziałem około 5-10 sekund blokowania w dowolnym danym okresie 60 sekund. Zamierzam spróbować rozpędzić niewolnika i użyć niewolnika, by go uratować. – esilver

0

Aby odpowiedzieć na pierwotne pytanie, możliwe jest uzyskanie "wszystkich śladów stosu" dla bieżących procesów rubinowych, którymi zajmuje się pasażer. Zasadniczo wysłać wiadomość SIGQUIT do każdego z nich, a oni wypluć wszystkie ich śledzenia wstecznego do pliku dziennika Apache/nginx, ex:

https://gist.github.com/rdp/905759f88134229c2969b9f242188615

Powiązane problemy