2016-11-08 23 views
0

我已经写了一个PowerCLI脚本来检索相关信息以及上个月我们虚拟机的使用统计信息,并将其输出为csv,但速度很慢。任何人都可以提出任何可以帮助加快报告速度的改进措施。PowerCLI性能

我是相当新的PowerShell的/ PowerCLI的所以任何帮助将受到欢迎

$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

嗯,首先,你会想做的事:

$ VM = GET- vm $服务器

并且随后使用它,因此您不需要为每个操作多花一分钟时间查询服务器。另外,我并不知道get-stat是如何工作的,但是如果您只需一次调用服务器就可以将虚拟机所需的所有统计信息提供给变量,那么您可以稍后轻松过滤出所需的所有内容,从而节省大量的时间有可能,这样的事情:

$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

至于一般方法,我建议你使用像PoshRSJob这样的东西来平行执行你的foreach循环,这将改善你的脚本剧烈运行所花费的时间,唯一需要注意的是你需要在每个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 

然后重复用每个度量的实际答案填充变量的行。