Как определить, в каком приложении происходит утечка памяти без подкачки?

8

Недавно у нас была проблема на нашем работающем сервере, из-за которой наше веб-приложение перестало отвечать. Все, что мы получили, это 503 ошибки, пока мы не перезагрузили сервер, тогда все было хорошо. В конце концов я отследил его до httperr.log и обнаружил множество ошибок 1_Connections_Refused.

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

Tag   Type    Allocs       Frees       Diff       Bytes      Per Alloc
Even  Nonp  51,231,806   50,633,533   684,922   32,878,688      48

Если мы используем poolmon.exe / g, он отображает подключенный драйвер как [<unknown> объекты событий].

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

Если я открою диспетчер задач и просматриваю список процессов. Я вижу MailService.exe со значением пула NP 105 КБ, что на 36 КБ выше, чем значение процесса, указанного в секунду. Поскольку в прошлом у нас были некоторые проблемы с нашим почтовым сервером (которые могут или не могут быть связаны с этой проблемой), я чувствую, что это является причиной проблемы.

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

Я также пытался использовать poolmon.exe / c, но это всегда возвращает ошибку:

unable to load msvcr70.dll/msvcp70.dll

и это не создает localtag.txt. Моему коллеге пришлось скачать pooltag.txt из Интернета, потому что мы не можем понять, где он находится. У нас нет win debugger или win DDK (что я вижу). Возможно, приведенная выше ошибка возникает из-за того, что у нас не установлено ни одного из них, но я не знаю.

Наконец я попробовал:

C:\windows\system32\driver\findstr /m /l Even *.sys

Это вернуло довольно большой список файлов .sys и снова не помогло решить проблему.

Итак, мой вопрос заключается в следующем: есть ли другой способ сузить причину этой утечки памяти?

ОБНОВИТЬ:

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

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

ОБНОВЛЕНИЕ 2:

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

разработчик
источник
Почему бы не использовать perfmon для мониторинга пулов невыгружаемых байтов для всех процессов и поиска процесса с неконтролируемой памятью пула?
Joeqwerty
Я только что немного поиграл с Performance Monitor и настроил его так, как вы предлагали. Однако это не говорит мне ничего такого, чего я не знал, глядя на диспетчер задач. MailService имеет самый высокий пул невыгружаемого пула, но только на 106K. Так что это не совсем тот дымящийся пистолет, который я искал.
Разработчик
Ищите увеличивающихся пулов невыгружаемых байтов в процессах с течением времени. Это может быть неочевидно при быстром рассмотрении использования процессом в любой момент времени. Вы можете легко зафиксировать использование с течением времени, настроив журнал счетчика, чтобы сохранить его в CSV-файл и открыть его в Excel, чтобы проанализировать растущее использование для каждого процесса. Любой процесс, который демонстрирует увеличение на 10% или более пулов невыгружаемых байтов при запуске системы, приводит к утечке памяти и, скорее всего, к процессу, вызывающему проблему
joeqwerty
Удобным инструментом для сбора и анализа соответствующих данных счетчика является инструмент PAL, который можно найти здесь: pal.codeplex.com/releases/view/51623#ReviewsAnchor . Это более новая версия, чем я использовал, но есть версия x86, и похоже, что она может быть использована на W2K3.
Joeqwerty
Я настроил файл журнала для записи байтов пула NP. Сейчас Poolmon говорит, что мое использование невыгружаемой памяти составляет 68 МБ. За пару часов, которые я пытался понять, он вырос примерно на 2-3 МБ. Но нет соответствующего роста (что я вижу) в значениях NP для процессов. На самом деле значения NP Pool относительно отдельных процессов находятся далеко от этого числа. Даже если бы я сложил все перечисленные значения пула np, общая сумма была бы удачной, если бы она составляла 1 МБ, а не 68 МБ. Но, может быть, я что-то здесь упускаю.
Разработчик

Ответы:

6

Я наблюдаю за этим в течение 6-7 недель и, наконец, могу дать окончательный ответ на проблему.

Во-первых, непостраиваемые байты для отдельных процессов не дали мне ничего полезного, поскольку все они казались довольно статичными в своем использовании. Были всплески, но использование всегда возвращалось к базовой линии после этого.

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

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

Я думаю, что сканирование запланированных заданий также объясняет, почему мы видели увеличение памяти NP, прикрепленное к тегу объектов Event в PoolMon вместо специального тега McAfee. Это было главным, что действительно привело нас по садовой дорожке.

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

ОБНОВЛЕНИЕ : так же, как последнее замечание. McAfee's был обновлен на выходных, и это полностью решило нашу проблему нестраничной памяти.

ОБНОВЛЕНИЕ 2 : Так как я только что получил голосование за это, я добавлю дополнительное обновление к этому. Первоначально обновление McAfee, похоже, решило нашу проблему, то есть мы больше не видим массовых всплесков памяти NP через регулярные промежутки времени. Я также заметил, что после обновления кажется, что McAfee больше не записывает журналы в программу просмотра событий по умолчанию, которая скрывается при активном сканировании.

Но мы все еще наблюдаем постепенное увеличение использования памяти NP. Дошло до того, что теперь нам нужно перезагружать наш сервер каждые 2 недели или около того. Это настолько плохо , что мы недавно приобрели новый сервер в надежде , что обновленные аппаратные средства и программное обеспечение будет сделать эту проблему уйти , НО наш совершенно новый сервер только с Windows Server 2008, SQL Server 2008 R2 и McAfee установлен был STILL , показывающий утечку NP памяти , Только после того, как я полностью удалил McAfee, утечка прекратилась, и она осталась статичной даже после того, как мы настроили сервер со всем нашим программным обеспечением, готовящимся к его переключению.

С тех пор я прочитал, и я не знаю, правда ли это, что проблема не в McAfee, а в некоторой подпрограмме Windows, используемой McAfee, которая приводит к утечке памяти NP. Очевидно, сетевая активность является причиной утечки, то есть большая сетевая активность => большие утечки. Похоже, это согласуется с нашим опытом, поскольку утечка усилилась, поскольку наш сервер стал более загруженным.

разработчик
источник