Утечки памяти через невыгружаемый пул.

Утечки памяти через невыгружаемый пул.

21.10.2022 0 Автор GodKnowses

Компьютеры и серверы под управлением Windows нередко страдают от утечки памяти, вызванной конкретным драйвером, который пытается сохранить свои данные в невыгружаемом пуле памяти. Невыгружаемая память используется именно ядром системы и драйверами. На диск та не выносится (речь о pagefile.sys) – не может, не имеет права – и хранится в физической памяти (грубо говоря, в самих планках RAM). На размер памяти пула можно взглянуть во вкладке Производительность Диспетчера устройств:

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

примерно так выглядит невыгружаемый пул “здорового” юзера

По опыту (своему и чужому), та редко превышает планку 400500 Мб (системе больше не нужно), хотя по “паспорту” она просто не должна превышать 75% от объёма физической памяти. И превышение этого порога сигнализирует о проблемах с утечками в системных компонентах. Проблема решается временно простой перезагрузкой Windows, что на серверах, например, не особо поощряется. Там чаще всего причиной являются проблемы с драйверами, установленными к сетевым картам со стороны. На основании того же опыта есть готовые варианты решений и более тернистые, где нужно, к сожалению для многих, думать. В таком порядке и пойдём.

Отключаем службу проверки сетевой активности NDU.

Наиболее частая причина. Видится в несовместимости драйверов сетевых карт с драйвером мониторинга сетевой активности. MSI карты конфликтуют с ним почти всегда. Выключение же службы на Windows никак не проявляется. Так что заряжаем консоль команд от имени администратора и вводим

sc config NDU start= disabled

Тот же смысл, но через редактор реестра. Открываем его командой regedit и ищем ключ

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Ndu

сменим значение Start с 2 на 4.

отменить автозапуск службы из реестра

Windows нужно перезагрузить.

Обновление сетевого драйвера к собственной сетевой карте.

Если стоит карта стороннего производителя, проверьте напрямую на сайте, минуя программы-“обновлялки”. Вполне вероятно, придётся установить предыдущую версию и подождать некоторое время. Так, ПО от Killer Suite также постоянно конфликтует с сетевыми настройками и службами Windows. Утечки памяти через невыгружаемый пул прекратились? Делайте выводы: нужно отключать автообновление драйверов из Windows.

ПРИПИСКА

На одном из серверов под управлением Windows Server 2012 R2 постоянно подвисало ПО; отключение Hyper-V не помогало, драйвера были обновлены, расшаривание виртуальных дисков отключили. После продолжительного расследования обнаружилось, что один из роутеров некорректно пропускал IP. На фоне получившегося конфликта имён на сервере постоянно висели утечки памяти через невыгружаемый пул.

Безопасный режим.

В таком деле и не попробовать дать поработать Windows “без всего”? Кроме шуток, один из пользователей божился, что стоило ему дать системе поработать немного в Безопасном режиме, как после очередной перезагрузки никаких утечек он больше не видел. Больше похоже на чудо, но попробуйте).

Настраиваем невыгружаемый пул сами.

Сейчас полезем в реестр. Сделайте копию.

В системе многое поддаётся настройкам вручную. В том числе и пороги выделяемых и контролируемых значений памяти. Под всё буквально. Системе разрешено регулировать выделяемую память автоматически. Это подразумевает диапазон от 1 Мб до 512 Мб. За это отвечает параметр NonPagedPoolSize в ключе

 Компьютер\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Memory Management

А мы выставим границу вручную, выставив что-то среднее: 192 или 256. Не забываем, что мы говорим об абсолютных значениях, так что меры измерения при изменении параметра выставляем десятичными

размер невыгружаемого пула вручную

Редактор не закрываем. Переносимся в ключ

Компьютер\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Null

Отключим автозапуск управления памятью, сменив значение на 4:

параметр null

перезагружаемся и проверяем.

Утечки памяти через невыгружаемый пул идут через другие драйверы.

Вполне себе вероятно. То там, то сям причиной были именно драйверы, не попадавшие “под юрисдикцию” самой Windows. То есть именно те драйвера, к которым система доступа в этом смысле не имела: принтеры, антивирусы, те же сетевые карты. Никакое и ничьё ПО не идеально. Так, последним на моей памяти был klips.sys от Касперского, после обновления которого у человека всё встало на свои места. А вот тут проблема, решённая переустановкой антивируса Bitdefender на обновленную версию. Немалое количество пользователей жалуется на ПО от китайской Razer Cortex Software, производящей компьютерное оборудование всех мастей: от клавиатуры и гарнитур до конечных сборок десктопов и ноутбуков (то бишь лэптопов). Стоило лишь завершить в Диспетчере задач процесс RzKLService.exe, как утечки памяти через невыгружаемый пул моментально прекращались. Так что порой пользователю для решения проблемы было достаточно последовательно отключать сторонние процессы прямо в Диспетчере задач, чтобы выявить виновника.

невыгружаемый пул для каждого из процессов

Для процессов можно настроить отображение невыгружаемого пула из Диспетчера задач

Утечки памяти через невыгружаемый пул: ищем драйвера.

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

