Невыгружаемый пул занимает память Windows 10 — решение

Одна из распространенных проблем пользователей Windows 10, особенно с сетевыми картами Killer Network (Ethernet и Wireless)— заполняющаяся оперативная память при работе в сети. Обратить на это внимание можно в диспетчере задач на вкладке «Производительность», выбрав RAM. При этом, заполняется невыгружаемый пул памяти.
Исправление утечки памяти и заполнения невыгружаемого пула при работе в сети
Наиболее распространенной ситуацией является, когда невыгружаемый пул RAM Windows 10 заполняется при работе в Интернете. Например, легко заметить, как он растет при скачивании большого файла и после этого не очищается.
Если описанное — ваш случай, то исправить ситуацию и очистить невыгружаемый пул памяти можно следующим образом.
- Зайдите в редактор реестра (нажмите клавиши Win+R на клавиатуре, введите regedit и нажмите Enter).
- Перейдите к разделу
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Ndu\

По завершении, перезагрузите компьютер и проверьте, была ли исправлена проблема. Как правило, если дело действительно в драйверах сетевой карты, невыгружаемый пул больше не растет больше своих обычных значений.
Если шаги, описанные выше, не помогли, попробуйте следующее:
- Если драйвер сетевой карты и (или) беспроводного адаптера был установлен с официального сайта производителя, попробуйте удалить его и дать Windows 10 установить стандартные драйверы.
- Если драйвер был автоматически установлен Windows или был предустановлен производителем (и система после этого не менялась), попробуйте скачать и установить последнюю версию драйвера с официального сайта производителя ноутбука или материнской платы (если это ПК).
Заполняемый невыгружаемый пул оперативной памяти в Windows 10 не всегда бывает вызван драйверами именно сетевой карты (хотя чаще всего) и если действия с драйверами сетевых адаптеров и NDU не приносят результата, можно прибегнуть к следующим шагам:
- Установка всех оригинальных драйверов от производителя на ваше оборудование (особенно если на данный момент времени у вас установлены драйверы, автоматически установленные Windows 10).
- Использование утилиты Poolmon из состава Microsoft WDK для определения драйвера, вызывающего утечку памяти.
Как узнать, какой драйвер вызывает утечку памяти в Windows 10 с помощью Poolmon

Выяснить конкретные драйверы, приводящие к тому, что невыгружаемый пул памяти растет можно с помощью инструмента Poolmoon, входящим в состав Windows Driver Kit (WDK), скачать который можно с официального сайта Майкрософт.
- Загрузите WDK для вашей версии Windows 10 (не используйте шаги на предлагаемой странице, относящиеся к установке Windows SDK или Visual Studio, просто найдите пункт «Установите WDK для Windows 10» на странице и запустите установку) с сайта https://developer.microsoft.com/ru-ru/windows/hardware/windows-driver-kit.
- После установки, зайдите в папку с WDK и запустите утилиту Poolmon.exe (по умолчанию утилиты находятся в C:\ Program Files (x86)\Windows Kits\ 10\ Tools\ ).
- Нажмите латинскую клавишу P (так, чтобы второй столбец содержал только значения Nonp), затем — B (это оставит в списке только записи, использующие невыгружаемый пул и отсортирует их по количеству занимаемого пространства в памяти, т.е. по столбцу Bytes).

- Обратите внимание на значение столбца Tag для занимающей наибольшее количество байт записи.
- Откройте командную строку и введите команду findstr /m /l /s значение_столбца_tag C:\Windows\System32\drivers\*.sys

- Вы получите список файлов драйверов, которые могут оказаться причиной проблемы.
Дальнейший путь — выяснить по именам файлов драйверов (с помощью Google, например), к какому оборудованию они относятся и пробовать установить, удалить или откатить в зависимости от ситуации.
А вдруг и это будет интересно:
- Лучшие бесплатные программы для Windows
- Как открыть Свойства системы Windows 11 и 10
- Как отключить или удалить Связь с телефоном в Windows 11 и 10
- Ошибка 0xc000001d при запуске игры или программы — как исправить?
- Ключ восстановления BitLocker в Windows — способы посмотреть
- User OOBE Broker — что это за процесс в Windows 11 и 10
- Windows 11
- Windows 10
- Android
- Загрузочная флешка
- Лечение вирусов
- Восстановление данных
- Установка с флешки
- Настройка роутера
- Всё про Windows
- В контакте
- Одноклассники
-
Валерий 16.07.2017 в 23:02
- Dmitry 17.07.2017 в 08:32
Почему растет невыгружаемый пул памяти в Windows?

31.01.2022

itpro

Windows 10, Windows Server 2016, Windows Server 2019

