У меня возникла странная проблема с перегрузкой нашего сервера сценариев и нехваткой ресурсов. У нас есть сценарий, который копирует данные из одного места в другое, это определено в большом входном файле, который содержит более 200 строк текста в формате «Исходный путь, путь назначения».
Сейчас мы пытаемся ограничить максимальное количество заданий, которые мы запускаем одновременно, и я думаю, что это работает нормально. Но по той или иной причине у нас все еще не хватает ресурсов на сервере, когда входной файл содержит более 94 строк. Это стало очевидно после некоторых испытаний.
Мы попытались обновить наш сервер Windows 2008 R2 с PowerShell 4.0 до 4 процессоров и 8 ГБ оперативной памяти, но безуспешно. Поэтому я предполагаю, что мой дроссель не работает так, как задумано.
Код ошибки:
Insufficient system resources exist to complete the requested service.
Код:
$MaxThreads = 4
$FunctionFeed = Import-Csv -Path $File -Delimiter ',' -Header 'Source', 'Destination'
$Jobs=@()
Function Wait-MaxRunningJobs {
Param (
$Name,
[Int]$MaxThreads
)
Process {
$Running = @($Name | where State -eq Running)
while ($Running.Count -ge $MaxThreads) {
$Finished = Wait-Job -Job $Name -Any
$Running = @($Name | where State -eq Running)
}
}
}
$ScriptBlock = {
Try {
Robocopy.exe $Using:Line.Source $Using:Line.Destination $Using:Line.File /MIR /Z /R:3 /W:15 /NP /MT:8 | Out-File $Using:LogFile
[PSCustomObject]@{
Source = if ($Using:Line.Source) {$Using:Line.Source} else {'NA'}
Target = if ($Using:Line.Destination) {$Using:Line.Destination} else {'NA'}
}
}
Catch {
"Robocopy | ERROR: $($Error[0].Exception.Message)" |
Out-File -LiteralPath $Using:LogFile
throw $($Error[0].Exception.Message)
}
}
ForEach ($Line in $FunctionFeed) {
$LogParams = @{
LogFolder = $LogFolder
Name = $Line.Destination + '.log'
Date = 'ScriptStartTime'
Unique = $True
}
$LogFile = New-LogFileNameHC @LogParams
' ' >> $LogFile # Avoid not being able to write to log
$Jobs += Start-Job -Name RoboCopy -ScriptBlock $ScriptBlock
Wait-MaxRunningJobs -Name $Jobs -MaxThreads $MaxThreads
}
if ($Jobs) {
Wait-Job -Job $Jobs
$JobResults = $Jobs | Receive-Job
}
Я что-то упустил здесь? Спасибо за помощь.