Слишком много недействительных дескрипторов в системном процессе
Я испытал увеличение недопустимых дескрипторов в системном процессе (Windows Server 2008R2 x64). Сумма составляет около 1 000 000 в неделю.
Согласно Process Explorer тип дескриптора является файловым. Из диспетчера задач кажется, что память не назначена ни одному из процессов, но график показывает высокое (и растущее) использование физической памяти.
Как избежать или освободить недействительные системные дескрипторы?
2 ответа
Я не смог найти причину, но я выяснил, как ее устранить.
Когда я скопировал один из файлов для анализа, я обнаружил, что неверный дескриптор был "повторно использован" или "обновлен" и правильно закрыт. Кажется, что операции над файлом, такие как открытие, копирование, удаление исправить дескриптор. Поэтому я создал скрипт powershell, который сначала получает список дескрипторов с помощью util Handle v3.51 и открывает затронутые файлы. После первого запуска количество дескрипторов уменьшилось, потребление физической памяти также начало уменьшаться, и после нескольких запусков все выглядит нормально. Уборка запланирована на ночь.
$handlesLog = .\handle.exe -p 4 # 4 is System process id
foreach ($line in $handlesLog)
{
if ($line -match "<here is the pattern of affected files>")
{
$fileToCopy = <full path to the file>
if ([System.IO.File]::Exists($fileToCopy))
{
try
{
$fileStr = New-Object System.IO.FileStream($fileToCopy,[System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)
}
finally
{
$fileStr.Close()
$fileStr.Dispose()
}
}
}
}
Включены ли у вас автономные файлы? Вы можете отключить их в Панели управления> Центр синхронизации> Отключить автономные файлы (слева). Возможно, сервер пытается загрузить автономную копию файлов, поэтому он не закрывает дескрипторы должным образом. Просто выстрел в темноте.