2010-11-12 3 views
6

Мы получаем много исключений из памяти, и мы не можем диагностировать происходящее. Кажется, что это проблема, которая скажется на использовании памяти от 300 мегабайт до гига в нескольких минутах. Теперь это приложение IIS и имеет 3 домена приложений, работающих в отдельных пулах потоков.CLR Out Of Memory Exceptions

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

EDIT

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

+0

было бы интересно узнать, что вы считаете виновным – Kev

ответ

3

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

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

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

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

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

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

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

Tess Ferrandez-х blog является большой отладки .NET ресурс, и она имеет множество статей и лабораторий о том, как отслеживать утечки памяти:

If it is broken, fix it you should - memory issue articles

.NET Debugging Demos Lab 6:_Memory Leak
.NET Debugging Demos Lab 6:_Memory Leak - Review
.NET Debugging Demos Lab 7: Memory Leak
.NET Debugging Demos Lab 7: Memory Leak - Review

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

1

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

+0

У меня есть отличный инструмент, но бесполезный, если вы не можете воспроизвести проблему, так как я не знаю, какая серия событий вызывает всплеск, это не поможет.Это отличный инструмент, но тем не менее. –

2

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

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

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

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

.NET CLR Memory

  • GC Ручка
  • объектов
  • Важных

Process для w3wp.exe запуск вашего приложения

  • пар, но в основном Working Set

ASP.NET

  • Управляемая память используется
+0

Я не думаю, что это закрепленный объект, у нас всего 2 области кода, где мы пишем объекты, и оба они кажутся прекрасными, но это отличный момент! –

+0

Было бы легко увидеть, идет ли ваш счетчик объектов Pinned. Я определенно рекомендую использовать perfmon в качестве запуска. – Aliostad

0

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

+0

Профилирование памяти полезно, только если вы знаете, что вообще делать, чтобы найти всплеск памяти. –

0

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

+0

Спасибо за ссылку Lex У меня будет прочитано –

0

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

+1

Режим сбоя не сбрасывает процесс, потому что исключения OOM часто не приводят к сбою рабочего процесса. – Kev

+0

Должен использовать режим «зависания» для захвата дампов процесса при возникновении исключения. Тогда анализ дампа может показать, что находится в куче. –

+0

Собственно, моя ошибка, но сначала нужно настроить ADPlus с помощью сценария конфигурации. Я считаю DebugDiag более удобным для 95% случаев, с которыми я столкнулся. – Kev

0

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