When your (VMware) consolidation ratios are becoming high, it might be smart to keep an eye on your vm’s CPU Ready Times. Unfortunately, by default, the VI Client will only show realtime ready time statistics. Plus you’d have to look at each vm individually. Thank God VMware for the PowerCLI! Read this document for more information on how to interpret the results.
# Variables $OutFile = "D:\Scripts\ReadyTimes.csv" $VIServer = "MyVIServer.domain.local" # Connect to Virtual Center $VI = Connect-VIServer $VIServer $myCol = @() ForEach ($VMHost in (Get-VMHost | Sort Name)) { ForEach ($VM in ($VMHost | Get-VM | Sort Name)) { # Gather Stats $Ready = $VM | Get-Stat -Stat Cpu.Ready.Summation -RealTime $Used = $VM | Get-Stat -Stat Cpu.Used.Summation -RealTime $Wait = $VM | Get-Stat -Stat Cpu.Wait.Summation -RealTime For ($a = 0; $a -lt $VM.NumCpu; $a++) { $myObj = "" | Select VMHost, VM, Instance, %RDY, %USED, %WAIT $myObj.VMHost = $VMHost.Name $myObj.VM = $VM.Name $myObj.Instance = $a $myObj."%RDY" = [Math]::Round((($Ready | Where {$_.Instance -eq $a} | Measure-Object -Property Value -Average).Average)/200,1) $myObj."%USED" = [Math]::Round((($Used | Where {$_.Instance -eq $a} | Measure-Object -Property Value -Average).Average)/200,1) $myObj."%WAIT" = [Math]::Round((($Wait | Where {$_.Instance -eq $a} | Measure-Object -Property Value -Average).Average)/200,1) $myCol += $myObj } Clear-Variable Ready -ErrorAction SilentlyContinue Clear-Variable Wait -ErrorAction SilentlyContinue Clear-Variable Used -ErrorAction SilentlyContinue Clear-Variable myObj -ErrorAction SilentlyContinue } } Disconnect-VIServer -Confirm:$false # Export and launch output $myCol | Export-Csv $OutFile Invoke-Item $OutFile
No related posts.

javellan
June 12th, 2009
thx! this is really powerful and useful for my environment!
-ja
Steve
April 13th, 2010
Thanks — I was looking at trying to write something like this myself – Now I get the credit without the work :-)
Sven
April 14th, 2010
would be nice if the script would exclude powerd off vm’s
-Sven
admin
April 14th, 2010
That’s rather easy. Simply replace this line:
ForEach ($VM in ($VMHost | Get-VM | Sort Name))
With this:
ForEach ($VM in ($VMHost | Get-VM | Where {$_.PowerState -ne “PoweredOff”} | Sort Name))
Hugo