Высокое использование непакетного пула памяти (утечка) в Windows

На компьютерах и серверах под управлением Windows могут возникать проблемы с переполнением памяти, вызванные утечкой данных определенного системного драйвера, который хранит свои данные в нестраничном пуле памяти системы. Пул нестраничной памятиl — это данные в оперативной памяти компьютера, используемые ядром и драйверами операционной системы. Пул нестраничной памяти никогда не свопится на диск (в файл подкачки), он всегда хранится только в физической памяти.

 

Текущий размер нестраничной памяти можно посмотреть в окне Память раздел Производительность на вкладке «Диспетчер задач». На скриншоте ниже видно, что почти вся память сервера занята, причем большую ее часть занимает нестраничный пул размером 4,2 ГБ. Обычно размер невызываемого пула редко превышает 200-400 МБ. Большой размер невызываемого пула часто указывает на утечку памяти в каком-либо системном компоненте или драйвере устройства.

Большое использование памяти в непарном пуле в Windows

Если на сервере произошла утечка памяти в нестраничном пуле, в системном журнале событий появятся следующие события:

Идентификатор события: 2019
Источник: Srv
Описание: The server was unable to allocate from the system nonpaged pool because the pool was empty

В большинстве случаев причиной описанной выше утечки памяти являются проблемы со сторонними драйверами, установленными в Windows. Как правило, это сетевые драйверы. Обратите внимание на поведение пула при загрузке больших файлов (скорее всего, он быстро растет).

Максимальный размер нестраничного пула в Windows:

  • Windows x64 до 128 Гб и не более 75% физической памяти
  • Windows x86 до 2 Гб и не более 75% оперативной памяти

Только перезагрузка Windows помогает очистить нестраничный пул. Это может быть приемлемо для домашнего устройства, но для сервера, работающего 24/7, следует найти лучшее решение.

Отключите драйвер мониторинга использования сетевых данных

Довольно часто причиной утечки памяти в нестраничном пуле является несовместимость драйвера мониторинга сетевой активности (Использование сетевых данных — NDU, %WinDir%\system32\drivers\Ndu.sys) с драйверами сетевых адаптеров. Чаще всего драйверы сетевых карт Killer Network и MSI конфликтуют с драйвером NDU. Эту службу можно отключить без особого ущерба для функциональности Windows.

Остановите службу NDU командой:

sc config NDU start= disabled

отключить драйвер Network Data Usage (NDU)

Или через реестр:

  1. Откройте редактор реестра (regedit.exe);
  2. Перейдите к ключу реестра HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Ndu\;
  3. Измените значение параметра Начать параметр к 4.

отключение службы ndu в windows

После внесения изменений необходимо перезагрузить компьютер.

Использование PoolMon для поиска утечки памяти в режиме ядра

Вы можете попытаться определить драйвер, который вызвал утечку памяти в нестраничном пуле. Для этого нам понадобится Poolmoon.exe консольный инструмент, входящий в состав Комплект драйверов для Windows (WDK). Загрузите и установите WDK для вашей версии Windows с сайта Microsoft. Затем запустите файл Poolmon.exe (в случае WDK для Windows 10 инструмент находится в папке C:\Program Files (x86)\Windows Kits\10\Tools\ папке).

После запуска инструмента нажмите кнопку P. Во втором столбце будут отображены метки процессов, использующих нестраничную память (атрибут Nonp). Затем нажмите кнопку B клавиша для сортировки списка драйверов по столбцу «Байты».

Проверка использования непакетного пула с помощью инструмента PoolMon.exe

В левой колонке перечислены теги драйверов. Ваша задача — определить файл драйвера по этому тегу. В нашем примере видно, что большая часть оперативной памяти в нестраничном пуле используется драйверами с тегами Nr22, Конт, и smNp.

Вы должны проверить драйверы на наличие найденных тегов с помощью strings.exe (от Sysinternals), используя встроенный инструмент findstr или с помощью PowerShell.

Используйте следующие команды для поиска файлов драйверов, связанных с найденными тегами:

findstr /m /l /s Nr22 %Systemroot%\System32\drivers\*.sys
findstr /m /l /s ConT %Systemroot%\System32\drivers\*.sys
findstr /m /l /s smNp %Systemroot%\System32\drivers\*.sys

Также можно использовать PowerShell:

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

Вы можете сопоставить файлы драйверов для тегов непосредственно в файле poolmon.exe. Для этого убедитесь, что в файле pooltag.txt файл находится в каталоге инструментов. Вы можете скопировать файл pooltag.txt из каталога установки WDK или загрузить его с GitHub. Запустите poolmon следующим образом:

poolmon /g

использование файла pooltag.txt в poolmon для отображения файлов mapped_driver

Обратите внимание, что имя драйвера теперь отображается в поле Mapped_driver колонка.

Итак, мы получили список файлов драйверов, которые могут вызывать проблему. Теперь нужно определить, к каким драйверам и компонентам системы относятся эти файлы по их именам. Для этого можно воспользоваться функцией sigcheck инструмент от Sysinternals.

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

Инструмент возвращает имя, описание и версию драйвера или компонента Windows.

sigcheck - получение компонента/драйвера windows по sys-файлу

Теперь можно попробовать удалить/обновить/переустановить проблемный драйвер или службу.

Если утечка памяти привела к BSOD, вы можете определить проблемный драйвер в файле дампа памяти.

  1. Загрузите дамп памяти в отладчик Windbg;
  2. Выполните команду: !vm
  3. Если Использование NonPagedPool значение больше, чем NonPagedPool Max, то это означает, что пул невыделяемых страниц исчерпан;
  4. Проверьте содержимое пула с помощью команды (результаты будут отсортированы по использованию пула non-paged): !poolused 2
  5. После получения метки драйвера найдите файл драйвера с помощью команды findstr или strings.exe , как описано выше.

Установите последние версии драйверов сетевых адаптеров

Попробуйте загрузить и установить последние версии драйверов для сетевых адаптеров с сайта производителя.

Если в Windows включено автоматическое обновление драйверов, проверьте, не начались ли проблемы после установки новых драйверов. Попробуйте откатиться к предыдущей версии драйверов и посмотрите, сохраняется ли проблема. Если проблема решена, отключите автоматическое обновление драйверов.

Отключение роли Hyper-V

В некоторых случаях установленная роль Hyper-V приводит к утечке памяти в нестраничный пул. Если вам не нужна эта роль, мы рекомендуем отключить ее.

На Windows Server роль Hyper-V можно отключить с помощью команды PowerShell:

Remove-WindowsFeature -Name Hyper-V

Команда для Windows 10:

Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All

Если поиск не дал результатов, проверьте, не вызвана ли утечка памяти процессом в пользовательском режиме. Откройте диспетчер задач, перейдите в раздел Подробности , добавьте вкладку Пул NP столбец и ищите процессы с большим объемом памяти в нестраничном пуле.

показать непакетный пул в диспетчере задач для процессов

Это руководство применимо как для Windows Server 2019/2016/2012R, так и для настольной Windows 10/8.1.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *