Чому зростає невивантажуваного пул пам'яті в Windows

У деяких випадках, на комп'ютерах і серверах Windows можуть виникати проблеми з вичерпанням вільної пам'яті, викликаної витоком нікого системного драйвера, що зберігає свої дані в невивантажуваного пулі пам'яті системи. Невивантажуваного пул пам'яті (Non-paged memory) - це дані в оперативній пам'яті комп'ютера, що використовуються ядром і драйверами операційною системою, яка ніколи не вивантажується на диск (в своп / файл підкачки), тобто завжди знаходиться у фізичній пам'яті.

Поточний розмір невивантажуваного пулу пам'яті можна побачити в диспетчері завдань на вкладці Perfomance (продуктивність) В розділі Memory (пам'ять). На скріншоті нижче видно, що практично вся пам'ять на сервері зайнята, і велика частина її відноситься до невивантажуваного пулі 4,2 ​​Гб (Non-paged pool / невивантажуваного пул). У нормальному стані розмір невивантажуваного пулу рідко перевищує 200-400 Мб. Це як правило свідчить про наявність витоку пам'яті в якомусь системному компоненті або драйвері.

po

При такому вичерпання пам'яті на сервері, в журналі подій можуть виникати повідомлення виду:

The server was unable to allocate from the system Non-Paged pool because the pool was empty

У переважній більшості випадків причиною описаної витоку пам'яті є проблема зі сторонніми драйверами, встановленими в системі. Як правило, це мережеві драйвера. Зверніть увагу, як поводиться пул при скачуванні великих файлів (швидше за все він при цьому швидко зростає аж до 128 Гб або 75% фізичної пам'яті в x64 системах). Для очищення пулу допомагає тільки перезавантаження, і, якщо для домашнього комп'ютера це ще може бути прийнятно, на цілодобово працюючому сервері бажано знайти нормальне рішення.

зміст:

  • Установка останніх версій драйверів мережевих адаптерів
  • Відключення драйвера моніторингу мережевої активності Windows
  • Відключення ролі Hyper-V
  • Використовуємо утиліту Poolmon для пошуку драйвера, що викликав витік пам'яті

Установка останніх версій драйверів мережевих адаптерів

Спробуйте завантажити і встановити останні версії драйверів ваших мережевих адаптерів з сайту виробника.

У тому випадку, якщо у вас включено автоматичне оновлення драйверів, переконайтеся не почалися чи проблеми після установки нових драйверів. Спробуйте відкотити версію драйвера на старішу і перевірити, відтворюється чи проблема. Якщо проблема вирішилася, вимкніть автооновлення драйверів.

Відключення драйвера моніторингу мережевої активності Windows

Досить часто причиною витоку пам'яті в невивантажуваного пул є несумісність драйвера моніторингу мережевої активності (Network Data Usage - NDU) з драйверами мережевого адаптера комп'ютера. Даний сервіс можна відключити без особливих втратою функціоналу Windows.

Службу можна зупинити командної:

sc config NDU start = disabled

Або через реєстр

  1. Відкрийте редактор реєстру regedit.exe
  2. Перейдіть в гілку HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ Ndu \
  3. змініть значення параметра Start на 4.

Після внесення змін потрібно перезавантажити комп'ютер

Відключення ролі Hyper-V

У деяких випадках утеску пам'яті в невивантажуваного пул провокує встановлена ​​роль Hyper-V. У тому випадку, якщо вона не потрібна, рекомендуємо відключити її.

Використовуємо утиліту Poolmon для пошуку драйвера, що викликав витік пам'яті

У тому випадку, якщо описані вище способи не допомогли, можна спробувати з'ясувати, який саме драйвер викликав витік пам'яті в невивантажуваного пул.

Для цього нам знадобиться консольна утиліта Poolmoon.exe, що входить в комплект розробки Windows Driver Kit (WDK). З сайту MSFT скачайте і встановіть WDK для вашої версії Windows і запустіть утиліту Poolmon.exe (в WDK для Windows 10 утиліта знаходиться в каталозі C: ​​\ Program Files (x86) \ Windows Kits \ 10 \ Tools \.

Після запуску утиліти натисніть клавіші P. У другому стовпці залишаться теги процеси, які використовують невивантажуваного пам'ять (атрибут Nonp), потім, натиснувши клавішу B, виконаємо сортування по стовпцю Bytes.

У нашому прикладі видно, що найбільше RAM в невивантажуваного пулі використовують драйвера з тегами Nr22, ConT і smNp.

Знайти конкретні файли драйверів, пов'язані з даними процесами можна командами:

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

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

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

Утиліта повертає ім'я, опис і версію драйвера.

Тепер можна спробувати видалити / оновити / перевстановити проблемний драйвер або службу.
Дана інструкція застосовна як для Windows Server 2008 - 2016, так і для клієнтських Windows 10, 8 і 7.