Локальный ASP.NET MVC, Внезапно Очень Медленный; Время загрузки> 1 минута

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

Я выполняю IIS 6.0, VS2008, Окончательную Vista, SQL2005.NET 3.5, MVC 1.0, и мы используем VisualSVN 1.7.

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

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

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

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

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

9
задан alan 24 March 2011 в 16:14
поделиться

4 ответа

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

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

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

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

0
ответ дан 5 December 2019 в 02:07
поделиться

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

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

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

0
ответ дан 5 December 2019 в 02:07
поделиться

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

Учитывая

За последние несколько недель я столкнулся с внезапным и значительным снижением производительности

и

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
ответ дан 5 December 2019 в 02:07
поделиться

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

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

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

1
ответ дан 5 December 2019 в 02:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: