CLR из памяти исключений - PullRequest
6 голосов
/ 12 ноября 2010

У нас много исключений из памяти, и мы не можем диагностировать происходящее. Похоже, что возникает проблема, которая увеличит использование памяти с 300 мегабайт до более чем гигабайта за несколько минут. Теперь это приложение IIS и имеет 3 домена приложений, работающих в отдельных пулах потоков.

Мы хотим записать, когда произойдут исключения из памяти. Таким образом, мы можем попытаться найти образец. Мой вопрос: каков наилучший способ сделать это? Есть ли способ запрашивать использование памяти раз в минуту, чтобы увидеть, насколько она высока, и отправить оповещение по электронной почте. Или, может быть, написать приложение, которое будет контролировать использование памяти CLR? идеи или направления приветствуются.

EDIT

Я использую Perfmon, но если я не наблюдаю за процессом, он не так полезен. Я могу видеть только то, что было и когда. Я также использовал инструмент Red Gate Memory Profile, который, кстати, потрясающий, только я не могу попасть на страницу или процесс, который вызывает исключение.

Ответы [ 7 ]

3 голосов
/ 13 ноября 2010

Установите ADPlus на свой сервер (это часть Windows Debugging Tools ).Когда вы начнете наблюдать необычно высокое использование памяти, запишите дамп памяти, используя:

adplus -hang -p <PID> -quiet -o <dump file folder path>

<PID> - это идентификатор рабочего процесса, который вы можете получить из tasklist.exe.

Есливы не всегда рядом, когда возникает эта проблема, тогда вы можете автоматизировать захват дампа памяти, используя DebugDiag :

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

  2. Использование DebugDiag в режиме сбоя для захвата дампа всякий раз, когда генерируются исключения CLR.Вы можете использовать Расширенные настройки, чтобы настроить DebugDiag для создания полного дампа памяти при обнаружении исключения CLR типа System.OutOfMemoryException.Это более надежно и обязательно сработает.Используйте только Расширенные настройки -> Исключения, не трогайте ненастроенные исключения первого шанса, оставьте этот параметр равным None.

Как только у вас будет дамп памяти, запустите WinDBG, загрузите файл дампаи загрузите SOS и начните копаться.

Блог Тесс Феррандес - отличный ресурс для отладки .NET, и у нее есть множество статей и лабораторных работ о том, как отследить утечки памяти:

Если он сломан, исправьте его, если нужно - статьи по выпуску памяти

.NET Debugging Demos Lab 6: _Memory Leak
Демонстрация отладки .NET Лаборатория 6: утечка памяти - обзор
Демонстрация отладки .NET Лаборатория 7: утечка памяти
. Отладка демо .NET Лаборатория 7: утечка памяти -Просмотрите

Счетчики PerfMon полезны и могут использоваться для подтверждения утечки памяти, но они не рассказывают всю историю.WinDBG и SOS - это инструменты, которые вы должны использовать, чтобы узнать, где используется ваша память.

2 голосов
/ 12 ноября 2010

Perfromance Monitor aka Perfmon - ваш друг - он бесплатный и не навязчивый и легкий вес и может безопасно работать на производственных серверах, если выиспользуйте менее частую выборку (каждые несколько секунд).Минимум, что он может сделать, - это определить использование памяти / процессора для ваших процессов (w3wp.exe) и сохранить их в файле.

Поскольку вы не поделились тем, что делаете в приложении, я не могу предложить счетчики производительностихранить, но в ASP.NET, .NET и CLR их много.

Поскольку вы получаете CLR из-за исключения из памяти, я догадываюсь, что GC не работает из-за закрепленного объекта или чего-то еще.Я сомневаюсь, что это неуправляемый ресурс, такой как растровое изображение, которое не было выпущено, хотя это может быть.

Вот список счетчиков, которые я предлагаю:

.NET CLR Memory

  • GC Handles
  • Прикрепленные объекты

Процесс для w3wp.exe, на котором работает ваше приложение

  • Пара, но в основном рабочий набор

ASP.NET

  • Используемая управляемая память
1 голос
/ 12 ноября 2010

Попробуйте RedGate Memory Profiler . Я предполагаю, что это работает с сайтами ASP.NET (их профилировщик производительности определенно работает).

0 голосов
/ 12 ноября 2010

Используйте dotTrace или YourToolkit .Net, где вы можете подключить профилировщик к процессу ASP, у них есть пробная версия, поэтому вам не нужно тратить деньги сразу. Используя эти профилировщики, вы можете выбрать временную шкалу, в которой объем памяти начинает увеличиваться (вы можете визуально увидеть использование памяти на графике), поэтому будет достаточно легко выбрать диапазон и понять, что заставляет использование памяти резко возрастать.

0 голосов
/ 12 ноября 2010

Я бы использовал ADPlus в режиме «сбой» для захвата дампа памяти при возникновении исключения, а затем WinDbg и SOS, чтобы выяснить, что занимает всю память.

0 голосов
/ 12 ноября 2010

Если вы не можете позволить себе хороший профилировщик, вы должны использовать то, что Microsoft рекомендует здесь, http://msdn.microsoft.com/en-us/library/ee817663.aspx

0 голосов
/ 12 ноября 2010

Используйте профилировщик памяти . Есть пара хороших, например, JetBrains dotTrace или ANTS Memory Profiler от Red Gate. Здесь было несколько обсуждений на stackoverflow с множеством других советов и рекомендаций.

...