Очистить память на сервере
Для большинства пользователей операционная система – это «черный ящик», и что происходит внутри него – это таинство. Но иногда хочется «пнуть» этот ящик, что бы он работал так, как надо… Конечно, принудительная очистка standby памяти напоминает "танец с бубном" (вроде система должна делать это сама), но в некоторых случаях она помогает.
(3) AlexBugs,
Да, подойдет - скриншоты в примере, как раз сняты в такой системе. RamMap - очень полезная утилита, подробнее с ней можно ознакомиться в книге Руссиновича, Маргозиса: "Утилиты Sysinternals. Справочник администратора". А на счет кайфа - все зависит зависит от ПО, которое у Вас запущено. По крайней мере хуже не будет.
(6) dkonakov,
Если можно, немного подробнее о проблемах. В моей практике, например, наблюдалось некоторое замедление работы программ, после запуска некоторых приложений в течении дня (поэтому утром, перед началом рабочего, дня принудительно очищаю память). А какие проблемы были у Вас?
(7) у меня проблемы начинались, когда свободная память приходила к нулю. А на текущем этапе, когда перешли на управляемые формы, приходится делать раза 2-3 в день, 32 Гигобайта на 2008 сервере не хватает.
(16) dkonakov,
Не пробовали, при недостатке памяти, утилитой RamMap проверить на каких процессах, файлах "уходит" память.
супер скрипт! на сервере 16 гигов памяти, после ночного бэкапа вся standby была загажена кусками файловых бэкапов. а теперь всё хорошо )
Статья полезная. Ручное использование утилиты помогает., но полностью Standby память не очищается, из 1600 осталось около 700 К занято.
Сам скомпилировать скрипт не могу, а специально зарабатывать $m не буду.
На самом деле, существует определенное количество специализированных менеджеров памяти - пример Cacheman.
По моим ощущениям на порядок возрастает дисковая активность.
И к тому же, у меня есть подозрение - windows сам разруливает как standby превратить в free.
В любом случае автору респект за интересную статью.
В заголовке ошибка - утилита называется RAMMAP. А вообще, только она и помогла, тоже сервер через некоторое время выедал free память и начинал тормозить. Перезагрузка, конечно помогала, и во многих отношениях она лучше. Но если перезагрузить никак, а память освободить нужно - эта утилита просто спасение!
Полезная статья. Хотел запускать RAMMap.exe без указания пути, не работает при запуске из планировщика задач.
Чтобы каждый раз скрипт не перекомпилировать когда папку хранения программы меняешь, сделал так:
(20) Действительно. Самый простой вариант. Качаем прямо по первой Гугл-ссылке, кидаем в планировщик и всё!
Смею сделать замечание, что подобный механизм не работает в связке с Hyper-V, даже после освобождения всей доступной для очистки памяти гипервизор считает ее занятой, и помогает только REBOOT.
Большое спасибо,то ли после настройки бэкапа, то ли оттого, что увеличилось количество пользователей 1с стала накапливаться Standby память на сервере, и свободной памяти стало не хватать. Пока что просто очистил standby неглядя, потом буду смотреть детально, откуда что берется, как я понимаю программа позволяет это сделать.
Да, программа просто отличная, и можно посмотреть: куда уходят ресурсы. Я ее применяю не только на сервере но и на рабочих станциях под Windows 7 (там то же память после некоторых задач не освобождается). Я заметил, что такое иногда происходит даже при операциях простого копирования очень больших файлов (десятки Гб). На сайте самой программы (которая, кстати иногда обновляется последнее обновление 02.02.2016 г.) есть еще очень много полезных утилит , которые заслуживают внимания для мониторинга автозагрузки, запущенных задач и т.д.. Утилиты документированы и выпущена книга на русском языке, описывающая пакет утилит "Утилиты Sysinternals. Справочник администратора".
Материал посвящен описанию использования подсистемы памяти в MS SQL server. Данный обзор дает только общее представление о структуре управления. Следует помнить, что продукты компании Microsoft поставляются с закрытыми кодами и детальные сведения отсутствуют в общедоступных источниках (насколько удалось выяснить нам, если Вам удалось большее – сообщите, пожалуйста). Общий обзор необходим для понимания описываемых далее возможных проблем SQL server и используемых средств тестирования и измерения производительности.
Memory manager
Memory manager (ММ) является основным элементом, который управляет распределением памяти в SQL сервере. Данный компонент автоматически распределяет доступную SQL серверу память, снижая необходимость ручной настройки. После загрузки SQL ММ определяет первоначальный объем распределенной памяти и далее по мере изменения нагрузки динамически резервирует или освобождает оперативную память. Таким образом, ММ управляет взаимодействием SQL сервера с операционной системы в контексте управления памятью. Memory manager является частью SQLOS. Подробнее можно посмотреть здесь.
Состав Memory Manager
Сведения о составе этого компонента весьма ограничены, однако можно выделить следующие составные части ММ: memory nodes, memory clerks (клерки памяти), memory caches (кэши) и memory objects (объекты). Подробнее можно прочитать здесь и здесь.
Также ММ предоставляет несколько счетчиков, которые позволяют оценить использование оперативной памяти в SQL. Подробнее можно прочитать здесь и здесь.
Обобщенно состав ММ представлен на Рисунке 1.1
Рисунок 1.1 Компоненты Memory Manager
Объекты ММ используются для распределения памяти внутри экземпляра SQL Server. Memory nodes обеспечивают интерфейс к ОС и реализацию выделения памяти на нижнем уровне. Внутри SQL Server только Memory clerks имеют доступ к интерфейсу. Memory nodes для распределения памяти. Каждый компонент SQL Sever, который потребляет существенный объем памяти должен создать собственный клерк и распределять память именно через его интерфейс.
Реализация управлению памятью меняется от версии к версии SQL, однако основные функциональные компоненты сохраняются. На рисунке 2.2 приведены отличия в реализации ММ в SQL2008 и SQL2012 дополнительные сведения можно найти здесь.
Рисунок 1.2 Изменения в структуре Memory Manager для SQL2008 и SQL 2012
Из рисунков видно, что полностью исчезло разделение page allocator. Эти компоненты были заменены одним Any-size page allocator.
Memory Nodes
Memory Nodes является внутренним объектом SQLOS. Представляет собой логический объект памяти, которая соответствует процессору в случае SMP-реализации или группе процессоров в случае NUMA-реализации. Подробнее можно посмотреть здесь.
Рисунок 1.3 Иерархия SQLOS в случае реализации SMP (А — рисунок) и NUMA (Б- рисунок)
Memory node абсолютно прозрачна для потребителей памяти. Главная задача этого компонента состоит в определении области выделения памяти. Memory node состоит из нескольких распределителей памяти (memory allocators). На рисунке 2.4 представлены потребители памяти, использующие memory node. Подробнее можно посмотреть здесь и здесь.
Рисунок 1.4 Memory nodes
Memory allocators являются процедурами, которые определяют тип Windows API используемой для выделения памяти. Аллокаторы содержат программный код используемый для выделения памяти, например, для страниц или использования shared memory.
Memory clerks
Memory nodes обеспечивают интерфейс к ОС и реализацию выделения памяти на уровне Windows. Внутри SQL Server только Memory clerks имеют доступ к интерфейсу Memory nodes для распределения памяти. Каждый компонент SQL Sever, который потребляет существенный объем памяти, должен создать собственный клерк и далее распределять ресурсы именно через его интерфейс.
Таким образом, клерки выполняют следующие функции в рамках Memory manager:
• Отражают использование памяти конкретными компонентами сервера
• Получают уведомления о смене состояний памяти и изменяют её размер согласно обстоятельствам.
• Используют Memory nodes для выделения памяти компонентам сервера.
Выделяют четыре категории клерков. Список категорий приведен в таблице 1. Подробнее можно посмотреть здесь.
Memory Caches
Под понятием «кэш» понимается механизм кэширования различных типов данных с учетом стоимости хранения объектов. Кэш обеспечивает: контроль времени хранения, видимость и анализ статистики обращения к кэшированным данным. Кэшированные данные могут быть использованы одновременно несколькими потребителями. Кроме кэшей SQL Server использует пулы памяти. Пулы в отличии от кэшей используются для хранения однородных данных без дополнительного контроля. Используется несколько механизмов кэширования и них основные:
• Cache Store
• User Store
• Object Store
Только Object Store является пулом, Cache и User Store являются кэшами. Механизмы Cache и User Store весьма похожи, однако если параметры Cache Store контролируются целиком SQLOS, то для User Store разработчики могут использовать собственные алгоритмы управления. В документации также используются понятия Cache Store и User Store со значением “обособленные области памяти”. Каждому Cache Store сопоставлено хранилище hash table. Возможно использование не одной, а нескольких таблиц hash tables. Hash table – это структура в памяти, которая содержит массив указателей на страницы буфера. Хэширование – это методика, которая единообразно отображает значение ключа в соответствующий hash bucket.
Подробнее можно прочитать здесь (про хэш) и здесь и здесь и здесь.
Cache Store используются, например, для хранения кэша планов выполнения, кэша xml, кэша полнотекстового поиска, Procedure Cache, System Rowset Cache. В User Store хранятся в частности кэш метаданных пользовательских и системных баз, токены безопасности, данные схем. Полный список можно найти в динамическом представлении dm_os_memory_cache_counters.
Buffer pool (buffer cache) а также buffer pool extension
Buffer pool (второе название buffer cache) – это область в памяти, которая используется для кэширования страниц, данных таблиц и их индексов, размер страниц 8Кб. Использования Buffer pool уменьшает ввод/вывод в файл базы данных и таким образом увеличивает производительность сервера. При этом Buffer Cach является основным потребителем памяти в SQL Server.
Рисунок 1.5 Компоненты системы управления буфером
В SQL Server 2014 buffer pool может быть расширен в энергонезависимую память, например, на диск SSD. Такое расширение называется Buffer Pool Extension. Подробнее можно прочитать здесь здесь.
Подробнее об управлении буферным кэшем можно прочитать здесь, здесь и здесь.
Буферный кэш имеет собственный клерк памяти и распределят память через page allocator. Для буферного кэша используется клерк памяти типа Generic и называется memoryclerk_sqlbufferpool.
До SQL 2012 Buffer Cache использовал только Single Page Allocator (распределяющий отдельные страницы 8Кб). Если компоненту сервера было необходимо выделить буфер большего, чем 8Кб размера использовался Multi Page Allocator (см. рис. 2.4) и соответственно эта память располагалась за пределами Buffer Pool. C SQL2012 Single и Multi Page allocators были объединены в Any-size page allocator. На рис. 2.2 можно увидеть эти изменения.
Max server memory и min server memory
Хотя управление буферным кэшем происходит автоматически внутри SQL Server, однако администраторы могут регулировать максимальный и минимальный размер распределяемой памяти для этого буфера.
Рисунок 1.6 Изменения в диапазоне памяти резервируемой параметром Max server memory
Как уже упоминалось в SQL 2012 произошли изменения memory manager. В результате таких изменений параметр max server memory регулирует не только память buffer pool, но вообще всё распределение памяти (кроме Direct Memory Allocations производимых с помощью VirtualAlloc).
Параметр min server memory обозначает границу, ниже которой Buffer Pool не будет по требованию освобождать занятую память. При первоначальной загрузке пул не занимает память, указанную в min server memory. Используется минимально необходимый объем, который вычисляется автоматически. Размер пула при необходимости в дальнейшем увеличивается.
Подробнее можно прочитать здесь и здесь.
Stolen pages
Stolen pages — это страницы буферного кэша, которые используются для различных целей в сервере. Например, для процедурного кэша, операций сортировки (т.е. рабочей памяти запроса — workplace memory). Также эти страницы необходимы для хранения таких структур данных, которые требуют распределение памяти менее 8Кб, например, блокировки, контекст транзакций и информации о соединении.
Подробнее можно посмотреть в следующих источниках:
Object Store
Object Store представляет собой пул памяти. Он используется для хранения однородных типов данных без дополнительного контроля стоимости хранения. Эти данные могут быть легко очищены в случае нехватки памяти. По своей структуре пулы являются клерками памяти (т.е. являются одним из его видов). Дополнительно можно посмотреть здесь и здесь.
Memory Objects (MO)
Memory Objects представляют собой кучу памяти, которая использует интерфейс клерков памяти чтобы получить доступ к page allocator для выделения страниц. Memory Objects не используют интерфейсы виртуальной или общей памяти, этот элемент использует только механизм распределения страниц. Многие компоненты SQL Server обращаются напрямую к MO, минуя клерки памяти. МО предоставляют возможность распределить диапазоны памяти произвольного размера.
Memory Broker (МВ)
Memory broker (брокер памяти) является компонентом SQLOS. Брокер памяти отвечает за распределение памяти между различными компонентами SQL Server в соответствии с их запросами. Более подробно можно прочитать на сайте производителя.
Рисунок 1.7 Распределение памяти Memory Broker
Описание механизма: МВ отслеживает запросы памяти от компонентов SQL и сопоставляет с текущими показатели её использования. Основываясь на полученной информации, брокер вычисляет «оптимальный» размер памяти, которая может быть распределена между компонентами. Брокер уведомляет компоненты о своих вычислениях, после этого каждый компонент использует эти сведения для дальнейшего использования памяти.
МВ можно увидеть в следующих динамических представлениях “sys.dm_os_ring_buffers”, где Ring_buffer_type = “RING_BUFFER_MEMORY_BROKER”. Подробнее можно прочитать здесь, здесь и здесь.
Resource semaphore
Для большинства пользователей операционная система – это «черный ящик», и что происходит внутри него – это таинство. Но иногда хочется «пнуть» этот ящик, что бы он работал так, как надо… Конечно, принудительная очистка standby памяти напоминает "танец с бубном" (вроде система должна делать это сама), но в некоторых случаях она помогает.
«Памяти мало не бывает» - Народное правило апгрейда компьютера.
Внимание. Все описанное ниже относится к Windows Vista и выше…
Каждый, кто хоть раз заглядывал (кто из любопытства, кто по долгу службы) в «Монитор ресурсов» на закладку «Память» видел подобную картинку:
Причем, через некоторое время, она существенно меняется (в зависимости от используемого ПО и настройки системы):
Мы видим, что память из списка «Ожидание» (Standby) – растет, свободная память – уменьшается…
В данном случае свободной памяти почти не осталось:
А в Standby памяти находятся большие файлы архивов вечернего бэкапа:
И самое главное, есть 100% уверенность, что нахождение их в Standby памяти не целесообразно – бэкап уже закончился.
Теоретически, Standby память содержит кэшированные данные, которые возможно, когда-нибудь будут использоваться в дальнейшем… При этом, когда системе потребуется дополнительные ресурсы, системный менеджер памяти может освободить из списка Standby необходимую память.
p.s. сервер mssql+1cv81 4 базы: 2 торговли не типовых 65G каждая, 1 ЗУП 1,5G 1 бухгалтерия 14G Подскажите как standby превратить в free «
Конечно не факт, что «тормоза» в данном конкретном случае возникли только по этой причине, но как говорят: «осадок остался».
Так как Standby память – страницы физической памяти, которые активно не используются, и могут быть при необходимости выделены менеджером памяти другим задачам, значит, не будет ничего плохого, если мы освободим их без участия системы, но, конечно, корректно.
Результат выполнения очистки (красым отмечена свободная память):
И в мониторе ресурсов свободной памяти значительно прибавилось:
Эта утилита, написанная легендарным
$ret = ShellExecute('C:\UTIL\RAMMap\RAMMap.exe')
; Ожидаем появление окна программы RamMap
$hWnd = WinWait("[CLASS:RamMapClass]", "", 10)
If Not $hWnd Then
WinActivate("[CLASS:RamMapClass]", "") ; наше окно - активное
; Выбираем пункт "Empty Standby List" в меню "Empty" программы
WinMenuSelectItem($hWnd, '', '&Empty', 'Empty S&tandby List')
; ждем выполнение очистки 5 сек. (ориентировочно. )
; Ждем 5 секунд, чтобы увидеть результат и выйти.
Скрипт компилируем в исполняемый файл. После чего, в Планировщике заданий можно создать системное задание по расписанию, которое, например, перед началом рабочего дня, очищает память, тем самым освобождая так необходимые пользователю ресурсы.
Еще раз повторюсь – эта утилита (RamMap) работает на Windows Vista и выше…
PS: Для тех, кто любит разбираться в деталях – ссылка на статью по организации управления памяти в Windows:
26.10.2020
itpro
Windows Server 2012 R2, Windows Server 2016
комментариев 16
Утилита очистки диска (Disk Cleanup) позволяет администратору быстро очистить системный диск Windows Server, удалив ненужные и временные файлы, в том числе очистить каталог WinSxS от файлов устаревших компонентов, которые остались после установки обновлений. Утилита Disk Cleanup (cleanmgr.exe) по умолчанию уже установлена в графической версии Windows Server 2016/2019 (Desktop Experience), однако в предыдущих версиях Windows Server (2012 R2/ 2012/ 2008 R2) утилита cleanmgr.exe по-умолчанию отсутствует.
Запуск cleanmgr в Windows Server 2012 R2/ 2008 R2 без установки Desktop Experience
В Windows Server 2012 / R2 и 2008 /R2 по умолчанию не установлена утилита очистки диска Disk Cleanup (cleanmgr.exe). Чтобы воспользоваться утилитой cleanmgr сначала нужно установить отдельный компонент сервера Desktop Experience (Возможности рабочего стола) с помощью Server Manager или PowerShell ( Install-WindowsFeature Desktop-Experience ).
Но вместе с Desktop Experience устанавливается множество других компонентов, которые абсолютно не нужны на сервере:
- Windows Media Player
- Темы рабочего стола
- Поддержка AVI для Windows
- Windows SideShow
- Disk Cleanup
- Sync Center
- Запись звука
- Character Map
- Snipping Tool
Для запуска мастера очистки дисков в Windows Server можно воспользоваться более простым методом: достаточно скопировать в системный каталог два файла из каталога WinSxS: Cleanmgr.exe и Cleanmgr.exe.mui. Ниже представлены команды для копирования файлов cleanmgr из каталога WinSxS для разных версий Windows Server (во всех случаях используется путь для английских редакций ОC).
copy C:\Windows\winsxs\amd64_microsoft-windows-cleanmgr_31bf3856ad364e35_6.1.7600.16385_none_c9392808773cd7da\cleanmgr.exe C:\Windows\System32\
copy C:\Windows\winsxs\amd64_microsoft-windows-cleanmgr.resources_31bf3856ad364e35_6.1.7600.16385_en-us_b9cb6194b257cc63\cleanmgr.exe.mui C:\Windows\System32\en-US\
copy C:\Windows\winsxs\amd64_microsoft-windows-cleanmgr_31bf3856ad364e35_6.0.6001.18000_none_c962d1e515e94269\cleanmgr.exe C:\Windows\System32\
copy C:\Windows\winsxs\amd64_microsoft-windows-cleanmgr.resources_31bf3856ad364e35_6.0.6001.18000_en-us_b9f50b71510436f2\cleanmgr.exe.mui C:\Windows\System32\en-US\
copy C:\Windows\WinSxS\amd64_microsoft-windows-cleanmgr_31bf3856ad364e35_6.2.9200.16384_none_c60dddc5e750072a\cleanmgr.exe C:\Windows\System32\
copy C:\Windows\WinSxS\amd64_microsoft-windows-cleanmgr.resources_31bf3856ad364e35_6.2.9200.16384_en-us_b6a01752226afbb3\cleanmgr.exe.mui C:\Windows\System32\en-US\
Windows Server 2012 R2 x64
Рассмотренный выше трюк не работает в Windows Server 2012 R2 из-за изменений, внесенных обновлением KB2821895. Дело в том, что после установки данного обновления для хранения бинарных файлов компонентов стала использоваться компрессия. При попытке запустить скопированный cleanmgr.exe появляется ошибка:
В качестве обходного решения можно воспользоваться такой методикой:
-
Desktop Experience: Install-WindowsFeature Desktop-Experience
- Перезагрузить сервер;
- Скопировать файлы %windir%\system32\cleanmgr.exeи %windir%\system32\en-US\cleanmgr.exe.mui в произвольный каталог (c:\temp)
- Удалить компонент: Uninstall-WindowsFeature Desktop-Experience
- Перезагрузка;
- Скопировать файлы cleanmgr.exe и cleanmgr.exe.mui в указанные выше каталоги
В дальнейшем эти два файла можно скопировать и на все другие сервера или интегрировать в шаблоны виртуальных машин с Windows Server 2012 R2.
Ссылка на скачивание готового комплекта файлов cleanmgr.exe.mui + cleanmgr.exe для Windows Server 2012 R2 на ЯндексДиске (thks Alex Kornev).
Для запуска утилиты очистки диска теперь достаточно выполнять с правами администратора команду cleanmgr.exe .
Совет. Для очистки устаревших файлов компонентов, оставшихся после установки обновлений, в Windows Server R2 можно воспользоваться командой DISM:
dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase
В Windows Server 2008 R2, чтобы cleanmgr могла удалять устаревшие файлы обновлений нужно установить отдельный патч KB2852386.
Установка последних версий драйверов сетевых адаптеров
Попробуйте скачать и установить последние версии драйверов ваших сетевых адаптеров с сайта производителя.
Если у вас в Windows включено автоматическое обновление драйверов, убедитесь не начались ли проблемы после установки новых драйверов. Попробуйте откатить версию драйвера на более старую и проверить, воспроизводится ли проблема. Если проблема решилась, отключите авто обновление драйверов.
Отключение роли Hyper-V
В некоторых случаях утечку памяти в невыгружаемый пул вызывает установленная роль Hyper-V. Если эта роль не нужна, рекомендуем отключить ее.
Remove-WindowsFeature -Name Hyper-V
Команда для Windows 10:
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
Очистка диска с помощью Disk Cleanup в Windows Server 2016
Чтобы очистить системный диск от ненужных файлов в Windows Server 2016 с помощью утилиты Disk Cleanup, нужно в File Explorer открыть свойства диска и нажать кнопку Disk Cleanup.
Выберите диск, который вы хотите очистить.
Дождитесь пока мастер очистки проверит ваш диск и найдет ненужные файлы, которые можно безболезненно удалить.
Вы можете выбрать компоненты, файлы которых можно удалить. Вам предлагается удалить следующие временные файлы:
- Setup Log Files
- Downloaded Program Files
- Temporary Internet Files
Чтобы удалить ненужные системные файлы нажмите на кнопку Clean up system files.
Дополнительно предлагается очистить:
- Устаревшие файлы Windows Defender
- System archived Windows Error Reporting (каталог C:\ProgramData\Microsoft\Windows\WER\ReportQueue)
- System queued Windows Error Reporting
- Device driver packages
- Windows Update Cleanup — при этом выполняется очистка хранилища компонентов в каталоге WinSxS. Удаляются старые версии компонентов, которые остались после установки обновленных версий.
Выберите нужные опции, при этом Disk Cleanup покажет количество места, которое освободится. Нажмите Ок и подтвердите удаление временных файлов.
Дождитесь, пока утилита cleanmgr.exe удалит ненужные файлы.
Использование Disk Cleanup в Windows Server Core
В Windows Server Core 2016, в котором отсутствует полноценный графический интерфейс, утилита Disk Cleanup также не установлена. Если вы хотите использовать cleanmgr.exe для очистки диска в Server Core, достаточно скопировать следующие файлы из каталога WinSXS:
31.01.2022
itpro
Windows 10, Windows Server 2016, Windows Server 2019
комментариев 6
На компьютерах и серверах 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
Для очистки пула помогает только перезагрузка, и, если для домашнего компьютера это еще может быть приемлемо, то на круглосуточно работающем сервере желательно найти нормальное решение.
Поиск драйвера, вызвавшего утечку памяти с помощью 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
Достаточно часто причиной утечки памяти в невыгружаемый пул является несовместимость драйвера мониторинга сетевой активности (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.
После внесения изменений нужно перезагрузить компьютер
Очистка диска с помощью cleanmgr.exe из командной строки
Утилита cleanmgr.exe имеет различные параметры командной строки, которые позволяют использовать ее в различных сценариях автоматической очистки системного диска. Их можно использовать как в Windows Server, так и на рабочих станциях пользователей с Windows 10.
cleanmgr [/d driveletter] [/SAGESET:n | /SAGERUN:n | TUNEUP:n | /LOWDISK | /VERYLOWDISK | /SETUP | /AUTOCLEAN]
Ключ /AUTOCLEAN используется для очистки старых файлов, оставшихся после апгрейда билда Windows. Параметр /SETUP позволяет удалить файлы, оставшиеся от предыдущей версии Windows (если вы выполняли in-place upgrade).
Команда cleanmgr /LOWDISK – запускает графический интерфейс Disk Cleanup с уже выбранными параметрами очистки.
Команда cleanmgr /VERYLOWDISK выполняет автоматическую очистку, а после окончания оторажает информацией о выполненных действиях и свободном месте.
С помощью параметров /sageset:n и /sagerun:n вы можете создать и выполнить настроенный набор параметров очистки.
Например, выполните команду cleanmgr /sageset:11 . В открывшемся окне выберите компоненты и файлы, которые нужно автоматически очищать (я выбрал все опции).
Эти настройки сохраняются в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches. В этой ветке перечислены все компоненты Windows, которые можно очистить с помощью Disk Cleanup. Для каждой опции, которую вы выбрали создается параметр типа DWORD с именем StateFlags0011 ( 0011 это число, которое вы указали в параметре sageset).
Чтобы запустить процесс очистки с выбранными параметрами, выполните команду:
Если вам нужно настроить автоматическую очистку дисков на компьютерах (или серверах) в домене, вам достаточно экспортировать эту ветку реестра и распространить ее через GPO.
Для автоматического запуска очистки системного диска на рабочих станциях с Windows 10 можно создать задание в планировщике со следующим PowerShell скриптом:
Start-Process -FilePath CleanMgr.exe -ArgumentList '/sagerun:11' -WindowStyle Hidden -Wait
Читайте также: