За последние несколько недель я подвергся внезапному и значительному ухудшению производительности, когда просмотр локально разместил 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, и т.д. Это не было предпочтительное решение, но это работало.
Попробуйте создать новое приложение MVC2 по умолчанию в новой веб-папке. Создайте и просматривайте его. Если ваше время загрузки в порядке с новым приложением, значит, с вашим приложением что-то не так. Если нет, то это вне контекста приложения, и вам следует начать изучать конфигурацию IIS, расширения, оборудование, сеть и т. Д.
В своем приложении создайте резервную копию своей веб-конфигурации и начните с нового файла web.config по умолчанию. . Это должно отключить все установленные вами расширения или обработчики. Если это исправит ваше время загрузки, начните добавлять элементы из старого web.config в новый небольшими блоками, пока проблема не появится снова, и таким образом изолируйте проблемный элемент.
Я называю это отладкой «двоичного поиска». Это утомительно, но на самом деле работает довольно быстро и, скорее всего, обнаружит проблему, когда мы застрянем в одном из тех «НО ЭТО ДОЛЖНО РАБОТАТЬ !!!» режимы.
Обновление Просто подумайте: чтобы исключить конфигурацию IIS, попробуйте запустить сайт под Cassini / встроенным сервером разработки.
Вы можете загрузить Fidler, чтобы измерить, сколько времени занимает каждый вызов, и получить некоторые измерения.
http://blogs.msdn.com/b/tess/archive/2009/11/06/recap-of-oredev-and-some-net-debugging-videos.aspx
Это видео может помочь. ..
Я узнал, что это обычно "запах", когда вещи не работают при значении, равном двум...
Учитывая
За последние несколько недель я столкнулся с внезапным и значительным снижением производительности
и
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
.
Это сканирование не будет случайным - оно либо является результатом вашей конфигурации приложения, либо файлы находятся в файловом дереве вашего веб-приложения. Найдите эти файлы, и вы узнаете причину проблем с производительностью.
Несомненно, большой красный флаг в выходных данных профилировщика - это тот факт, что AddDirectory вызывается 408 раз, а AddExistingFile вызывается 66 914 раз?
Можете ли вы просто подтвердить, что это не просто потеря нагрузки каталоги и файлы в корневой папке вашего приложения MVC? Потому что похоже, что фреймворк занят тем, что пытается выяснить, какие файлы ему нужно создать (или добавить часы) при запуске.
[Я не разбираюсь в MVC и, возможно, это не то, что происходит, но 67k вызовов функции с именем вроде "AddExistingFile" действительно пахнут неправильно].