Дамп памяти .NET — как составить отчет о неуправляемой памяти?

У нас есть веб-сайт ASP.NET MVC, размещенный в Windows Azure.

Оперативная память увеличилась до ~ 3 ГБ, поэтому я сделал дамп памяти с помощью инструмента Azure Diagnostics-as-a-Service (DaaS).

При отладке управляемой памяти с помощью Visual Studio я обнаружил, что мой управляемый код занимает только 500 МБ из этих 3 ГБ, оставляя 2,5 ГБ памяти неучтенными.

Вот скриншот из отчета об анализе памяти DaaS:

Дамп памяти

И файл дампа, подтверждающий размер файла: введите здесь описание изображения

Как я могу увидеть, какой код в w3wp потребляет мою оперативную память, учитывая, что это не мой управляемый код?

ИЗМЕНИТЬ

Информация о виртуальной памяти из средства диагностики отладки:

введите здесь описание изображения


person RPM1984    schedule 02.06.2015    source источник
comment
Возможно, у вас есть управляемый ресурс, который не освобождает неуправляемый ресурс. Существует множество отличных руководств по работе с WinDBG.   -  person Yuval Itzchakov    schedule 02.06.2015
comment
@YuvalItzchakov - ваш комментарий, похоже, не помогает ответить на вопрос или помочь попробовать и ответить на него. Возможно, вы могли бы создать ответ с некоторыми ссылками и примерами кода И объяснить, почему вы считаете, что проблема заключается в том, что управляемые ресурсы не выпускают неуправляемый ресурс.   -  person Pure.Krome    schedule 02.06.2015
comment
@Pure.Krome Этот вопрос слишком широк и имеет множество возможных решений. Объяснение того, как работает WinDBG или почему я предполагаю, что это может быть управляемым ресурсом, содержащим неуправляемые ресурсы, было бы просто основано на теории, было бы пустой тратой времени и слишком общим. Поверьте мне, что я мог бы помочь ОП, я бы помог. Учитывая небольшую деталь, указанную в этом вопросе, это невозможно.   -  person Yuval Itzchakov    schedule 02.06.2015
comment
Я только что обнаружил, что ваш ответ в основном такой: Поищите WinDBG в Google. GLHFTHXBBQ. Вместо этого я надеялся, что вы скажете что-то вроде этого: Хорошо, сложный вопрос. Довольно широкий. Давайте попробуем немного заблокировать его. Попробуйте это (ссылка) и это (другая ссылка), чтобы узнать, связано ли это с тем, что управляемый не выпускает неуправляемый.... Я не ненавижу - просто пытаюсь понять, как можно решить эту проблему ... У меня также много раз была эта серьезная проблема, и это беспокоит.   -  person Pure.Krome    schedule 02.06.2015
comment
Не забывайте учитывать ОЗУ, используемое ОС, или ОЗУ, потребляемое другими сайтами, которые вы используете в том же плане веб-хостинга.   -  person Zain Rizvi    schedule 02.06.2015
comment
@ZainRizvi - это файл дампа w3wp (мой сайт). Другие процессы/сайты имеют свой собственный файл дампа процесса/памяти.   -  person RPM1984    schedule 03.06.2015
comment
@YuvalItzchakov - WinDBG такой волосатый (по моему опыту). Мне никогда не удавалось найти отличный учебник, как вы упомянули (не хотите ли поделиться им?). У меня есть VS Enterprise, в котором есть встроенный анализатор дампа памяти, который, как я думал, мог бы делать все, что делает WinDBG, с более приятным интерфейсом. Но я не вижу, где VS может отлаживать встроенную память — похоже, проблема не в управляемой памяти.   -  person RPM1984    schedule 03.06.2015


Ответы (1)


Как я вижу, вы уже загрузили дамп памяти на свой компьютер, вы можете загрузить последнюю версию средства диагностики отладки и запустить как анализ управляемой памяти, так и «анализ собственной памяти» в файле дампа. Это даст некоторую информацию о том, где выделена собственная память, особенно собственные кучи или виртуальные аллоки. Если вы поделитесь ссылкой на этот отчет или поделитесь информацией из этого отчета, мы сможем определить, где используется собственная память. Я не уверен, есть ли в отчете по умолчанию, созданном в DAAS, эта информация или нет.

Отчет содержит информацию о некоторых обнаруженных проблемах (таких как динамические сборки и т. д.). Видите ли вы в верхней части отчета что-либо, что вызывает известные проблемы как ошибку, предупреждение или информацию?

person Puneet Gupta    schedule 02.06.2015
comment
спасибо за Ваш ответ. Отчет, который создает DebugDiag, идентичен отчету DaaS. В верхней части отчета нет ничего полезного (предупреждения и т. д.). Как запустить собственный анализ памяти в файле дампа с помощью Debug Diag? - person RPM1984; 03.06.2015
comment
Чего я не вижу из отчета, так это того, где складываются 3 ГБ. Я вижу, что используется ~ 500 МБ кучи GC, но больше нигде я не могу увидеть, где я учёл остальные 2,5 ГБ. - person RPM1984; 03.06.2015
comment
Добавлена ​​​​информация о виртуальной памяти / собственных кучах - помогает ли это? - person RPM1984; 03.06.2015
comment
Таким образом, отчет показывает, что выделенная память связана с чистыми вызовами VirtualAlloc, а не с кучами NT. Сейчас это немного сложно устранить, так как для таких проблем мы используем LEAKTRACK.DLL (компонент debugdiag для обнаружения утечек памяти), что невозможно сделать в среде веб-приложений. Можете ли вы воспроизвести утечку в локальной среде, запустив, скажем, стресс-тест? Если да, то шаги, указанные в blogs.msdn.com/b/tess/archive/2010/01/14/ можно использовать для устранения этой проблемы. - person Puneet Gupta; 03.06.2015