У деяких випадках, на комп'ютерах і серверах 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
Або через реєстр
- Відкрийте редактор реєстру regedit.exe
- Перейдіть в гілку HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ Ndu \
- змініть значення параметра 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.