首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerCLI性能

PowerCLI性能
EN

Stack Overflow用户
提问于 2016-11-08 12:53:28
回答 2查看 692关注 0票数 0

我已经编写了一个PowerCLI脚本来检索相关信息,并为我们的VM提供前一个月的使用统计数据,并输出一个csv,但速度慢得令人痛苦。有谁能提出有助于加快报告速度的改进措施吗?

我对powershell/PowerCLI相当陌生,所以我们会感激地接受任何帮助

代码语言:javascript
复制
$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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-08 13:10:27

首先,你要做的是:

$vm =get $Server

然后再使用,这样您就不需要为每个操作多查询服务器一次了。另外,我不知道get-stat是如何工作的,但是如果您可以在一个对服务器的调用中将VM所需的所有状态提取到一个变量中,那么您以后就可以轻松地过滤掉所需的一切,从而节省大量的时间,如下所示:

代码语言:javascript
复制
$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
EN

Stack Overflow用户

发布于 2016-11-08 13:28:57

非常感谢您的答复和如此迅速的答复。它给我指明了正确的方向。

我已经填充了一个变量,然后通过这样做来从中选择。

代码语言:javascript
复制
$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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40487486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档