2014-06-08 2 views
0

현재 CPU & RAM (평균 5 개 샘플) 및 디스크 사용량에 대해 여러 Hyper-V 호스트를 쿼리하려고합니다. 나는 모든 쿼리를 병렬로 처리하기를 원하며, 결과적으로 VM을 생성하기위한 리소스가 가장 많은 호스트를 선택하려고한다.카운터 정보에 대해 여러 서버 쿼리 - PowerShell, 워크 플로

각 카운터가 순차적으로 검사되기 때문에 Get-Counter를 사용할 수 없지만 작업을 시도했지만 중첩 된 작업이 제대로 작동하지 않습니다. 그래서 마침내 워크 플로우를 시도하고 있는데, 문제는 의미있는 방식으로 정보를 저장하는 방법을 알 수 없다는 것입니다. 내가 해시 테이블에 해시 테이블을 사용하려고하지만 워크 플로에 유효하지 않은, 내가 사용하는 것은 :이 작업을 수행하는 더 나은 방법이있을 수 있음을

$HostResources["$Server"] = @{ "CPU"=$CPU; "RAM"=$RAM; "Disk"=$Disk } 

가 나는 또한 느낌을 얻을 포함 Hyper-V 미터링을 사용할 수는 있지만 VM에서만 호스트에 대한 정보를 제공하지는 않습니다. 그래서 더 좋은 방법이 있다고 생각한다면, 올바른 방향으로 나를 가리키면 연구하러 갈 것입니다.

Workflow Get-Resources { 

$Servers = @('host00', 'host01', 'host02', 'host03') 
# $HostResources = @{} 

ForEach -Parallel ($Server in $Servers) { 
    InlineScript { (Get-Counter -Counter "\Processor(_Total)\% Processor Time" -ComputerName $using:Server -SampleInterval 1 -MaxSamples 5).CounterSamples.CookedValue | Measure-Object -Average | Select-Object -ExpandProperty Average } 
    InlineScript { (Get-Counter -Counter "\Memory\Available MBytes" -ComputerName $using:Server -SampleInterval 1 -MaxSamples 5).CounterSamples.CookedValue | Measure-Object -Average | Select-Object -ExpandProperty Average } 
    InlineScript { (Get-Counter -Counter "\LogicalDisk(_Total)\% Free Space" -ComputerName $using:Server).CounterSamples.CookedValue } 
    } 
} 

$Result = Get-Resources 
+0

왜 모든 쿼리를 병렬로 수행 하시겠습니까? 그게 당신에게주는 이점은 무엇입니까? – alroc

+0

현재 세 개의 카운터 만 검사 중입니다. 네트워크 대역폭, 디스크 iops, 대기열 길이 등을 추가 할 것입니다. 이는 호스트 당 시간이 더 많이 걸리고, 그 중 호스트 목록이 위에 표시된 것보다 훨씬 높습니다. 코드. 배포 시간을 줄이기 위해 가능한 빨리 스크립트를 작성하고 싶습니다. 모든 것이 순차적이면 모든 호스트를 확인하는 데 10 분 정도 걸릴 수 있습니다. – Aftab

답변

0

것은, 당신이 $HostResources에서 마지막에 결과를 얻을 것이다 Start-Job를 사용하여이 구현을 시도하고 쉽게 (평균 카운터의) $counters 또는 $countersAV에 더 카운터를 추가 할 수 있습니다

$Servers = @('host00', 'host01', 'host02', 'host03') 
    foreach($server in $servers){ 
     start-job -Name $server -ScriptBlock {param($server) 
      $countersAV = @("\Processor(_Total)\% Processor Time","\Memory\Available MBytes") 
      $counters = @("\LogicalDisk(_Total)\% Free Space") 
      foreach($counterAV in $countersAV){ 
       echo ($server + $counterAV + ":" + ((Get-Counter -Counter $counterAV -ComputerName $server -SampleInterval 1 -MaxSamples 5).CounterSamples.CookedValue | Measure-Object -Average | Select-Object -ExpandProperty Average)) 
      } 
      foreach($counter in $counters){ 
       echo ($server + $counter + ":" + ((Get-Counter -Counter $counter -ComputerName $Server).CounterSamples.CookedValue)) 
      } 
     } -ArgumentList $server 
    } 
$HostResources = (Get-Job | Wait-Job | Receive-Job) 
Get-Job | Remove-Job #clean up 

결과 :

host00\Processor(_Total)\% Processor Time:0.800450654666718 
host00\Memory\Available MBytes:5772 
host00\LogicalDisk(_Total)\% Free Space:51.8221343719115 
host01\Processor(_Total)\% Processor Time:0.386754157141649 
host01\Memory\Available MBytes:2717 
host01\LogicalDisk(_Total)\% Free Space:67.5283240005209 
... 
+1

외부 'foreach' 루프 대신'invoke-command -throttlelimit X -computername $ Servers'를 사용하여 한 번에 최대'X'개의 서버에서 스크립트 블록을 병렬로 실행할 수도 있습니다. – alroc