Find your VM with Top IOPS

Find your VM with Top IOPS

How do you indentify VMs that generates the most IOPS? With the vSphere Client?

No, we do it in PowerCLI 😉

I found a very good script from LucD and created a function around.

function Get-VMMaxIO
{
  <#
      .SYNOPSIS
      Get your VMs with max. IOPS 
      .DESCRIPTION
      Get your VMs with max. IOPS (read & write Avg.)
      You could work with the parameters vHost,Cluster or DataCenter to determine the ESXi Hosts. (default = all Hosts)
      With the parameter minutes, you could change the period of time (default = 1)
      With the parameter top, you could change the number of VMs listed  (default = 10)
      .EXAMPLE
      Get-VMMaxIO

      Get-VMMaxIO -vHost myHost01
      Get-VMMaxIO -Cluster myClusterA
      Get-VMMaxIO -DataCenter myDataCenterA

      Get-VMMaxIO -vHost * -minutes 10 -top 15

      .Sample Output
      PS C:\Users\myUser> Get-VMMaxIO -Cluster * -minutes 1 -top 5

      VM   Datastore         IOPSMax
      --   ---------         -------
      myVM01 MyDataStore01   18,75
      myVM02 MyDataStore02    6,85
      myVM03 MyDataStore01     5,8
      myVM09 MyDataStore04     3,4
      myVM15 MyDataStore04     3,2
      
  #>
  [CmdletBinding()]
  param
  (
   
    [Parameter(Mandatory=$false, Position=0)]
    [System.String]
    $vHost = "",
    
    [Parameter(Mandatory=$false, Position=1)]
    [System.String]
    $Cluster = "",
    
    [Parameter(Mandatory=$false, Position=2)]
    [System.String]
    $DataCenter = "",
  
    [Parameter(Mandatory=$false, Position=3)]
    [System.String]
    $top = '10',
    
    [Parameter(Mandatory=$false, Position=4)]
    [System.String]
    $minutes = '5'
  )
  
  
  #Check which Variable is filled
  if([string]::IsNullOrEmpty($vHost)) {            
    #Write-Host "Given string is NULL or EMPTY"
    
  } else {            
    #Write-Host "Set vobject" 
    $vobject = (Get-VMHost $vHost)  | Sort-Object -Property Name              
  }
  
  if([string]::IsNullOrEmpty($Cluster)) {            
    #Write-Host "Given string is NULL or EMPTY"  
  } else {            
    #Write-Host "Set vobject" 
    $vobject = (Get-Cluster $Cluster| Get-VMHost)  | Sort-Object -Property Name            
  }
  
  if([string]::IsNullOrEmpty($DataCenter)) {            
    #Write-Host "Given string is NULL or EMPTY"
    
  } else {            
    #Write-Host "Set vobject"
    $vobject = (Get-DataCenter $DataCenter| Get-VMHost)  | Sort-Object -Property Parent,Name              
  }
  
  
  
  
  
  
  $metrics = 'disk.numberwrite.summation','disk.numberread.summation'
  $start = (Get-Date).AddMinutes(-$minutes)
  $report = @()
  
  $vms = ($vobject |Get-VM) | where {$_.PowerState -eq 'PoweredOn'}
  $stats = Get-Stat -Realtime -Stat $metrics -Entity $vms -Start $start
  $interval = $stats[0].IntervalSecs
  
  $lunTab = @{}
  foreach($ds in (Get-Datastore -VM $vms | where {$_.Type -eq 'VMFS'})){
    $ds.ExtensionData.Info.Vmfs.Extent | %{
      $lunTab[$_.DiskName] = $ds.Name
    }
  }
  
  $report = $stats | Group-Object -Property {$_.Entity.Name},Instance | %{
    New-Object PSObject -Property @{
      VM = $_.Values[0]
      Disk = $_.Values[1]
      IOPSMax = ($_.Group | `
        Group-Object -Property Timestamp | `
        %{$_.Group[0].Value + $_.Group[1].Value} | `
      Measure-Object -Maximum).Maximum / $interval
      Datastore = $lunTab[$_.Values[1]]
    }
  }
  
  $report | Sort-Object IOPSMax -Descending | select VM, Datastore, IOPSMax -First $top
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.