Почему мое веб-приложение видит задержку?

У нас есть приложение ASP.Net, которое ведет себя странно под IIS6. Само приложение представляет собой простую сделку с веб-формами ASP.Net 2.0, ничего сверхъестественного там не происходит (есть пара HTTP-модулей в процессе разработки, но я бы не считал их странными :)). Чего я не понимаю, так это времени выполнения страницы или, точнее, разницы между временем, сообщаемым трассировкой ASP.Net (trace.axd), и наблюдаемым клиентом (Fiddler). Когда приложение запускается в среде разработчика (WinXP, IIS5.1), время, указанное ASP.Net и Fiddler, очень близко:

Page exec time             :  0.0919834
Fiddler Total Sequence time:  0.1560980 

Я могу понять, что 60 мс тратятся на получение данных размером 5 КБ из IIS в Fiddler (оба работают на одном компьютере, кстати). Теперь, когда мы переносим код на сервер (Win2k3, IIS6), картина кардинально меняется:

Page exec time             :  0.1702014
Fiddler Total Sequence time:  0.5156283 

Это та же страница, и Fiddler снова работает на той же машине с кодом. Почему для доставки тех же 5 КБ вдруг требуется 350 мс?

PS. На обеих машинах результаты получаются путем доступа к URL-адресу через фактическое имя хоста машины, например. http://machinename/app/page.aspx (в отличие от http://localhost/app/page.aspx).

ППС. С точки зрения конфигурации настройки dev box и сервера настолько близки, насколько это возможно, — оба используют один и тот же файл web.config. Оба попали в БД (сервер sql) со встроенной авторизацией, и, следовательно, приложение работает под учетной записью домена. Приложение использует проверку подлинности с помощью форм и НЕ выдает себя за другое лицо (т. е. оно всегда работает под одной и той же учетной записью). Теперь то, как это работает в IIS5, отличается от IIS6 — в IIS5 учетная запись указывается в теге в файле machine.config, а в IIS6 — в настройке AppPool. Настройка кажется довольно типичной для обеих сред, и я не могу представить, чтобы она вызывала задержки в 350 мс...


person user8032    schedule 19.02.2009    source источник


Ответы (3)


Израсходовав один из немногих драгоценных инцидентов поддержки, которые мы получили с нашей подпиской MSDN, я, наконец, знаю правильный ответ на вопрос «на что потрачено все это время». Короче говоря, время тратится на HTTP-модули, которые у нас есть в нашем пайплайне. Измерения времени, сообщаемые ASP.Net trace.axd, фиксируют только время, проведенное на самой странице .aspx, модули НЕ включены.

Один из простых способов убедиться в этом (и посмотреть, сколько времени требуется каждому модулю для выполнения своей задачи) — использовать ETW (отслеживание событий для Windows). Вот объяснение (я сильно подозреваю, что этот пост был написан после того, как они рассмотрели наш случай :)) К отличному описанию выше я могу добавить одну вещь: я использовал SvcTraceViewer вместо LogParser для анализа выходных данных трассировки.

Обновление: описанный выше подход также работает в Windows Server 2008, просто убедитесь, что у вас есть Трассировка установлена.

person user8032    schedule 27.02.2009

Выполните трассировку маршрута по URL-адресу, по которому вы звоните, и сравните их. Держу пари, что на машине разработчика вы остаетесь внутри машины, но на рабочей машине вы выходите наружу, а затем возвращаетесь через IP-адрес.

Если это так, попробуйте добавить это в файл hosts (c:\windows\system32\drivers\etc\hosts

www.mysite.com    127.0.0.1

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

Обновить

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

Или это может быть связано с тем, что вы тестируете две разные версии IIS, 5.1 для XP и 6.0 для 2003. На самом деле невозможно объяснить различия, если в двух средах не работает одно и то же программное обеспечение.

person Nick Berardi    schedule 19.02.2009
comment
Неа. Мы используем IE7 для управления Fiddler в обоих случаях, и, поскольку IE7 обходит прокси-серверы при запросах к локальному хосту, мы должны использовать фактическое имя хоста в обоих случаях. - person user8032; 19.02.2009
comment
Кстати, что вы подразумеваете под выходом на улицу? Единственное, что я могу придумать, это DNS-запрос, и все это кэшируется задолго до времени теста... - person user8032; 19.02.2009
comment
так что вы на самом деле вызываете localhost на своем веб-сервере и компьютере разработчика и получаете эти различия в ответах? Потому что это меняет весь ваш вопрос и, вероятно, должно было быть упомянуто. - person Nick Berardi; 19.02.2009
comment
Мы вызываем machinename в обоих случаях. Однако, даже если это был localhost, я не вижу, как это в любом случае имеет хоть какое-то значение. - person user8032; 19.02.2009
comment
Ну, это имеет значение, если вы тестируете локальный хост по сравнению с вашим URL. Это был мой вопрос к вам. Поскольку вы выполняете оба действия на локальном хосте, делаете ли вы их, пока сервер обрабатывает реальные запросы? - person Nick Berardi; 19.02.2009
comment
Нет, сервер простаивает. Это специальный блок производительности, который ничего не делает, кроме как запускает тесты производительности (нам действительно нравится знать, как работает приложение, прежде чем запускать его в производство). - person user8032; 19.02.2009
comment
имеет смысл. просто не было в вопросе, поэтому я должен был спросить. Пробовали ли вы настроить Windows 2003 на машине разработчика, чтобы посмотреть, как это работает. Так что вы используете ту же версию IIS. - person Nick Berardi; 19.02.2009
comment
Что вызывает недоумение, так это не чистая производительность как таковая, а большая разница между временем, сообщаемым ASP.Net, и наблюдаемым Fiddler на W2k3. - person user8032; 20.02.2009

Приложение работает в одинаковых конфигурациях выпуска на обоих устройствах?

РЕДАКТИРОВАТЬ: Конвейер запросов сильно изменился между IIS5 и IIS6, trace.axd будет видеть только его часть ASP.NET, а не новый пул приложений и компоненты HTTP.Sys.

Я полагаю, что конфигурацию IIS6 можно немного изменить, но вы, вероятно, видите разницу между легким непроизводственным веб-сервером (IIS5) и надежным веб-сервером с отдельными пулами приложений для управления и большим количеством уровней абстракции.

person FlySwat    schedule 19.02.2009
comment
Добавил PPS к вопросу. По сути, настройки настолько близки, насколько мы могли их сделать. - person user8032; 19.02.2009
comment
Если бы это было так, то для возврата КАЖДОЙ страницы .aspx потребовалось бы не менее 350 мс. Что явно не так. - person user8032; 27.02.2009