2012-02-25 4 views
2

Существует приложение, состоящее из трех исполняемых файлов. Один из них - диспетчер, который запускает другие исполняемые файлы. Диспетчер получает код от исполняемого файла при его завершении. То есть только диспетчер всегда работает, другие исполняемые файлы разгружаются и загружаются снова. Приложение работает в точке обслуживания и работает круглосуточно. При первом запуске приложение работает быстро. В конце концов приложение работает очень медленно. Что может быть причиной такого поведения?Длительное приложение замедляется

+0

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

ответ

7

Могло быть много причин для замедления с течением времени. В любом месте от медленной утечки памяти до антивируса. Лучшее, что вы можете сделать, это попытаться построить доказательства (данные) о том, в какой области приложения смотреть в первую очередь. Старайтесь не говорить об этом со многими разработчиками, потому что у каждого будет другое мнение о том, что может быть неправильным. Получите данные!

Как получить данные:

perfmon Perfmon является вашим другом. Есть много счетчиков, на которые вы можете смотреть (как в системе, так и в зависимости от процесса). Таким образом, вы можете начать с профилирования большого 4 (это память, использование диска, процессор и сеть). Есть lot of posts, о том, какие счетчики являются лучшими, поэтому я не буду вдаваться в подробности о главных счетчиках здесь.

windbg Если вы действительно видите, что память растет и не собирается, пришло время ввести большие пушки. .NET отлично справляется с абстрагированием использования памяти от разработчиков, но это означает, что мы иногда должны подходить к .NET, чтобы выяснить, что не позволяет сборщику мусора выполнять свою работу. windbg с sos.dll (управляемые расширения) - отличный инструмент для этого. Самая сложная часть windbg (по моему опыту) - это просто увеличение загрузок sos. Вы должны обратить пристальное внимание на то, какую целевую архитектуру (64 или 32) вы анализируете и какую версию CLR вы используете.

procdump procdump by sysinternals - отличная утилита для получения моментальных снимков памяти из работающего процесса. Эти снимки (файлы .dmp) затем могут быть проанализированы с помощью windbg.

sos sos.dll поставляется с .NET Framework начиная с версии v2. С v4 Visual Studio 2010 интегрировал sos и позволяет анализировать файлы .dmp!

Команды СОС для утечки памяти, которые я нашел наиболее полезными:!

eeheap -gc (обзор того, что в каждом поколении каждой кучи)

dumpheap -min <size> (свалки всех объектов и типов, более конкретный <size>)

! dumpheap -типа <type> (дамп всех объектов спа канцелярские товары <type>)

!! Gcroot <address> (распечатывает стек, так что вы можете увидеть, что родительский объект пиннинга в GC)

сделать <address> (печатает память конкретного объекта)

Некоторые другие указатели:

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

Для проблем с производительностью обычно рекомендуется выполнять регулярные снимки с помощью запускаемого приложения. Затем вы можете сравнить моментальные снимки при анализе.

Ну, это было немного дольше, чем я предполагал, но, надеюсь, стоит того!

+0

Удивительный ответ. Я добавлю, что мой первый выбор - просто настроить диспетчер задач и наблюдать за динамикой распределения ресурсов. – kenny

+0

Но как может быть, что ресурсы не освобождаются, если exe прекращается? EXE завершают себя Application.Exit (int). Диспетчер - это только самое верхнее окно. Нет ничего, что могло бы привести к утечке памяти (я думаю). – EngineerSpock

+0

@EngineerSpock Затем сначала измерьте ресурсы системного уровня (процессор, память, диск и сеть). Затем выясните, какой процесс вызывает всплеск в одном из них. Уточните свой поиск и начните заново. Это требует времени, но настойчивость, и вы найдете причину. –

1

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