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

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

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

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

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

Кстати: я пишу на Java.

статистика appstats

2 ответа

Решение

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

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

Огромные, "необъяснимые" задержки почти всегда сводят запросы к прогреву ресурсов. Изучите журналы вашего устройства, чтобы узнать, сколько 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 просто гарантирует, что ваши высокоприоритетные сервлеты всегда готовы к работе, как только закончится запрос на разогрев.

Другие вопросы по тегам