2013-02-15 2 views
3

В настоящее время мы тестируем выступления на наших веб-серверах и получаем очень разные результаты между производственными серверами и тестовыми серверами.Производительность запросов HEAD

тестов мы делаем следующий:

  • Загрузить XML RSS Feed доступно на сайте
  • Сделать запрос ГОЛОВЫ всех ссылок, присутствующий на в корм XML, чтобы проверить, если URL правильно

Удовлетворительно среднее время отклика на тестовых серверах составляет около 15 мс, когда одно и то же измерение считывает 900 мс на серверах prod. Поскольку оба сервера (предположительно) настроены одинаково, я очень озадачен этими результатами.

  1. Я правильно понял, что HEAD-запросы на .CFM-страницы фактически не связаны с сервером ColdFusion, а только с IIS?
  2. Если я прав с первой точкой, где я могу проверить уровень IIS, что может повлиять на время ответа?

Следуя рекомендациям, которые я получил от вас, я просто попытался добавить запись журнала на тестовую страницу cfm, чтобы узнать, выполняется ли CFLog или нет.

Удивительно, что тот же запрос HEAD в том же файле генерирует запись журнала в prod. и не в тесте. Очевидно, что конфигурация должна быть разной между тестом и prod, но я не знаю, на каком уровне.

+1

Я не был бы слишком уверен в вашем первом предположении. Вы пробовали cURL, чтобы получить страницы вручную? Вы можете использовать опцию -X, чтобы установить HTTP-глагол как HEAD. Я бы посмотрел, что каждый сервер возвращается, чтобы быть уверенным. – barnyr

+0

Я пробовал использовать Fiddler. Как и ожидалось, контент ответа пуст, но остается вопрос о том, что сервер фактически должен построить ответ. – Jaepetto

+0

Это мой другой инструмент выбора! Пробовали ли вы вставить вызов barnyr

ответ

0

Я не знал ответа на этот вопрос, но я сбил код, чтобы проверить его и получить некоторые результаты. Caveat: Я использую только внутренний веб-сервер Tomcat, и я использую CF10 (я отмечаю, что вы используете CF8). Я не думаю, что их оговорки недействительны мои выводы в контексте вашей конкретной ситуации.

<!--- headMe.cfm ---> 
<cflog text="hit" file="headMe"> 


<!--- doHead.cfm ---> 
<cfhttp method="head" url="http://localhost/headMe.cfm" result="httpResponse" /> 
<cfdump var="#variables#"> 

Так я просматриваю к doHead.cfm, что делает HTTP глава headMe.cfm. Если headMe.cfm был фактически выполнен, тогда мы получим запись в headMe.log. Если нет: нет записи в журнале.

Переменная httpResponse была законна и, как и следовало ожидать, для запроса HEAD и ... Я получил запись в журнале.

Итак, я пришел к выводу, что при получении запроса HEAD, к сожалению, все CFML фактически выполняются. Я действительно не думаю, что это должно быть. В спецификации HTTP нет ничего, чтобы предположить, что он должен или не должен вызывать «динамические» запросы для полного выполнения, но было бы неплохо, если бы этого не произошло, я думаю.

В любом случае, HTH.

+0

_ «Я действительно не думаю, что это должно быть». _ - HUH? Почему на самом деле CF _not_ обрабатывает HEAD-запросы? –

+0

Я не предлагал, чтобы CF (сервер) не обрабатывал HEAD-запросы, я имел в виду, что - данный в 99,99% раз последующий CFML (код) не будет иметь отношение к * ответу * из запроса HEAD , кажется, стыдно, что все это выполняется. Тем не менее - теперь, когда я использую свой мозг лучше, чем раньше, все еще есть 0,01% времени, когда некоторые из заголовков ответов поступают из обработки CFML, поэтому его все равно нужно сделать. Я думаю, если кто-то хочет обойти все это, это вопрос борьбы с ним в onRequestStart(). –

+0

@AdamCameron Следуя за вашей идеей, я попробовал почти то же самое. Единственное различие заключалось в том, что я назвал HeadMe.cfm у Fiddler вместо тега cfhttp. Удивительно, но на CF8 запись журнала не генерируется при выполнении запроса HEAD. Поэтому код не выполняется. Может ли быть разница между CF8 и CF10? Продолжение следует ... – Jaepetto

1

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

От the HTTP spec, section 9.4:

Метод ГОЛОВА идентичен GET, за исключением, что сервер НЕ ДОЛЖЕН возвращение тела сообщения в ответе.Метаинформация, содержащая в заголовках HTTP в ответ на запрос HEAD, ДОЛЖНА быть идентичной информации, отправленной в ответ на запрос GET. Этот метод может использоваться для получения метаинформации об объекте, подразумеваемой запросом , без передачи самого объекта-объекта. Этот метод часто используется для тестирования гипертекстовых ссылок на достоверность, доступность, и недавнюю модификацию.

Ответ на запрос HEAD МОЖЕТ быть кэшируемым в том смысле, что информация, содержащаяся в ответе, может использоваться для обновления ранее кэшированного объекта с этого ресурса. Если значения нового поля показывают, что кешированный объект отличается от текущего объекта (поскольку будет отображаться изменением Content-Length, Content-MD5, ETag или Last-Modified), то кеш ДОЛЖЕН обрабатывать запись в кеше как устаревший.

Я думаю, что очень редко можно увидеть динамические сайты, CMSs или структуры, которые на самом деле реализовать большинство вещей, как HEAD ответы, действительный ETags и т.д. - так вообще вы получите одинаковые ответы от GET и HEAD, включая тело сообщения, которое предполагается удалить из запроса HEAD.

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

+0

_ «включая выполнение всего кода» _ - ему нужно выполнить только то, что требуется для установки соответствующих заголовков. –

+1

@PeterBoughton, поэтому остальная часть предложения «для вывода одной и той же метаинформации».Так что да, если есть код, который не влияет на вывод страницы, его не нужно запускать. При этом я не могу на самом деле думать о моем собственном коде, который можно было бы удалить при выполнении запроса 'HEAD', поскольку, если это не влияет на выходную подпись, то, вероятно, это не должно запускаться в первую очередь. – nosilleg

+0

Но начало - «делать то же самое», что неправильно. Возможно, все предложение могло бы быть связано с повторной записью, чтобы было ясно. –

Смежные вопросы