Локальный ASP.NET MVC Внезапно очень медленно;Время загрузки> 1 минуты - PullRequest
9 голосов
/ 28 июня 2010

В течение последних нескольких недель я подвергался внезапному и значительному снижению производительности при просмотре локальных веб-приложений ASP.NET 3.5 MVC (C #).Время загрузки данной страницы составляет в среднем 20 секунд (независимо от содержимого);запуск обычно занимает более минуты.Эти приложения работают быстро на производственных и даже тестовых системах (система тестирования сравнима с моей средой разработки).

Я использую IIS 6.0, VS2008, Vista Ultimate, SQL2005, .NET 3.5, MVC 1.0, и мы используемVisualSVN 1.7.

Моя база данных SQL является локальной, и причина в том, что IPv6, похоже, не является причиной.Я просматриваю в Firefox и IE8 вне режима отладки, используя loopback, имя компьютера и localhost, и каждый раз получаю одни и те же результаты (следовательно, DNS тоже не является проблемой).

Ниже приведеныснимки экрана с выводом моего dotTrace.

http://www.glowfoto.com/static_image/28-100108L/3123/jpg/06/2010/img4/glowfoto

Из-за этой проблемы практически невозможно отладить / протестировать любое веб-приложение.Любые предложения очень ценятся!

РЕШЕНИЕ: Полная переустановка Windows, IIS, Visual Studio и т. Д. Это не было предпочтительным решением, но оно работало.

Ответы [ 5 ]

1 голос
/ 12 июля 2010

Я узнал, что обычно это "запах", когда вещи терпят неудачу около силы двух ...

Дано

За последние несколько недель я подвергся внезапному и значительному ухудшению производительности

и

AddExistingFile вызывается 66 914 раз

Мне интересно, снизилась ли производительность примерно в то время, когда количество файлов превысило 65 535 ...

Другие возможности для рассмотрения ...

  • Все 66,914 файлов находятся в одном каталоге? Если это так, то есть много блоков каталогов для доступа ... попробуйте дефрагментировать жесткий диск. На самом деле, это еще больше блоков каталогов, если они распределены по множеству каталогов.

  • Вы храните все файлы в одном списке? Вы настраиваете емкость этого списка или позволяете ему «расти» естественно и медленно?

  • Вы сначала сканируете файлы глубиной или шириной? Кэширование в ОС в первую очередь будет способствовать производительности глубины.

Обновление 14/7

Уточнение Вы храните все файлы в одном списке?

Наивный код, подобный этому первому примеру, не работает идеально, потому что ему нужно перераспределять пространство памяти по мере роста списка.

var myList = new List<int>();
for (int i=0; i<10000; i++)
{
    myList.Add(i);
}

Более эффективно, если вы это знаете, инициализировать список с определенной емкостью, чтобы избежать издержек перераспределения:

var myList = new List<int>(10000);  // Capacity is 10000
for (int i=0; i<10000; i++)
{
    myList.Add(i);
}

Обновление 15/7

Комментарий от OP:

Эти веб-приложения программно не проверяют файлы на моем жестком диске, по крайней мере, не моей рукой. Если есть какое-либо рекурсивное сканирование файлов, это по VS 2008.

Сканирование файлов выполняет не Visual Studio - это ваше веб-приложение . Это хорошо видно на первой трассировке профайлера, которую вы опубликовали - вызов System.Web.Hosting.HostingEnvironment.Initialize() занимает 49 секунд, в основном из-за 66 914 вызовов AddExistingFile(). В частности, чтение свойства CreationTimeUTC занимает почти все время.

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

1 голос
/ 12 июля 2010

Разумеется, большой красный флаг на выходе профилировщика связан с тем, что AddDirectory вызывается 408 раз, а AddExistingFile - 66 914 раз?

Можете ли вы просто подтвердить, что под корневой папкой приложения MVC не просто загружена директория и файлы? Потому что похоже, что фреймворк занят, пытаясь определить, какие файлы ему нужно собрать (или добавить часы) при запуске.

[Я не в курсе дела с MVC, и, возможно, это не то, что происходит, но 67k вызовов функции с именем типа "AddExistingFile" пахнет неправильно].

0 голосов
/ 05 октября 2010

Решением было отформатировать и выполнить чистую установку Vista, SQL Server 2005, Visual Studio 2008, IIS6 и всего остального.Теперь я могу без каких-либо последствий отлаживать те же самые веб-приложения, с которыми у меня изначально были проблемы.Это наводит меня на мысль, что проблема заключается в одной из вышеуказанных установок и, возможно, усугубляется обновлением программного обеспечения или добавлением программного обеспечения.

0 голосов
/ 09 июля 2010

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

http://blogs.msdn.com/b/tess/archive/2009/11/06/recap-of-oredev-and-some-net-debugging-videos.aspx

Это видео может помочь ...

0 голосов
/ 28 июня 2010

Попробуйте создать новое приложение MVC2 по умолчанию в новой веб-папке. Постройте и просмотрите его. Если с новым приложением у вас все нормально, значит что-то не так с вашим приложением. Если нет, то это вне контекста приложения, и вы должны начать смотреть на конфигурацию IIS, расширения, оборудование, сеть и т. Д.

В вашем приложении создайте резервную копию веб-конфигурации и начните с нового файла web.config по умолчанию. Это должно отключить все расширения или обработчики, которые вы установили. Если это исправляет ваше время загрузки, начните добавлять материал из старого web.config в новый небольшими блоками до тех пор, пока проблема не появится снова, и таким образом изолируйте нарушающий элемент.

Я называю это "бинарным поиском" отладкой. Это утомительно, но на самом деле работает довольно быстро и, скорее всего, определит проблему, когда мы застрянем в одном из тех, «НО ЭТО ДОЛЖНО РАБОТАТЬ !!!» режимы.

Обновление Просто мысль: чтобы исключить конфигурацию IIS, попробуйте запустить сайт под Cassini / встроенным сервером разработки.

...