Vyťaženosť CPU,RAM,DISK na Windows OS

Koľko máte v správe VMs? 100, 200, 1000, 5000? A na koľkých hostoch? Využívate svoju HW infraštruktúru efektívne? Nad poslednou otázkou som sa zamyslel aj ja…

…a preto som si jedného dňa povedal, že skúsim vymyslieť script, ktorý mi na otázku efektívneho využitia HW odpovie. Komponenty, ktoré sú pre mňa najdôležitejšie sú CPU, RAM a DISK.

V MS Windows nám na takéto účely slúžia tkzv. “performance counters”. Vybral som si tieto:

CPU:
‘\Processor(_Total)\% Processor Time’
RAM:
‘\Memory\% Committed Bytes In Use’
DISKy:
‘\LogicalDisk(_total)\Disk Reads/sec’
‘\LogicalDisk(_total)\Disk Writes/sec’
‘\LogicalDisk(_total)\% Disk Read Time’
‘\LogicalDisk(_total)\% Disk Write Time’
‘\LogicalDisk(_total)\Disk Read Bytes/sec’
‘\LogicalDisk(_total)\Disk Write Bytes/sec’
‘\LogicalDisk(_total)\Avg. Disk sec/Read’
‘\LogicalDisk(_total)\Avg. Disk sec/Write’
‘\LogicalDisk(_total)\Avg. Disk Bytes/Read’
‘\LogicalDisk(_total)\Avg. Disk Bytes/Write’
‘\LogicalDisk(_total)\Current Disk Queue Length’

V prípade procesora, _Total znamená “všetky procesory (a jadrá)”, pri diskoch zase všetky logické disky. Ak by ste sa rozhodli, že chcete merať performance na fyzických diskoch, vymente v diskových countroch LogicalDisk za PhysicalDisk.

Informácie o naconfigurovaných kapacitách som získal pomocou PowerCLI cmdletu:

(Get-VMGuest -VM MENOSERVERA).Disks.CapacityGB

Samotný script potom vyzerá takto:

Connect-VIServer vc.yourcompany.com
$report = 'C:\Scripts\Export\CpuMemDisks.csv'
$WinVMsCL12 = Get-VM -Location CLA,CLB | Where-Object {$_.PowerState -eq "PoweredOn" -and $_.Name -ne “MENO_SERVERA_KTORY_NECHCETE_SLEDOVAT”} | Get-VMGuest | Where-Object {$_.OSFullName -like '*Microsoft*'}

$WinVMsCL12 | ForEach-Object {
                        $start = Get-Date
                        $VM = Get-VM $_.VM
                        $OSFullName = $_.OSFullName
                        $VMHostProcType = (Get-VMHost -VM $_.VM).ProcessorType
                        $cpu = Get-Counter -ComputerName $_.VM '\Processor(_Total)\% Processor Time'
                        $mem = Get-Counter -ComputerName $_.VM '\Memory\% Committed Bytes In Use'
                        $NumLogDisks = $_.Disks.Count
                        $AllDisksCap = ($_.Disks.CapacityGB | Measure-Object -Sum).Sum
                        $AllDisksFreeCap = ($_.Disks.FreeSpaceGB | Measure-Object -Sum).Sum
                        $AllDisksUsedCap = $AllDisksCap - $AllDisksFreeCap
                        $IOPSR = Get-Counter -ComputerName $_.VM '\LogicalDisk(_total)\Disk Reads/sec'
                        $IOPSW = Get-Counter -ComputerName $_.VM '\LogicalDisk(_total)\Disk Writes/sec'
                        $DiskRTime = Get-Counter -ComputerName $_.VM '\LogicalDisk(_total)\% Disk Read Time'
                        $DiskWTime = Get-Counter -ComputerName $_.VM '\LogicalDisk(_total)\% Disk Write Time'
                        $ThroughputR = Get-Counter -ComputerName $_.VM '\LogicalDisk(_total)\Disk Read Bytes/sec'
                        $ThroughputW = Get-Counter -ComputerName $_.VM '\LogicalDisk(_total)\Disk Write Bytes/sec'
                        $LatencyR = Get-Counter -ComputerName $_.VM '\LogicalDisk(_total)\Avg. Disk sec/Read'
                        $LatencyW = Get-Counter -ComputerName $_.VM '\LogicalDisk(_total)\Avg. Disk sec/Write'
                        $IOSizeR = Get-Counter -ComputerName $_.VM '\LogicalDisk(_total)\Avg. Disk Bytes/Read'
                        $IOSizeW = Get-Counter -ComputerName $_.VM '\LogicalDisk(_total)\Avg. Disk Bytes/Write'
                        $QueueDepth = Get-Counter -ComputerName $_.VM '\LogicalDisk(_total)\Current Disk Queue Length'

                        $End = Get-Date
                        $RT = $end - $start
                        "$($RT.Seconds);$($_.VM);$($OSFullName);$($VMHostProcType);$($VM.NumCpu);$(Get-Date ($cpu.Timestamp) -Format G);$([math]::Round($cpu.CounterSamples.CookedValue,2));$($VM.MemoryGB);$([math]::Round($mem.CounterSamples.CookedValue,2));$($NumLogDisks);$([math]::Round($AllDisksCap,2));$([math]::Round($AllDisksUsedCap,2));$([math]::Round($IOPSR.CounterSamples.CookedValue,2));$([math]::Round($IOPSW.CounterSamples.CookedValue,2));$([math]::Round($DiskRTime.CounterSamples.CookedValue,2));$([math]::Round($DiskWTime.CounterSamples.CookedValue,2));$([math]::Round($ThroughputR.CounterSamples.CookedValue,2));$([math]::Round($ThroughputW.CounterSamples.CookedValue,2));$([math]::Round($LatencyR.CounterSamples.CookedValue,2));$([math]::Round($LatencyW.CounterSamples.CookedValue,2));$([math]::Round($IOSizeR.CounterSamples.CookedValue,2));$([math]::Round($IOSizeW.CounterSamples.CookedValue,2));$([math]::Round($QueueDepth.CounterSamples.CookedValue,2))" | Add-Content -Path $report

}

Nezľaknite sa prosím samotného zápisu do .CSV. Je v ňom použitá metóda matematického zaokrúhľovania na 2 desatinné miesta.

Takýto script, keď necháte spúšťať napr. task schedullerom každé 2 hodiny, o mesiac budete mať dostatok dát na svoju analýzu a prípadné neminuté peniaze za najbližší upgrade HW môžete minúť napr. na licencie niektorého z produktov balíka vRealize, ktorý vám o vašej infraštruktúre povie oveľa viac ako tento script. :)

Author: Martin

Infrastructure engineer | virtualization & cloud enthusiast | vSphere specialist | blogger | Veeam Vanguard 2021,2022,2023 | VMware vExpert 2017 - 2024 | VMCE | VCP-DCV, NV, TKO, VCAP-DCV | Slovak VMUG Leader | Slovak VUG Leader | husband&father