Почему первый доступ к файлу JSP занимает больше времени в Google App Engine? - PullRequest
2 голосов
/ 17 марта 2010

Вот мой тест: я получаю доступ к сервлету, чтобы загрузить JVM (принять запрос на загрузку). Затем я получаю доступ к JSP, в котором есть <%= 5+7 %> и ничего больше. Первый доступ к этому JSP использует 350 мс процессорного времени и имеет задержку 200 мс. Последующие обращения имеют только время ожидания и время процессора около 20 мс.

Почему первый доступ к jsp после запуска контейнера сервлета занимает больше времени?

РЕДАКТИРОВАТЬ: обратите внимание, что Google App Engine предположительно прекомпилирует JSPS. Я вижу в выводе консоли, когда я загружаю свое приложение Initializing precompilation....

РЕДАКТИРОВАТЬ: это первый доступ к любому JSP, а затем последующий доступ, даже если это другой JSP не займет много времени. Это как если бы система JSP выполняла какую-то загрузку или что-то в этом роде.

Кроме того, это не запрос на загрузку, я сначала обращаюсь к сервлету, прежде чем получить доступ к JSP, чтобы принять запрос на загрузку. Кроме того, никакие запросы на загрузку никогда не используют меньше 500 мс процессорного времени.

1 Ответ

4 голосов
/ 17 марта 2010

JSP компилируется в класс, расширяющий HttpServlet при первом доступе / запросе. Некоторые сервлет-контейнеры будут компилировать его непосредственно во время запуска (или настраивать на него), чтобы вы не заметили «отставание». Другие не поддерживают его, и вам необходимо предварительно скомпилировать файлы JSP и развернуть вместе с ним вашу WAR.

Я никогда не использовал его, поэтому я не могу ответить с самого начала, но быстрый взгляд на его FAQ по Java узнает, что вы можете включить прекомпиляцию при запуске добавив следующую запись в appengine-web.xml файл:

<precompilation-enabled>true</precompilation-enabled>

Обновление : согласно разделу Производительность документации appengine, оно, по-видимому, ускоряет (и выключает) JVM по требованию, что может вызывать "загрузочные запросы". Вот выдержка из документации :

Что такое запрос на загрузку?

Некоторые запросы выполняются медленнее, потому что приложение Движок должен создать новую Java виртуальная машина для обслуживания запрос. Мы называем такой запрос, Запрос на загрузку. Во время загрузки запрос, ваша заявка проходит инициализация (например, загрузка классов, JIT-компиляция и т. Д.), Которая вызывает просьба занять больше времени.

Для медленных запросов, которые уже близко к запросу App Engine срок, дополнительная инициализация может протолкнуть его за крайний срок, в результате чего DeadlineExceededException. Что вызывает запросы на загрузку?

App Engine раскручивает JVM по требованию, поэтому Есть несколько причин, почему вы можете получить запрос на загрузку:

  1. Вы только что загрузили новую версию своего приложения.
  2. Ваше приложение может не получать трафик.
  3. Ваш трафик стал достаточно высоким, чтобы для масштабирования потребовалась другая JVM.

Вы можете ожидать, что во время курса разработки вашего приложения, вы будет часто испытывать первые два сценарии. Для сравнения, для производственное приложение получает даже очень небольшое, но стабильное количество трафика, запросы на загрузку относительно нечастый.

Другими словами, это не решается никаким программным способом. Либо просто живите с ним, либо рассмотрите выделенный сервер с полноценным сервлет-контейнером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...