Quantcast
Channel: PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources
Viewing all articles
Browse latest Browse all 6937

Runspaces using too much memory and not releasing (over 2.5GB)

$
0
0

Need help figuring this out please. 

Running WMI Scriptblock against 800+ workstations.

 

Using a file to invoke Runspaces (found it on line and made some mods to it)

 

##### Invoke-Runspaces.ps1 ##################

Param (
	[parameter(Mandatory=$true)]$ScriptBlock = $null,
	[parameter(Mandatory=$true)]$Computers = $Null,
	[parameter(Mandatory=$true)]$Throttle = 10
)
# Initialize Runsapce Pool
$RunspacePool = [RunspaceFactory]::CreateRunspacePool(20, $Throttle)
$RunspacePool.Open()
$Jobs = @()

# Initiate Runspaces Jobs
ForEach ($Computer in $Computers) {	
#Sleep -Seconds (Get-Random -Minimum 2 -Maximum 10)
   $Job = [powershell]::Create().AddScript($ScriptBlock).AddArgument($Computer)
   $Job.RunspacePool = $RunspacePool
   $Jobs += New-Object PSObject -Property @{  Result = $Job.BeginInvoke() }
}

# Wait Untill ALl Runspace jobs complete
Do {
   Write-Host "." -NoNewline
   Start-Sleep -Seconds 1   
} While ( $Jobs.Result.IsCompleted -contains $false)
   Write-Host "`r"	

# Cleanup
$Jobs = $Null; 
$RunspacePool.Close()
$RunspacePool.Dispose()
Remove-Variable -Name jobs
Remove-Variable -Name RunspacePool		

[gc]::Collect()

Return $Computers

 

####### ScriptBlock #####################

$ScriptBlock_PowerOptions = {
	Param ($Computer)
	$powerplan=get-wmiobject -namespace "root\cimv2\power" `
		-class Win32_powerplan `
		-filter "IsActive = 'True'" `
		-CN $computer.DNSHostName
	$powerSettings = $powerplan.GetRelated("win32_powersettingdataindex") `
	| foreach {
		$powersettingindex = $_;    
		$powersettingindex.GetRelated("Win32_powersetting") `
		|	select @{Label="Power Setting";Expression={$_.instanceid}},
				   @{Label="AC/DC";Expression={$powersettingindex.instanceid.split("\")[2]}},
				   @{Label="Summary";Expression={$_.ElementName}},
				   @{Label="Description";Expression={$_.description}},
				   @{Label="Value";Expression={$powersettingindex.settingindexvalue}}
    }
	$Computer | Add-Member -MemberType NoteProperty -Name PowerPlan -Value $null -Force
	$Computer | Add-Member -MemberType NoteProperty -Name Sleep -Value $null -Force
	$Computer | Add-Member -MemberType NoteProperty -Name AllowHybridSleep -Value $null -Force
	$Computer | Add-Member -MemberType NoteProperty -Name HibernateAfter -Value $null -Force
	$Computer | Add-Member -MemberType NoteProperty -Name HardDiskSleep -Value $null -Force
	$Computer.PowerPlan = $PowerPlan.ElementName
	$Computer.Sleep = `
	$powerSettings | ? {$_."AC/DC" -like "AC" -and $_.Summary -like "sleep after"} | % {$_.Value}
	$Computer.AllowHybridSleep = `
	$powerSettings | ? {$_."AC/DC" -like "AC" -and $_.Summary -like "*hybrid*"} | % {$_.Value | Select -First 1}
	$Computer.HibernateAfter = `
	$powerSettings | ? {$_."AC/DC" -like "AC" -and $_.Summary -like "Hibernate*"} | % {$_.Value}
	$Computer.HardDiskSleep = `
	$powerSettings | ? {$_."AC/DC" -like "AC" -and $_.Summary -like "Turn*Hard*"} | % {$_.Value}
	$PowerPlan = $Null; Remove-Variable PowerPlan
	$PowerSettings = $null; Remove-Variable PowerSettings
	$PowerSettingIndex = $Null; Remove-Variable PowerSettingIndex
	[GC]::Collect()
	Return $Computer
}
# Calling Runspaces
$Computers = .\invoke-runspaces.ps1 `
-scriptblock $ScriptBlock_PowerOptions `
-computers $computers -throttle 500

 

From lots of testing, I have confirmed that the problem resides within the ScriptBlock. However, it is entirely possible that the Invoke-Runspaces script is not killing the environment after use...

Really need some help with this. Thank you!


Viewing all articles
Browse latest Browse all 6937

Trending Articles