Что занимает более 65% времени в приложении ASP.NET?

У меня есть веб-приложение .Net Framework 4.0, ASP.NET, ASP.NET MVC 3, размещенное на Windows 7 / IIS 7.5. Ведение журнала IIS включено на этом компьютере и настроено для входа в режим W3C.

Приложение скомпилировано с использованием конфигурации выпуска и развернуто в IIS с явно заданным атрибутом . Web.config определяет использование состояния сеанса на основе SQL Server.

Я добавил следующие операторы в Global.asax в событиях BeginRequest и EndRequest соответственно. Результаты, т.е. sw.Elapsed.TotalMilliseconds, сохраняются в списке значений уровня приложения. Я выгружаю эти значения через страницу отладки и получаю то же самое в среднем.

// in BeginRequest
HttpContext.Current.Items.Add("RequestStartEnd", System.Diagnostics.Stopwatch.StartNew());

// in EndRequest
var sw = (System.Diagnostics.Stopwatch)HttpContext.Current.Items["RequestStartEnd"];
sw.Stop();

Я создал нагрузочный тест, который запускает один запрос к этому приложению с одновременной пользовательской нагрузкой 20 пользователей. Тест выполняется в Visual Studio 2010 Ultimate edition.

После запуска нагрузочного теста я получаю, что среднее время, затраченное секундомером, составляет 681 миллисекунду. Среднее время, затраченное в соответствии с IIS для этих запросов (я вычистил все журналы перед запуском нагрузочного теста) составляет 2121 миллисекунду. Среднее время, затраченное в соответствии с подсчетами IIS, со значением, указанным в отчете о нагрузочном тесте Visual Studio.

Время, затраченное на секундомер, составляет только 32% от времени, указанного в журналах IIS / Visual Studio. Куда делись остальные 68% времени?

Обновление 1: Я установил состояние сеанса на InProc и повторно запустил нагрузочный тест. В этом сценарии разница между средним временем, указанным секундомером, и средним временем, указанным в журналах IIS, выросла до более чем 70% !!! Куда уходит все это время?

Обновление 2: @Peter - Я опробовал трассировку неудачных запросов, установив правило трассировки для входа в систему с кодом состояния 200. Затем я провел нагрузочный тест с 20 одновременными пользователями в течение примерно 1,5 минут. Просмотрел последние 50 файлов трассировки и обнаружил, что поле «Время затрачено» в этом отчете имело диапазон от 750 до 1300 мс. Отчет Visual Studio показал средн. время взято как 2300 мс. В отчете, используя компактный вид,Я вижу, что время меняется между следующими переходами (1) AspNetStart -> AspNetAppDomainEnter (2) ManagedPipelineHandler-start ManagedPipelineHandler-end. Элемент (2), вероятно, является кодом моего приложения. Тем не менее существует большая разница между максимальным временем, затраченным на журналы неудачных запросов, т.е. 1300 мс и средним. затраченное время, как показано Visual Studio, 2300 мс. Как найти для этого учет? Спасибо за этот отличный совет!

9
задан Dhwanil Shah 11 August 2011 в 02:48
поделиться