Длительное приложение замедляется - PullRequest
2 голосов
/ 25 февраля 2012

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

Ответы [ 2 ]

7 голосов
/ 25 февраля 2012

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

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

perfmon perfmon - ваш друг.Есть много счетчиков, на которые вы можете посмотреть (как для всей системы, так и для конкретного процесса).Таким образом, вы можете начать с профилирования большой четверки (это память, использование диска, процессор и сеть).Есть много сообщений о том, какие счетчики лучше, поэтому я не буду вдаваться в подробности о счетчиках перфектов здесь.

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

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

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

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

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

! dumpheap -min <size> (выдает все объекты и типы по определенному <size>)

! Dumpheap -type <type> (выгрузить все объекты определенного <type>)

! Gcroot <address> (печатьиз стека, чтобы вы могли видеть, какой родительский объект закрепляется в ГХ)

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

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

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

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

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

1 голос
/ 25 февраля 2012

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

...