Google App Engine странная задержка
Я значительно улучшил свой код, и теперь все API работают очень быстро, я также добавил memcache и у меня отличный коэффициент попадания. Но иногда я получаю бессмысленные задержки.
Я прикрепил здесь самый значимый скриншот appstats: более 20 секунд для запуска 90 мс RPC; как это возможно? Где мне искать источник этих задержек?
Я действительно застрял, потому что я не понимаю, что происходит между RPC, и я не знаю, что еще я могу сделать, чтобы получить больше информации.
Просто мысль: каждый HTTP-вызов обрабатывается одним и тем же экземпляром GAE, верно? Потому что мои экземпляры потратили много времени на разогрев.. Но я не думаю, что это связано
Кстати: я пишу на Java.
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 просто гарантирует, что ваши высокоприоритетные сервлеты всегда готовы к работе, как только закончится запрос на разогрев.