wiki.getshifting.com

--- Sjoerd Hooft's InFormation Technology ---

User Tools

Site Tools


vmwarehostperformancereport

Script: powerCLI: vSphere Host Performance Script

Summary: Use this powershell script to query all hosts and their performance status.
Date: 25 May 2014
Refactor: 1 May 2025: Checked links and formatting.

This script will query all hosts and audit their performance doing. It will tell you your core overcommitment, number of VMs, and more.

The Script

# Author: Sjoerd Hooft
# Date: 20140525
# Version Description:
## Second version of Audit Script
 
## Functions right now
 
# Connect to vCenter
# Get Host performance information regarding CPUs, RAM, VMs
 
# Notes
## Stats can be available for: Get-StatType -Entity (Get-VMHost $esxihost) -Interval "Past Week"
## cpu.usage.average
## cpu.usagemhz.average
## cpu.ready.summation
## mem.usage.average
## mem.swapinRate.average
## mem.swapoutRate.average
## mem.vmmemctl.average
## mem.consumed.average
## mem.overhead.average
## disk.usage.average
## disk.maxTotalLatency.latest
## net.usage.average
## sys.uptime.latest
## clusterServices.cpufairness.latest
## clusterServices.memfairness.latest
 
 
# Variables
$scriptname = [System.IO.Path]::GetFilenameWithoutExtension($MyInvocation.MyCommand.Path.ToString())
$scriptlocation = Split-Path $myinvocation.mycommand.path
$timestamp = Get-Date -format "yyyyMMdd-HH.mm"
$weekdate = Get-Date -uformat %V
$todayMidnight = (Get-Date -Hour 0 -Minute 0 -Second 0).AddMinutes(-1)
$vcenters = @("vcenter1.getshifting.local","vcenter2.getshifting.local")
$MailServer = "mailserver.getshifting.local"
$toemail = "sjoerd @ _getshifting.com"
$fromemail = "monitoring @ _getshifting.com"
$csvfile = "$scriptlocation\$scriptname-vSphere.csv"
 
# Start-transcript
start-transcript -path "$scriptlocation\$scriptname.txt"
 
# Add VMware snapin
if(-not (Get-PSSnapin VMware.VimAutomation.Core -ErrorAction SilentlyContinue)){
   Add-PSSnapin VMware.VimAutomation.Core}
 
# Extra custom properties for quick host vm cpu counting
New-VIProperty -ObjectType VMHost -name NumvCPUs `
    -Value {$TotalvCPU = 0
            $Args[0] | Get-VM | Foreach {
                $TotalvCPU += $_.NumCPU}
            $TotalvCPU
      } -Force
 
New-VIProperty -ObjectType VMHost -name NumPoweredOnvCPUs `
    -Value {$TotalvCPU = 0
            $Args[0] | Get-VM | Where { $_.PowerState -eq "PoweredOn" } | Foreach {
                $TotalvCPU += $_.NumCPU}
            $TotalvCPU
      } -Force
 
New-VIProperty -ObjectType VMHost -name NumvRAM `
    -Value {$TotalvRAM = 0
            $Args[0] | Get-VM | Foreach {
                $TotalvRAM += $_.MemoryMB}
            $TotalvRAM
      } -Force
 
New-VIProperty -ObjectType VMHost -name NumPoweredOnvRAM `
    -Value {$TotalvRAM = 0
            $Args[0] | Get-VM | Where { $_.PowerState -eq "PoweredOn" } | Foreach {
                $TotalvRAM += $_.MemoryMB}
            $TotalvRAM
      } -Force
 
# Functions
# Email functions
Function Send-Email ($subject, $info){
  Send-MailMessage -To $toemail -From $fromemail -SmtpServer $mailserver -Subject $subject -Body $info -Attachments "$attachment"}
 
Function AuditAllHosts ($vcenters){
 
# Create an array to collect all audit information
$myCol = @()
 
ForEach ($vcenter in $vcenters){
 
  # Connect to vCenter
  Connect-VIServer $vcenter
 
  # Get Audit properties for all hosts
  ForEach ($esxihost in (Get-VMhost)){
 
    $cpuaverage = Get-Stat -Entity ($esxihost) -Stat cpu.usage.average -Start $todayMidnight.AddDays(-7) -Finish $todayMidnight.AddDays(-1) | where{$_.Instance -eq ""} | Measure-Object value -average
    $ramaverage = Get-Stat -Entity ($esxihost) -Stat mem.usage.average -Start $todayMidnight.AddDays(-7) -Finish $todayMidnight.AddDays(-1) | where{$_.Instance -eq ""} | Measure-Object value -average
 
    $HostInfo = "" |select-Object HostName,Cluster,VMCount,VMCountPoweredOn,NumCPU,NumvCPUs,NumPoweredOnvCPUs,CoreRatio,Hyperthreading,CpuTotalMhz,CPUAverageUsage,MemoryTotalMB,NumvRAM,NumPoweredOnvRAM,RAMLeft,RAMAverageUsage
 
    $HostInfo.HostName = $esxihost.Name
    $HostInfo.Cluster = (get-vmhost $esxihost | get-cluster).Name
    $HostInfo.VMCount = (get-vmhost $esxihost | get-vm).Count
    $HostInfo.VMCountPoweredOn = (get-vmhost $esxihost | get-vm | where {$_.Powerstate -eq "PoweredOn"}).Count
 
    $HostInfo.NumCPU = $esxihost.NumCPU
    $HostInfo.NumvCPUs = $esxihost.NumvCPUs
    $HostInfo.NumPoweredOnvCPUs = $esxihost.NumPoweredOnvCPUs
    $HostInfo.CoreRatio = $HostInfo.NumPoweredOnvCPUs/$HostInfo.NumCPU
    $Hostinfo.Hyperthreading = $esxihost.hyperthreadingactive
    $HostInfo.CpuTotalMhz = $esxihost.CpuTotalMhz
    $HostInfo.CPUAverageUsage = $cpuaverage.average
 
    $HostInfo.MemoryTotalMB = $esxihost.MemoryTotalMB
    $HostInfo.NumvRAM = $esxihost.NumvRAM
    $HostInfo.NumPoweredOnvRAM = $esxihost.NumPoweredOnvRAM
    # Note: The line below does not consider memory usage by overhead like the host itself or overhead for virtual hardware
    $HostInfo.RAMLeft = $esxihost.MemoryTotalMB - $esxihost.NumPoweredOnvRAM
    $HostInfo.RAMAverageUsage = $ramaverage.average
 
    $myCol += $HostInfo
  }
 
  # Disconnect from vCenter
  Disconnect-VIServer * -Confirm:$false
}
 
$myCol |Export-csv -NoTypeInformation $csvfile
 
# Send Report
$attachment = $csvfile
$subject = "vSphere Audit Report for week $weekdate"
$info = "Find the report attached to this email. Kind regards, Sjoerd Hooft."
Send-Email $subject $info
 
}
 
# Cleanup files from last run
Remove-Item $csvfile
 
#Start Actual Script
AuditAllHosts $vcenters
 
# Stop logging
stop-transcript
vmwarehostperformancereport.txt · Last modified: by 127.0.0.1