Странная задержка Google App Engine

Я значительно улучшил свой код, и теперь все API работают очень быстро, я также добавил memcache, и у меня отличный коэффициент попадания. Но иногда у меня возникают бессмысленные задержки.

Я прикрепил сюда наиболее важный скриншот из статистики приложений: всего более 20 секунд для запуска 90 мс RPC; как это возможно? Где я должен искать источник этих задержек?

Я действительно застрял, потому что я не понимаю, что происходит между RPC, и я не знаю, что еще я могу сделать, чтобы получить больше информации.

Просто мысль: каждый вызов HTTP обрабатывается одним и тем же экземпляром GAE, верно? Потому что мои экземпляры долго прогревались.. Но не думаю, что это связано

Кстати: я кодирую на Java.

статистика приложений


person Michele Orsi    schedule 29.04.2012    source источник


Ответы (2)


Обычно неучтенная «дыра» в середине appstats — это выполнение вашего кода.
Appstats записывает каждый вход и выход rpc, а те области, которые он не может записать, — это ваш фактически выполняемый код.

У вас есть логи за время, в течение которого приложение находилось между этими двумя вызовами?

person Shay Erlichmen    schedule 29.04.2012
comment
спасибо, шай .. да, я много чего регистрирую с помощью log.fine(..), так что мне нужно просто включить уровень, а затем снова посмотреть. - person Michele Orsi; 30.04.2012
comment
в чем я не уверен на 100%, так это в том, что вызов HTTP обрабатывается разными экземплярами. Является ли это возможным? Потому что это может быть еще одна проблема, из-за длительного прогрева нового экземпляра! - person Michele Orsi; 30.04.2012
comment
@MicheleOrsi, вы не можете переходить к экземпляру во время выполнения обработчика - person Shay Erlichmen; 30.04.2012
comment
Ок, отлично! По крайней мере, большое спасибо: это хорошая отправная точка, чтобы начать пропускать проблемы с разминкой! ;) - person Michele Orsi; 30.04.2012

Огромная, «необъяснимая» задержка почти всегда связана с запросами на прогрев, поглощающими ресурсы. Просмотрите журналы appengine, чтобы узнать, сколько api_ms и cpu_ms используются при прогреве.

Вы можете избежать прогрева, увеличив максимальную задержку ожидания в панели управления appengine. Разрешение более высокой задержки означает, что запросы будут ждать дольше, прежде чем запускать новый экземпляр. Это может сделать каждый запрос немного медленнее, но вы избежите тяжеловесных запросов на загрузку.

Чтобы помочь с предварительными запросами, убедитесь, что ваш appengine-web.xml содержит:

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

Это заставит диспетчер appengine упреждающе запускать новые экземпляры, когда текущие перегружены (т.е. он начинает загружаться до того, как запрос перейдет к новому экземпляру}.

затем в затронутых медленных сервлетах убедитесь, что вы указали загрузку при запуске в своем файле web.xml:

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

load-on-startup просто гарантирует, что ваши высокоприоритетные сервлеты всегда будут готовы к работе, как только завершится запрос на прогрев.

person Ajax    schedule 29.04.2012
comment
Спасибо, но я уже выполняю все ваши предложения: прогрев-запросы-включены, загрузка-при-запуске и моя задержка ожидания установлена ​​на 11,5 с — автоматически.. - person Michele Orsi; 30.04.2012
comment
Можете ли вы запустить тест еще раз и посмотреть, сколько экземпляров запущено? Проверьте, получаете ли вы запросы на загрузку в журналах и сколько их. Кроме того, вы стреляете всеми своими RPC одновременно? Если в вашем браузере открыто более двух подключений, он заблокирует ожидающие подключения, что может привести к блокировке ваших сервлетов. Посмотрите также запросы в firebug, чтобы увидеть, сможете ли вы определить, какие запросы подталкивают вас к 20 с на 90 мс запросов. - person Ajax; 30.04.2012
comment
Кроме того, ожидающая задержка в 11,5 с означает, что каждое соединение может иметь задержку более 10 с. Измерьте ваши запросы на загрузку. Если один запрос на загрузку составляет 15 с, а максимальная задержка ожидания составляет 11 с, ваш первый запрос на загрузку будет ждать 10 с, а затем потребуется еще 15 с, чтобы запустить новый экземпляр. Возможно, вы захотите уменьшить ожидающую задержку и просто стиснуть зубы на запросах на загрузку. - person Ajax; 30.04.2012
comment
В данном случае это не прогрев — статистика приложения показывает, что RPC выполняются в начале запроса. - person Nick Johnson; 30.04.2012
comment
хорошо, @NickJohnson, спасибо; как предложил Шей, я начал профилировать другую часть своего кода, но я немного застрял в расширении appstats для Java с записью других событий, а не GAE RPC. Является ли это возможным? - person Michele Orsi; 30.04.2012
comment
Спасибо также @Ajax, но я думаю, что Ник исключил такую ​​возможность. - person Michele Orsi; 30.04.2012
comment
Если вы будете так любезны опубликовать график часов вашего экземпляра, некоторые журналы запуска или какой-нибудь исходный код этого процесса, я уверен между мной, Ником и всем StackOverflow, мы можем сократить эти 20 с до 5 с или меньше ;- } - person Ajax; 30.04.2012