I have a script which does its job perfectly fine, however I do want to convert the same to multi threaded since I need the job to execute every 5 minutes.
Below is the set of functions that I execute on each of the server.
$ServiceDetailsDataset=get-ServiceDetails -serverList $server
Write-Verbose "service details collected"
$ReadBytes=$($ServiceDetailsDataset.ReadBytes)
$instances=$($ServiceDetailsDataset.Instances)
$CPU=$($ServiceDetailsDataset.CPU)
$dataSet=get-IODetails -ServiceDetails $($ServiceDetailsDataset.ServiceDetails) -computerName $server -Instances $Instances -ReadBytes $ReadBytes -WriteBytes $($ServiceDetailsDataset.WriteBytes) -OtherBytes $($ServiceDetailsDataset.OtherBytes) -CPU $($ServiceDetailsDataset.CPU) -NumberOfLogicalProcessors $($ServiceDetailsDataset.NumberOfLogicalProcessors)
Write-Verbose "Post IOI Details"
$dataset|Out-GridView
Write-Verbose "Inserting Data";
Generate-InsertScript -aggrDataSet $dataset
Write-Verbose "Data Insertion completed";
And to make this multi threaded I have modified the script to the below state.
Start-Job -ScriptBlock {
if(check-IfSystemIsUp -server $server){
$ServiceDetailsDataset=get-ServiceDetails -serverList $server
Write-Verbose "service details collected"
$ReadBytes=$($ServiceDetailsDataset.ReadBytes)
$instances=$($ServiceDetailsDataset.Instances)
$CPU=$($ServiceDetailsDataset.CPU)
$dataSet=get-IODetails -ServiceDetails $($ServiceDetailsDataset.ServiceDetails) -computerName $server -Instances $Instances -ReadBytes $ReadBytes -WriteBytes $($ServiceDetailsDataset.WriteBytes) -OtherBytes $($ServiceDetailsDataset.OtherBytes) -CPU $($ServiceDetailsDataset.CPU) -NumberOfLogicalProcessors $($ServiceDetailsDataset.NumberOfLogicalProcessors)
Write-Verbose "Post IOI Details"
$dataset|Out-GridView
Write-Verbose "Inserting Data";
Generate-InsertScript -aggrDataSet $dataset
Write-Verbose "Data Insertion completed";
}
} -Name $server
While running the receive-job to get the job status, I do receive the below error.
How do I make it multi threaded without making changes to my function and by just adding the start-job cmdlet
Updated Question
Now this script has been modified as below.
foreach ($server in $serverList){
Write-Verbose "*****Collecting Service Details*********"
Start-Job -InitializationScript $functions -ArgumentList $server -ScriptBlock {
if(check-IfSystemIsUp -server $args[0]){
$ServiceDetailsDataset=get-ServiceDetails -serverList $args[0]
Write-Verbose "service details collected"
$ReadBytes=$($ServiceDetailsDataset.ReadBytes)
$instances=$($ServiceDetailsDataset.Instances)
$CPU=$($ServiceDetailsDataset.CPU)
$dataSet=get-IODetails -ServiceDetails $($ServiceDetailsDataset.ServiceDetails) -computerName $args[0] -Instances $Instances -ReadBytes $ReadBytes -WriteBytes $($ServiceDetailsDataset.WriteBytes) -OtherBytes $($ServiceDetailsDataset.OtherBytes) -CPU $($ServiceDetailsDataset.CPU) -NumberOfLogicalProcessors $($ServiceDetailsDataset.NumberOfLogicalProcessors)
Write-Verbose "Post IOI Details"
#$dataset|Out-GridView
Write-Verbose "Inserting Data";
Generate-InsertScript -aggrDataSet $dataset
Write-Verbose "Data Insertion completed";
}
}
This works absolutely fine when I execute on two servers. But I do have 55 servers this script needs to be executed on and I am running this job as a SQL Job. The problem is its executing only for 40 odd servers. Is there some kind of throttling issue?