Examine VMware CPU Ready Times with Powershell

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

10 thoughts on “Examine VMware CPU Ready Times with Powershell

  1. Thanks — I was looking at trying to write something like this myself – Now I get the credit without the work 🙂

    • 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))


  2. Id like to see an extra column of CPU ready time in Milliseconds. AND to be able to run this over a month or year instead of using the realtime.

    • Answered one part myself Added

      $Time = $VM | Get-Stat -Stat Cpu.Ready.Summation -RealTime


      $myObj = “” | Select VMHost, VM, Instance, %RDY, %USED, %WAIT, %TIME


      $myObj.”%TIME” = [Math]::Round((($Time | Where {$_.Instance -eq $a} | Measure-Object -Property Value -Average).Average))

      to get time in milliseconds.

      Just need to figure out how i can do this over the past month

Leave a Reply