Анализ утечек памяти ядра утилитой Poolmon: теги выгружаемого и невыгружаемого пула
Симптомы утечки памяти ядра (Pool Memory Leak)
На сервере постепенно заканчивается свободная оперативная память при относительно небольшой нагрузке со стороны пользовательских приложений. В системном журнале появляются ошибки: Event ID 2019: The server was unable to allocate from the system nonpaged pool because the pool was empty или Event ID 2020: ...paged pool was empty. Значение Невыгружаемый пул (Non-paged pool) в диспетчере задач достигает нескольких десятков гигабайт.
| Симптом | Где отображается | Причина |
|---|---|---|
| Event ID 2019 / 2020 | System Log | Полное исчерпание пула памяти ядра (Paged / Non-Paged Pool) |
| Невыгружаемый пул занимает > 80% RAM | Диспетчер задач / Память | Драйвер выделяет системную память через ExAllocatePoolWithTag и не освобождает ее |
| Сервер перестает открывать новые сокеты | Сетевые службы | Утечка сетевых буферов Wsk / Netio |
Пошаговый поиск тега утечки с помощью Poolmon
- Запустите утилиту Poolmon из состава Windows Driver Kit (WDK):
poolmon -p -bПараметр
-pфильтрует по типу пула,-bсортирует по объему потребляемой памяти (столбецBytes). - Определите тег пула (Pool Tag) с максимальным объемом памяти и числом не освобожденных аллокаций: обратите внимание на 4-буквенный тег в первом столбце
Tag(например,Cont,WfpC,smbD). - Найдите драйвер, использующий данный тег памяти: найдите совпадение тега в системных бинарных файлах Windows:
findstr /m /l "ИМЯ_ТЕГА" C:\Windows\System32\drivers\*.sys - Проверьте расшифровку тега в системном файле пула: откройте файл
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txtи найдите описание виновного компонента.
Справка: Память невыгружаемого пула (Non-Paged Pool) никогда не сбрасывается в файл подкачки и обязана постоянно находиться в физической оперативной памяти.
Частые вопросы (FAQ)
Что такое тег пула памяти (Pool Tag)?
Это 4-символьный идентификатор, который разработчики драйверов обязаны указывать при вызове функции выделения системной памяти ядра ExAllocatePoolWithTag.
Как с помощью PowerShell посмотреть размер пулов памяти?
Используйте Get-CimInstance Win32_OperatingSystem | Select-Object TotalVisibleMemorySize, FreePhysicalMemory, @{N='NonPagedPool_MB';E={(Get-Counter '\Memory\Pool Nonpaged Bytes').CounterSamples.CookedValue / 1MB}}.
Какие теги чаще всего вызывают утечки?
Частые виновники: сетевые фильтры фаерволов и антивирусов (WfpN, NetIO), драйверы файловых минифильтров (FMfl, FLtM) и драйверы виртуализации.
Где скачать утилиту poolmon.exe?
Утилита poolmon.exe входит в состав официального комплекта Windows Driver Kit (WDK) или Windows SDK от Microsoft.