2012-04-29 13 views
6

Znacznie poprawiłem mój kod i teraz wszystkie interfejsy API działają naprawdę szybko, dodałem też memcache i mam świetny stosunek trafień .. Ale czasami dostaję bezsensowne opóźnienia.Google App Engine dziwne opóźnienie

Załączam tutaj najważniejszy zrzut ekranu z Appstats: łącznie ponad 20 sekund, aby uruchomić 90 ms RPC; Jak to jest możliwe? Gdzie powinienem szukać, skąd pochodzą te opóźnienia?

Naprawdę utknąłem, ponieważ nie rozumiem, co dzieje się między RPC i nie wiem, co jeszcze mogę zrobić, aby uzyskać więcej informacji.

Tylko jedna myśl: każde połączenie HTTP jest obsługiwane przez tę samą instancję GAE, prawda? Ponieważ moje instancje zajęło dużo czasu, aby się rozgrzać .. Ale nie sądzę, że jest to powiązane

BTW: Koduję w Javie.

appstats statistics

Odpowiedz

2

Zwykle nierozliczone dla "dziury" w środku appstats jest wykonywanie kodu.
Appstats rejestruje każdy wpis rpc i kończy działanie, a obszary, których nie może on zarejestrować, są rzeczywistymi uruchomionymi kodami.

Czy masz dzienniki na czas, w którym aplikacja znajdowała się między tymi dwoma połączeniami?

+0

dziękuję shay ... tak, loguję dużo rzeczy log.fine (..), więc powinienem włączyć poziom, a następnie spójrz jeszcze raz. –

+0

co nie jestem przekonany 100% jest to, że wywołanie HTTP jest obsługiwane przez różne wystąpienia. Czy to możliwe? Ponieważ może to być kolejny problem ze względu na długi czas spędzony na rozgrzewaniu nowej instancji! –

+0

@MicheleOrsi nie można przeskoczyć instancji podczas wykonywania obsługi –

2

Huge 'niewyjaśnione' latency jest prawie zawsze rozgrzewka żądań wydziobujących zasobów. Sprawdź dzienniki appengine, aby zobaczyć, ile api_ms i cpu_ms są używane podczas rozgrzewek.

Można uniknąć rozgrzewania, zwiększając maksymalne opóźnienie w panelu sterowania aparatem. Zezwolenie na większe opóźnienie oznacza, że ​​żądania będą czekać dłużej przed uruchomieniem nowej instancji. Może to spowodować, że każde żądanie będzie trochę wolniejsze, ale unikniesz dużych żądań ładowania.

Aby pomóc wniosków Warmup, upewnij się, że AppEngine-web.xml posiada:

<warmup-requests-enabled>true</warmup-requests-enabled> 

Spowoduje dyspozytora AppEngine do zapobiegawczo odpalić nowe przypadki, gdy obecne te są przeciążone {tj zaczyna się ładowanie, zanim żądanie trafi do nowej instancji}.

następnie, w dotkniętych wolnych apletów, upewnij się umieścić ładunek na starcie w web.xml:

<servlet> 
    <servlet-name>my-servlet</servlet-name> 
    <servlet-class>com.company.MyServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

obciążenie na starcie jedynie zapewnia, że ​​o wysokim priorytecie serwlety są zawsze gotowe od razu po zakończeniu żądania rozgrzewania.

+0

Dziękuję, ale już robię wszystkie twoje sugestie: włączanie żądań warmup, ładowanie przy uruchamianiu i moje oczekiwanie na opóźnienie jest ustawione na 11,5 s - automatyczne .. –

+0

Czy możesz ponownie uruchomić test i obejrzeć, jak wiele instancji jest uruchamianych? Sprawdź, czy w dziennikach pojawiają się żądania ładowania i ile z nich. Co więcej, strzelasz do wszystkich swoich rpcs w tym samym czasie? Jeśli twoja przeglądarka ma otwarte więcej niż dwa połączenia, będzie blokować oczekujące, co może spowodować blokadę serwletów. Zobacz również prośby w firebug, aby sprawdzić, czy możesz wybrać, które wnioski przesuwają Cię do 20 na 90 ms żądań. – Ajax

+0

Także oczekująca latencja wynosząca 11,5 s oznacza, że ​​każde połączenie może mieć opóźnienie przekraczające 10 sekund. Zmierz swoje żądania ładowania. Jeśli jedno żądanie ładowania ma wartość 15 s, a maksymalne opóźnienie to 11 s, pierwsze żądanie ładowania będzie czekać 10 sekund, a następnie kolejne 15 sekund, aby uruchomić nowe wystąpienie.Możesz wyłączyć opóźnienia i po prostu ugryźć punkt na żądanie ładowania. – Ajax