комментариев 10
На компьютерах и серверах Windows могут возникать проблемы с исчерпанием свободной памяти, вызванной утечкой некого системного драйвера, хранящего свои данные в невыгружаемом пуле памяти системы. Невыгружаемый пул памяти (Non-paged memory) – это данные в оперативной памяти компьютера, используемые ядром и драйверами операционной системой, которая никогда не выгружается на диск (в своп/ файл подкачки), т.е. всегда находится в физической RAM памяти.
Текущий размер невыгружаемого пула памяти можно увидеть в диспетчере задач Windows на вкладке Perfomance (Производительность) в разделе Memory (Память). На скриншоте ниже видно, что практически вся память на сервере занята, и большая часть ее относится к невыгружаемому пулу 4,2 Гб (Non-paged pool / Невыгружаемый пул). В нормальном состоянии размер невыгружаемого пула редко превышает 200-400 Мб. Большой размер невыгружаемого пула часто указывает на наличии утечки памяти в каком-то системном компоненте или драйвере.

При утечке памяти в невыгружаемом пуле на сервере, в системном журнале событий появится события:
Event ID: 2019
Source: Srv
Description: 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% RAM
Для очистки пула помогает только перезагрузка, и, если для домашнего компьютера это еще может быть приемлемо, то на круглосуточно работающем сервере желательно найти нормальное решение.
Установка последних версий драйверов сетевых адаптеров
Попробуйте скачать и установить последние версии драйверов ваших сетевых адаптеров с сайта производителя.
Если у вас в Windows включено автоматическое обновление драйверов, убедитесь не начались ли проблемы после установки новых драйверов. Попробуйте откатить версию драйвера на более старую и проверить, воспроизводится ли проблема. Если проблема решилась, отключите авто обновление драйверов.
Отключение драйвера мониторинга сетевой активности Windows
Достаточно часто причиной утечки памяти в невыгружаемый пул является несовместимость драйвера мониторинга сетевой активности (Network Data Usage — NDU, %WinDir%\system32\drivers\Ndu.sys) с драйверами сетевого адаптера компьютера (чаще всего конфликтуют драйвера для сетевых карт Killer Network и MSI). Данный сервис можно отключить без особых потерь функционала Windows.
Службу можно остановить командной:
sc config NDU start= disabled

Либо через реестр:
- Откройте редактор реестра regedit.exe
- Перейдите в ветку HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Ndu\
- Измените значения параметра Start на 4.

После внесения изменений нужно перезагрузить компьютер
Отключение роли Hyper-V
В некоторых случаях утечку памяти в невыгружаемый пул вызывает установленная роль Hyper-V. Если эта роль не нужна, рекомендуем отключить ее.
Remove-WindowsFeature -Name Hyper-V
Команда для Windows 10:
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
Поиск драйвера, вызвавшего утечку памяти с помощью Poolmon
Если описанные выше способы не помогли, можно попробовать определить драйвер, который вызвал утечку памяти в невыгружаемый пул.
Для этого нам понадобится консольная утилита Poolmoon.exe, входящая в комплект разработки Windows Driver Kit (WDK). Скачайте с сайта Microsoft и установите WDK для вашей версии Windows и запустите утилиту Poolmon.exe (в WDK для Windows 10 утилита находится в каталоге C:\Program Files (x86)\Windows Kits\10\Tools\ ).
После запуска утилиты Poolman.exe нажмите клавиши P. Во втором столбце останутся теги процессов, которые используют невыгружаемую память (атрибут Nonp) Затем нажмите клавишу B, чтобы выполнить сортировку по столбцу Bytes.

В левом столбце указаны теги драйверов. Ваша задача определить файл драйвера, использующего этот тег. В нашем примере видно, что больше всего RAM в невыгружаемом пуле используют драйвера с тегами Nr22, ConT и 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. Его можно скопировать из каталога установки WDK или найти в GitHub. Запустите утилиту:

Обратите внимание, что имя драйвера теперь отображается в столбце Mapped_driver.
Если поиск не дал результатов, проверьте возможно утечка памяти вызвана не системным процессом. Запустите Task Manager, перейдите на вкладку Details, добавьте колонку NP Pool и найдите процессы с большим размером памяти в невыгружаемом пуле.

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

Утилита возвращает имя драйвера, его свойства и информацию о версии.
Теперь можно попытаться удалить/обновить/переустановить проблемный драйвер или службу.
Если утечка памяти привела к BSOD, вы можете определить проблемный драйвер по файл дампа памяти.
- Загрузите дамп памяти в отладчик Windbg;
- Выполните команду: !vm
- Если значение NonPagedPool Usage больше чем Max, это говорит о том, что невыгружаемый пул исчерпан;
- Проверьте содержимое пула командой (результаты будут отсортированы по использованию невыгружаемого пула): !poolused 2
- После получение тега драйвера найдите файл с помощью findstr или strings как описано выше.
Данная инструкция применима как для Windows Server 2019/2016/2012R2, так и для клиентских Windows 10, 8.1.
Предыдущая статья Следующая статья
Что делать, если невыгружаемый пул занимает всю память в Windows 10
Пользователи периодически жалуются на то, что невыгружаемый пул занимает всю память в Windows 10. Чаще всего это вызвано некорректной работой сетевых драйверов, в том числе их конфликтом с другим ПО.В более редких случаях «виновником» могут оказываться и другие драйвера. В норме пул не должен занимать много места, как это показано на изображении ниже.

