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


Tagged with:

10 Responses to Examine VMware CPU Ready Times with Powershell

  1. javellan says:

    thx! this is really powerful and useful for my environment!

  2. [...] (By the way, here is a nice Powershell script that will grab CPU Ready stats for all of your VMs!) [...]

  3. Steve says:

    Thanks — I was looking at trying to write something like this myself – Now I get the credit without the work :-)

  4. Sven says:

    would be nice if the script would exclude powerd off vm’s


    • admin says:

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


  5. Mike says:

    Nice script, but when running in a 1500 VM enviroment it takes a long time for the script to finish.

  6. Получение значений CPU Ready через PowerCLI | Виталий Волнянский - Персональный блог says:

    [...] времени, чтобы написать эту статью Источник <http://www.peetersonline.nl/index.php/vmware/examine-vmware-cpu-ready-times-with-powershell/&gt; wpa2a.script_load(); Categories: vmware, Виртуализация Tags: CPU Ready, PowerCLI, [...]

  7. [...] Examine VMware CPU Ready Times with Powershell Categories: Uncategorized Tags: Comments (0) Trackbacks (0) Leave a comment Trackback [...]

  8. Chris McEwan says:

    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.

    • Chris McEwan says:

      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