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
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!
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
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