Java - первый http-запрос к определенному хосту значительно медленнее

Я пишу инструмент бенчмаркинга для работы с веб-приложением. Проблема, с которой я сталкиваюсь, заключается в том, что первый запрос к серверу всегда занимает значительно больше времени, чем последующие запросы. У меня возникла эта проблема с http-клиентом apache 3.x, 4.x и https://code.google.com/p/google-http-java-client/. HTTP-клиент apache 4.x показывает самую большую разницу (первый запрос занимает примерно в семь раз больше времени, чем последующие. Для Google и 3.x это примерно в 3 раза дольше.

Мой инструмент должен иметь возможность сравнивать одновременные запросы с потоками. Я не могу использовать один экземпляр, например. HttpClient и вызовите его из всех потоков, так как это вызывает исключение Concurrent. Поэтому мне приходится использовать отдельный экземпляр в каждом потоке, который будет выполнять только один запрос. Это резко меняет общие результаты.

Я не понимаю такого поведения. Я не думаю, что это связано с механизмом кэширования на сервере, потому что а) рассматриваемое веб-приложение не использует кэширование (насколько мне известно) и б) этот эффект также виден при первом запросе www.hostxy.com, а затем www.hostxy.com/my/webapp.

Я использую System.nanoTime() непосредственно до и после вызова client.execute(get) или get.execute() соответственно.

Кто-нибудь знает, откуда такое поведение? Выполняют ли сами эти httpclients какое-либо кэширование? Буду очень благодарен за любые подсказки.


person feob    schedule 02.04.2013    source источник


Ответы (4)


Прочитайте это: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html для объединения соединений.

Ваше первое соединение, вероятно, занимает больше всего времени, потому что это соединение Connect: keep-alive, поэтому следующие соединения могут повторно использовать это соединение после его установки. это просто предположение

person Sascha Kaestle    schedule 02.04.2013
comment
Я попытался отключить поддержку активности, но я не уверен, что мне это удалось. Тем не менее, разница также возникает, если я жду 25 секунд между последующими запросами - тайм-аут поддержания активности должен был произойти в это время, не так ли? Я также не понимаю, почему HTTP-клиент apache 4.x занимает намного больше времени, чем 3.x - person feob; 02.04.2013
comment
Хм. На вашем месте я бы запустил Wireshark и проверил, что происходит по сети. Также читайте о PoolingClientConnectionManager для HttpClient. Это может дать вам представление о том, как вообще избежать этой проблемы. - person Sascha Kaestle; 02.04.2013

Вы нажимаете JSP в первый раз после запуска сервера? Если сервер очищает свой рабочий каталог при каждом запуске, то компиляция JSP при первом попадании занимает много времени.

Также выполняется для первой транзакции: если транзакция использует доверенное хранилище сертификатов ЦС, она будет загружена и кэширована.

person Lurk21    schedule 02.04.2013

Вам лучше один раз увидеть его о кэшировании http://hc.apache.org/httpcomponents-client-ga/tutorial/html/caching.html

person abishkar bhattarai    schedule 02.04.2013

Если ваша проблема в том, что "первый http-запрос к определенному хосту значительно медленнее", возможно, причина этого симптома находится на сервере, а вы беспокоитесь о клиенте.

Если «конкретный хост», которому вы звоните, является приложением Google App Engine (или любой другой облачной платформой), это нормально, что первый вызов этого приложения заставляет вас немного подождать. Это потому, что Google перевел его в спящее состояние при бездействии.

После недавнего вызова (на который обычно требуется больше времени для ответа) последующие вызовы имеют более быстрые ответы, поскольку все экземпляры сервера активны.

Взгляните на это: приложение Google App Engine очень медленное

Я надеюсь, что это поможет вам, удачи!

person jollyroger    schedule 12.12.2013