Таргетинг утечки памяти в производственном сервисе .NET - PullRequest
2 голосов
/ 09 марта 2012

У меня запущен сервис C # .NET. Служба функционирует как TCP-сервер, на который клиенты регистрируются и делают запросы. При просмотре диспетчера задач, кажется, что утечка около 10 МБ / день. Я, кажется, не замечаю их в dev (возможно, из-за гораздо меньшего трафика и активности клиентов). В поисках вокруг я прочитал, что диспетчер задач может быть серьезно ошибочным, но я не уверен, насколько это точно или при каких обстоятельствах TM будет отображать неверную информацию.

Для решения этой проблемы мне нужно более внимательно следить за потреблением памяти. Проблема в том, что утечка появляется только в рабочей среде, где развернутая служба была создана для выпуска. Кроме того, поскольку эта служба не может быть запущена напрямую с VS с подключенным профилировщиком / отладкой, я не уверен, как лучше определить проблему с чем-то более точным, чем TM.

Любая групповая мудрость была бы очень признательна, спасибо.

РЕДАКТИРОВАТЬ:

  • Я добавил счетчики perfmon для приватных байтов службы (7 МБ для запуска), а также CLR mem во всех кучах (30 МБ для запуска)
  • Диспетчер задач сообщает, что общий объем памяти составляет ~ 37 МБ, поэтому, похоже, это имеет смысл
  • Первая часть этого - отпустить службу на один день и снова проверить мои счетчики.

Если мои личные байты становятся большими, но CLR mem примерно статичен, это будет указывать на неуправляемую утечку. Если оба становятся огромными, то это управляемая утечка.

Спасибо, ребята.

Ответы [ 4 ]

4 голосов
/ 09 марта 2012

Ваша первая задача - выяснить, протекает ли процесс памяти.Вы можете сделать это с помощью perfmon, измеряющего частные байты http://www.goldstarsoftware.com/papers/CapturingVirtualBytesToALogFile.pdf

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

Если у вас действительно есть утечка памяти (и это не просто использование переменной памяти) - процесс будет остановлен с исключением из-за нехватки памяти после некоторого запуска.

2 голосов
/ 09 марта 2012
  1. Получить дамп памяти, когда она в состоянии утечки, с помощью диспетчера задач, щелкните правой кнопкой мыши по процессу и выберите создать файл дампа. Вы также можете использовать ProcDump , который дает вам больше возможностей.

  2. Используйте расширения SOS в WinDebug или Visual Studio для проверки памяти.

2 голосов
/ 09 марта 2012

Следуйте этому руководству: http://blogs.msdn.com/b/tess/archive/2008/03/25/net-debugging-demos-lab-7-memory-leak.aspx

Это касается именно того, что вы описываете, утечки памяти в производстве. Как уже упоминалось, вы должны сначала определить, является ли это неуправляемым кодом или управляемым кодом, который пропускает, используя perfmon и Private Bytes.

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

Рабочий процесс, который я часто использую для управляемых утечек памяти, состоит в том, чтобы запустить сервер на тестовой машине, подключив его с известным количеством соединений (скажем, 123 456 соединений). Затем сделайте снимок памяти, перейдя в диспетчер задач и щелкнув правой кнопкой мыши по имени процесса и выбрав «Создать дамп». Откройте этот дамп с помощью WinDBG и SOS и выполните команду! Dumpheap -stat. Ищите объекты, которые имеют кратные 123 456 экземпляров. Должны ли эти объекты оставаться в памяти? Если нет, запустите! Gcroot для экземпляра этих объектов, чтобы выяснить, почему он все еще находится в памяти.

2 голосов
/ 09 марта 2012

Вам необходим один из следующих MemoryProfilers для его мониторинга:

http://www.jetbrains.com/profiler/

http://www.red -gate.com / products / dotnet-development / ants-memory-profiler /

Существуют и другие варианты, но они очень эффективны, и вы можете профилировать память удаленного приложения с ними (по крайней мере, решение JetBrains справится с этим)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...