2016-11-08 12 views
0

PowerCLIスクリプトを作成して、前月の関連情報と使用統計を取得し、csvを出力しましたが、それは非常に遅いです。誰もがレポートをスピードアップするのに役立つ改善を提案することはできますか?PowerCLI performance

私は任意のヘルプは感謝し、すべての最初の、まあ

$todayMidnight = (Get-Date -Hour 0 -Minute 0 -Second 0).AddMinutes(-1) 
$EndOfLastMonth = (Get-Date -Year (get-date).Year -Month (get-date).Month -Day 1 -Hour 0 -Minute 0 -Second 0).AddMinutes(-1) 
$FirstofLastMonth = $EndOfLastMonth.AddMonths(-1) 
$workingDays = "Monday","Tuesday","Wednesday","Thursday","Friday" 
$dayStart = New-Object DateTime(1,1,1,8,0,0) 
$dayEnd = New-Object DateTime(1,1,1,18,0,0) 

$CSVFile = Read-Host "Enter Filename for csv" 

$Report = @() 

Connect-VIServer "VCServer" | Out-Null 

$ServerList = Get-VM | Where-Object {$_.VMHost.Name -ne "192.168.106.161" -and $_.PowerState -eq "PoweredOn" } | Sort-Object Name 

$Counter = 1 

foreach ($Server in $ServerList) { 

    $VMInfo = {} | select Name, OS, VMHost, IPAddress, NumCPU, TotalMemMB, AvgMemPcnt, MaxMemPcnt, AvgCPUMhz, AvgCPUPcnt, MaxCPUPcnt 
    $VMInfo.name = $Server 

    $MaxCPUPcnt = get-vm $Server | Get-Stat -Stat cpu.usage.average -IntervalSecs 1 | 
     Where-Object { $workingDays -contains $_.Timestamp.DayOfWeek -and $_.Timestamp.TimeOfDay -gt $dayStart.TimeOfDay -and $_.Timestamp.TimeOfDay -lt $dayEnd.TimeOfDay} | 
     Measure-Object value -Max | select Maximum 

    $MaxMemPcnt = get-vm $Server | Get-Stat -Stat mem.usage.average -IntervalSecs 1 | 
    Where-Object { $workingDays -contains $_.Timestamp.DayOfWeek -and $_.Timestamp.TimeOfDay -gt $dayStart.TimeOfDay -and $_.Timestamp.TimeOfDay -lt $dayEnd.TimeOfDay} | 
    Measure-Object value -Max | select Maximum 

    $AvgCPUMhz = get-vm $Server | Get-Stat -Stat cpu.usagemhz.average -IntervalMins 5 | 
     Where-Object { $workingDays -contains $_.Timestamp.DayOfWeek -and $_.Timestamp.TimeOfDay -gt $dayStart.TimeOfDay -and $_.Timestamp.TimeOfDay -lt $dayEnd.TimeOfDay} | 
     Measure-Object value -Average | select Average 

    $AvgCPUPcnt = get-vm $Server | Get-Stat -Stat cpu.usage.average -IntervalMins 5 | 
     Where-Object { $workingDays -contains $_.Timestamp.DayOfWeek -and $_.Timestamp.TimeOfDay -gt $dayStart.TimeOfDay -and $_.Timestamp.TimeOfDay -lt $dayEnd.TimeOfDay} | 
     Measure-Object value -Average | select Average 

    $AvgMemPcnt = get-vm $Server | Get-Stat -Stat mem.usage.average -IntervalMins 5 | 
     Where-Object { $workingDays -contains $_.Timestamp.DayOfWeek -and $_.Timestamp.TimeOfDay -gt $dayStart.TimeOfDay -and $_.Timestamp.TimeOfDay -lt $dayEnd.TimeOfDay} | 
     Measure-Object value -Average | select Average 

    $VMinfo.MaxCPUPcnt = [math]::round($MaxCPUPcnt.Maximum,2) 
    $VMinfo.MaxMemPcnt = [math]::round($MaxMemPcnt.Maximum,2) 
    $VMinfo.AvgCPUMhz = [math]::round($AvgCPUMhz.Average,2) 
    $VMInfo.AvgCPUPcnt = [math]::round($AvgCPUPcnt.Average,2) 
    $VMInfo.AvgMemPcnt = [math]::round($AvgMemPcnt.Average,2) 

    $TotalMemMB = get-vm $Server | select MemoryMB 
    $VMInfo.TotalMemMB = $TotalMemMB.MemoryMb 

    $VMInfo.VMHost = (get-vm gbvc0007 | Get-VMHost).name 

    $VMInfo.OS = (Get-VM $Server | Get-View).summary.config.GuestFullName 

    $VMInfo.IPAddress = (Get-VM $Server | Get-VIew).summary.guest.ipaddress 

    $VMInfo.NumCPU = (Get-VM $Server | Get-VIew).summary.config.NumCPU 

    $Report += $VMInfo 

    $Counter++ 
} 

clear 
$Report | ft -AutoSize 

$Report | Export-Csv -Path $CSVFile 

Disconnect-VIServer -Server * -Confirm:$false 

答えて

0

を受信されるだろう、あなたがしたいと思うのPowerShell/PowerCLIのにかなり新しいです:

$ VM = GET- vm $ Server

これ以降の操作では、各操作に対して1つの余分な時間をクエリする必要はありません。また、get-statがどのように機能するのか分かりませんが、VMに必要なすべての統計情報をサーバへの呼び出しで変数に取り込むことができれば、後で必要なものをすべて簡単にフィルタリングして保存することができます多くの時間潜在的に、このような何か:

$vm = get-vm $Server 
$vm | Get-Stat -Stat mem.usage.average,cpu.usage.average,cpu.usagemhz.average 

そして、あなたは簡単にあなたがすでに持っているように、変数のうちの何かを得ることができます:
$ vm.MemoryMBまたはおそらく$ vm.GuestID

のようなものここをクリックしてください - http://www.virtualizationadmin.com/articles-tutorials/general-virtualization-articles/use-powercli-quick-stats-part2.html

一般的なアプローチ私はあなたのforeachループの実行を並列化するためにPoshRSJobのようなものを使用することをお勧めします。それはあなたのスクリプトが劇的に実行されるのにかかる時間を改善します。唯一の注意点は、各RSJobで認証する必要があるということです問題。

+0

助けてくれれば助けとしてマークしてください。 – 4c74356b41

0

ご返信いただきありがとうございます。それはまさに正しい方向に私を指摘した。

私はこれを行って変数を設定しました。

$VM = Get-VM $Server 

$AvgStats = $VM | Get-Stat -Stat mem.usage.average,cpu.usage.average,cpu.usagemhz.average -IntervalMins 5 | 
    Where-Object { $workingDays -contains $_.Timestamp.DayOfWeek -and $_.Timestamp.TimeOfDay -gt $dayStart.TimeOfDay -and $_.Timestamp.TimeOfDay -lt $dayEnd.TimeOfDay} 

$AvgMemPcnt = $AvgStats | Where-Object {$_.metricid -eq "mem.usage.average"} | Measure-Object value -Average | select Average 

そして、変数を各メトリックの実際の回答で埋める行が繰り返されます。