Самый эффективный метод
Способ, о котором пойдет речь, связан с сетевой картой. Он особенно действенен в тех случаях, когда неконтролируемое увеличение пула связан с использованием интернета.
Важно учитывать, что вся процедура будет проводиться в реестре. Категорически не рекомендуется изменять параметры или разделы, которые не указаны в инструкции. В противном случае ваши действия могут легко навредить системе, приведя к ее нестабильной работе. Заключается процедура в следующем:
- Открыть редактор. Быстрее всего будет ввести название в поиске на панели задач. Также можно найти ярлык в меню «Пуск» (находится в папке «Средства администрирования»).

- Перейти по пути, обведенному на картинке ниже.

- Найти параметр «Start» (подчеркнут на скриншоте). Нужно дважды нажать по нему ЛКМ, чтобы открыть свойства.
- В строке «Значение» поставить 4 и кликнуть по кнопке «ОК», чтобы сохранить изменения.

- Закрыть утилиту и перезагрузить устройство.
Что делать, если способ не помог
Данный вариант эффективен, если проблема в сетевом драйвере, однако он не может помочь, если «виновником» оказалось другое ПО. Установить причину может быть очень сложно. Поэтому чаще всего приходится делать все наугад, меняя один драйвер за другим.
Суть в том, что виной всему обычно являются неправильная установка, устаревшая или некорректная версия ПО. Если установка и поиск проводились в автоматическом режиме (с помощью диспетчер устройств или сторонних утилит), рекомендуется удалить драйвера. Затем их следует скачать с официального сайта и поставить самостоятельно: часто этого достаточно для решения проблемы.

И напротив, если ПО было поставлено вручную, можно попробовать осуществить процедуру в диспетчере (относится к числу встроенных утилит). Открыть его можно, нажав ПКМ по меню «Пуск»: в появившемся меню можно найти одноименный пункт.
Проблемы с загруженностью памяти нередки. Слишком большое количество невыгружаемого пула всегда связано с драйверами. По этой причине следует устранить возможные конфликты, а также скачать и поставить ПО заново.
Понравилось? Поделись с друзьями!
Дата: 05.01.2022 Автор/Переводчик: Wolf
Утечки памяти через невыгружаемый пул.

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

примерно так выглядит невыгружаемый пул «здорового» юзера
По опыту (своему и чужому), та редко превышает планку 400—500 Мб (системе больше не нужно), хотя по «паспорту» она просто не должна превышать 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:

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

Для процессов можно настроить отображение невыгружаемого пула из Диспетчера задач
Утечки памяти через невыгружаемый пул: ищем драйвера.
Пришло время поработать вручную, и придётся потратить время. Для поиска могу предложить два варианта развития событий. Можно выполнять их последовательно и раздельно. Готового решения уже нет, здесь только инструменты.
Windows Driver Verifier или Диспетчера проверки драйверов
Незаслуженно забытая, но мощная утилита проверки установленных драйверов на предмет повреждения. Это в общих чертах. Однако, первое, с чем я успел в своё время познакомиться, работая с Диспетчером проверки, она при неверных движениях и настройках легко может вас «отключить» от системы. Так что начните с создания точки восстановления и проверки работоспособности самой функции. Я вас предупредил. Про утечки в памяти она ничего не скажет, но покоцанный драйвер найдёт.
- заряжаем консоль cmd от имени администратора и вводим команду
verifier
- откроется окно «проверяльщика». Активируем второй пункт Создать нестандартные параметры. Выбираем все тесты, кроме Дополнительной проверки соответствия требованиям DDI и Эмуляции систематической нехватки ресурсов. Жмём далее, ничего не трогая в следующем окне. В следующем за ним выбираем нижний пункт с выбором из списка. Последующее же окно выведет этот самый список. Не уверены какой? Придётся установить флажки подле каждого. Советую, однако, пропустить те из них, чьим вендором является Microsoft. Хотя бы на первый раз.





…но драйверы от 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. Обе легко найти в сети, я предлагаю архив с обеими.
Если вы впервые используете такие программы, следуйте моему простому шаблону. Запускаем утилиту от имени администратора в тот момент, когда вы обнаруживаете утечку. Сразу щёлкам дважды по столбцу Bytes:

Здесь показаны данные, которые 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

ПРИПИСКА
Упомянутый выше процесс RzKLService.exe на одном из компьютеров вообще себя никак не проявлял. PoolMonX его красным не выделяла, за растрачиванием ресурсов он замечен не был. Однако стоило завершить процесс RzKLService.exe в Диспетчере, как утечки мгновенно прекращались.
В любом случае, проблемный драйвер может себя проявить. Желаю успехов.