Windows Driver Verifier или Диспетчера проверки драйверов

Незаслуженно забытая, но мощная утилита проверки установленных драйверов на предмет повреждения. Это в общих чертах. Однако, первое, с чем я успел в своё время познакомиться, работая с Диспетчером проверки,  она при неверных движениях и настройках легко может вас “отключить” от системы. Так что начните с создания точки восстановления и проверки работоспособности самой функции. Я вас предупредил. Про утечки в памяти она ничего не скажет, но покоцанный драйвер найдёт.

verifier
  • откроется окно “проверяльщика”. Активируем второй пункт Создать нестандартные параметры. Выбираем все тесты, кроме Дополнительной проверки соответствия требованиям DDI и Эмуляции систематической нехватки ресурсов. Жмём далее, ничего не трогая в следующем окне. В следующем за ним выбираем нижний пункт с выбором из списка. Последующее же окно выведет этот самый список. Не уверены какой? Придётся установить флажки подле каждого. Советую, однако, пропустить те из них, чьим вендором является Microsoft. Хотя бы на первый раз.

запуск диспетчера проверки драйверов

проверка драйверов через verifier

выбор драйвера из списка

диспетчер проверки драйверов

выбор всех драйверов для проверки

…но драйверы от Microsoft на первый раз можно пропустить

  • На секунду отвлечёмся от Диспетчера. Сейчас я настоятельно советую вам проверить настройку поведения Windows при появлении критической ошибки. По умолчанию та заставляет Windows перезагрузится при первой опасности. Нам сейчас это не нужно. Открываем редактор реестра
regedit

и ищем ключ HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\CrashControl. Параметр AutoReboot переводим в 0. Редактор реестра больше не нужен.

  • Вернёмся к Диспетчеру проверки драйверов. ВНИМАНИЕ. После нажатия по кнопке Готово система перезагрузится. После перезагрузки Windows будет работать как и прежде. Но с важными данными работать не рекомендую: если появится ошибка или система упадёт в BSOD, зафиксируйте ошибку и причину. Так будет легче проводить дальнейшее расследование.
  • Проверку можно завершить в любой момент. В той же строке cmd от имени администратора наберите
verifier /bootmode resetonbootfail

и перезагрузите компьютер.

Ищем утечки памяти через невыгружаемый пул с помощью PoolMonX.exe.

Проблему с утечкой в части невыгружаемого пула можно попробовать выцепить с помощью консольной утилиты Poolmon.exe, что входит в состав Windows Driver Kit (WDK). Самый, действенный, но тяжёлый вариант попытки решить вопрос. Сам набор WDK полностью качать неохота, есть альтернатива в виде программы Kernel Pool MonitorX. Это урезанный вариант “мелко-мягкой” PoolMon, но иногда его достаточно. Вам потребуется архив с программой и терпение. Кроме того, для дальнейшего анализа придётся обратиться к другой консольной утилите от Sysinternals под названием Sigcheck. Обе легко найти в сети, я предлагаю архив с обеими.

Скачать архив с утилитами PoolMonX и Sigcheck

Если вы впервые используете такие программы, следуйте моему простому шаблону. Запускаем утилиту от имени администратора в тот момент, когда вы обнаруживаете утечку. Сразу щёлкам дважды по столбцу Bytes:

pool monitor

Здесь показаны данные, которые Windows собирает о выгружаемых страницах памяти со стороны драйверов, которым присвоен определённый тег. Крайний левый – и есть список тегов драйверов. Красным подсвечивается строка с драйвером, требующим наибольшее внимание от невыгружаемого пула. Рядом столбец, в котором указан характер обращения – Paged или Non Paged (последний-то нам и нужен). Осталось наблюдать. По идее, одномоментные значения мало что значат. В идеале – записать поведение драйверов за некий промежуток времени. Интенсивное движение у меня наблюдается вокруг драйверов с тегами File, Thre, MmCa. Заряжаем Power Shell, который быстро найдёт связанные с этими тегами драйверы в их настоящем обличии. Ввожу команды перехода в базу драйверов моей системы и отображение списка с драйверами из консоли Power Shell на манер:

Set-Location "C:\Windows\System32\drivers"
Select-String -Path *.sys -Pattern "MmCa" -CaseSensitive | Select-Object FileName -Unique

Перед нами список потенциально проблемных драйверов. Да, для некоторых из тегов он может быть бесконечен. В пору запустить вторую утилиту, пробивая каждый из драйверов последовательно, сверяя сигнатуры. Эта процедура отдалённо чем-то напоминает sfc.exe при проверке целостности системных файлов:

sigcheck C:\Windows\System32\drivers\refs.sys

poolmonx и sighcheck в power shell и cmd

ПРИПИСКА

Упомянутый выше процесс RzKLService.exe на одном из компьютеров вообще себя никак не проявлял. PoolMonX его красным не выделяла, за растрачиванием ресурсов он замечен не был. Однако стоило завершить процесс RzKLService.exe в Диспетчере, как утечки мгновенно прекращались.

В любом случае, проблемный драйвер может себя проявить. Желаю успехов.