2013-04-20 13 views
18

Obserwujemy niespójne wyniki na Heroku, które nie są związane z niedawnym problemem inteligentnego routingu jednorożca.Sporadyczne powolne żądania na Heroku

Jest to przykład żądania, które zwykle trwa ~ 150ms (i 19 z 20 razy to tyle, ile trwa). Widać, że na tę prośbę trwało to około 4 sekund lub od 1 do 2 rzędów wielkości dłużej.

enter image description here

kilka rzeczy do uwaga:

  • baza danych nie było wąskie gardło, a on spędził robi db odpytuje
  • mamy więcej niż wystarczające hamowni tylko 25ms, więc nie wiem myślę, że to było wąskie gardło (20 podwójnych dynama z jednorożcem z 5 pracownikami, otrzymujemy tylko 1000 żądań na minutę, średni czas odpowiedzi 150 ms, co oznacza, że ​​powinniśmy być w stanie obsłużyć (60/0,150) * 20 * 5 = 40 000 żądań na minutę, innymi słowy, mieliśmy 40-krotność pojemności na dynach podczas tego pomiaru był zabrany.

Zastanawiam się, co może powodować te sporadyczne powolne żądania. Jak już wspomniałem, wydaje się, że anegdotycznie dzieje się to w około 1 na 20 wniosków. Jedyne, co mogę wymyślić, to że na skrzynkach występuje problem głośnego sąsiada, lub warstwa routingu ma niespójną wydajność. Jeśli ktoś ma dodatkowe informacje lub pomysły, byłbym ciekawy. Dziękuję Ci.

+0

Jeśli to jest jakaś pociecha, również tego doświadczam i nie udało mi się znaleźć przyczyny konkretnego zastosowania. Kolejny punkt danych dla hałaśliwej teorii sąsiada? –

+0

Czy wypróbowałeś bilet wsparcia z Heroku? –

+0

Powracając do tego po dłuższej chwili, przedstawiamy * zwariowaną * teorię: ma to coś wspólnego z "sprawiedliwym udziałem procesora" Heroka i wirtualizacją, której używają, aby to osiągnąć. Aby udowodnić moją rację, możesz napisać mały fragment kodu, powiedzmy handler'a dla adresu URL '/ test'. W nim liczą do kilku milionów. Po prostu nagraj procesor. To * to * kończy się czasem 150 ms, a czasem 4 sekundy, wtedy to Heroku. –

Odpowiedz

9

Ja sam ścigałem podobny problem, niestety, jak dotąd nie miałem zbyt wiele szczęścia.

Przypuszczam, że pierwszym zleceniem firmy byłoby zalecenie NewRelic. W takich przypadkach może być trochę więcej informacji.

Po drugie, proponuję, abyś spojrzał na czasy kolejkowania: jak długo twoje żądanie było w kolejce. Spójrz na to w NewRelic lub zrób to sam z nagłówkiem HTTP "czas rozpoczęcia", który Heroku dodaje do Twojego przychodzącego żądania (wystarczy wydrukować teraz() minus "czas rozpoczęcia" jako czas twojej kolejki).

Kiedy te zawiodły mnie w moim przypadku Próbowałem wymyślanie rzeczy, które mogą pójść źle, a oto (nieortodoksyjne dziwne?) Wykaz:

1) DNS - Robisz jakieś połączenia DNS w Twój widok? Może to trochę potrwać. Nawet żądania DNS dla rozwiązywania DB nazwy hostów, nazw hostów Redis, usługodawców zewnętrznych, itp

2) Log wydajność - Heroku zbiera wszystkie swoje stdout przy użyciu ich „Logplex”, które następnie odprowadza do własnych określonych logdrains, usługi takie jak Papertrail, itp. Nie ma dokumentacji na temat tego, i zapisuje na standardowe wyjście z procesu może teoretycznie zablokować okresy, podczas których Heroku spuszcza wszelkie bufory, które może mieć.

3) Uzyskiwanie połączenia DB - nie masz pewności, z której struktury korzystasz, ale może masz pulę połączeń, z której uzyskujesz połączenia DB, i która zajęła dużo czasu? Nie pojawi się jako czas zapytania, będzie to czas blokowania procesu.

4) Wydajność Dyno - Heroku ma funkcję dodatkową, która będzie drukować, co kilka sekund, niektóre dane serwera (load avg, memory) na standardowe wyjście. Użyłem Graphite do wykreślenia tych wykresów i szukania korelacji pomiędzy danymi i czasami, w których widziałem zwiększone przypadki "sporadycznych powolnych żądań". To mi nie pomogło, ale może ci pomóc :)

Daj nam znać, co wymyślisz.

+2

Używamy NewRelic. Od czasu do czasu widzimy kolczaste czasy kolejkowania żądań http://cl.ly/image/112t2x1F3I1s Nie jestem pewien dlaczego, ponieważ powinniśmy być sposobem na pojemność na dynach (20 dynos, 5 pracowników na dyno, podwójne dynos, tylko ~ 1000 żądań na minuta). Twoja lista podejrzanych wygląda dobrze. Czuję, że problem nadal występuje w warstwie routingu, ale to tylko domysły. –

+0

@Brian - Z ciekawości, dlaczego masz 20 GB serwerów aplikacji za 1000 req/min? To tylko 16-17 req/sec. Czy czasami dostajesz olbrzymi skok 10 razy? (Edycja: nieważne, po prostu zdałem sobie sprawę, że uruchamiasz bazę monet ... niesamowite, ale łatwo dostrzec, skąd bierze się ta skala!) Czy zdarzyło Ci się też znaleźć powód powolnych próśb? Mam ten sam problem (około 1 z 3 zapytań do podstawowego widoku (bez dostępu do bazy danych) jest bardzo powolny) i to doprowadza mnie do szału. – orokusaki