Event ID 2004 Resource-Exhaustion-Detector: нехватка виртуальной памяти
Симптомы нехватки виртуальной памяти
В журнале System фиксируется критическое предупреждение Event ID 2004: Windows successfully diagnosed a low virtual memory condition. Система указывает список процессов, потребивших наибольший объем виртуальной и физической памяти (Commit Charge).
| Симптом | Проявление на сервере |
|---|---|
| Зависание приложений | Программы аварийно закрываются с ошибкой Out of Memory |
| Отказ создания новых процессов | Ошибка «Недостаточно памяти для обработки команды» |
| Черный экран при входе по RDP | Служба explorer.exe не может инициализировать рабочий стол |
Пошаговое решение проблемы с памятью (Event ID 2004)
- Определите процесс с утечкой памяти: откройте текст события 2004 в Event Viewer. В описании будут перечислены 3 главных процесса с указанием выделенной памяти в байтах. Также выполните анализ через PowerShell:
# Топ-10 процессов по потреблению виртуальной и рабочей памяти:
Get-Process | Sort-Object -Property PrivateMemorySize -Descending | Select-Object -First 10 -Property Id, ProcessName, @{Name="RAM (MB)";Expression={[math]::round($_.WorkingSet/1MB,2)}}, @{Name="Commit (MB)";Expression={[math]::round($_.PrivateMemorySize/1MB,2)}} | Format-Table -AutoSize- Настройте фиксированный размер файла подкачки (pagefile.sys): динамический файл подкачки может не успевать расширяться при резких нагрузках. Задайте фиксированный размер:
# Настройка фиксированного размера файла подкачки (например, 16 ГБ на диске C:):
$ComputerSystem = Get-WmiObject -Class Win32_ComputerSystem
$ComputerSystem.AutomaticManagedPagefile = $False
$ComputerSystem.Put()
$PageFileSetting = Get-WmiObject -Class Win32_PageFileSetting
if ($PageFileSetting) { $PageFileSetting.Delete() }
Set-CimInstance -Query "Select * from Win32_PageFileSetting" -Property @{InitialSize = 16384; MaximumSize = 16384}
# Либо через wmic:
wmic pagefilesetting create name="C:\pagefile.sys",initialsize=16384,maximumsize=16384- Проверьте утечку невыгружаемого пула (Non-Paged Pool): если память занята драйвером, проверьте размер пулов ядра:
# Просмотр размера пулов памяти ядра:
Get-CimInstance Win32_OperatingSystem | Select-Object @{N="NonPagedPool_MB";E={[math]::round($_.MaxProcessMemorySize/1024,2)}}, FreePhysicalMemory, TotalVisibleMemorySizeРекомендация: Если утечку создает sqlservr.exe, ограничьте максимальный объем памяти SQL Server через SSMS (Server Properties > Memory > Maximum server memory), чтобы оставить не менее 4–8 ГБ для самой ОС Windows.
Частые вопросы (FAQ)
Чем отличается физическая память от виртуальной (Commit Limit)?
Физическая память — это установленные планки RAM. Виртуальная память (Commit) — это сумма RAM и файла подкачки. Ошибка 2004 возникает, когда исчерпан именно лимит выделения Commit Limit.
Можно ли полностью отключить файл подкачки, если на сервере 64 ГБ RAM?
Нет. Windows требует наличия файла подкачки для создания аварийных дампов памяти и для выгрузки неиспользуемых страниц памяти программ. Отключение файла подкачки провоцирует Event ID 2004.
Как найти скрытую утечку памяти в пуле драйверов ядра?
Используйте стандартную системную утилиту Poolmon из комплекта Windows Driver Kit (WDK) и отсортируйте теги по параметру 'Bytes'.
Какой оптимальный размер файла подкачки для Windows Server?
Обычно устанавливают фиксированный размер: от 1x до 1.5x объема RAM при объеме до 16 ГБ, и фиксированные 16–32 ГБ при больших объемах памяти.