5.02021-11-21T21:37:38ZA-OVR_TPLGPRWindows Physical Disk IOPSWindows Physical Disk IOPS## Overview
This template discover physical disk thrue a powershell code.
As i hate myself to deploy third party scripts on my agents, the powershell code is embeded in this template macro, this mean that you don't have to deploy any additionnal scripts to get it work.
It also use "zabbix active" items to get work behind firewall.
Data are retrieved thrue perfmon values, the template has been made to be compatible with all OS language using numeric value of perfcounter.
This template is better than others because this one calculate the IOPS per physical disk instead of logical drive, meaning a better estimation of true saturation of a disk.
If trigger fire on physical disk too much, it's time to buy SSD :)
Look at the attached screenshots to get a better idea of it.
Enjoy
PS: powershell macro has been base64 encoded to be more easy to deploy, if you do not trust the code you can easily revert it back to something readable or just look at the Zabbix Agent log to see the command executed
Tested from Windows 7 till 2016 with success.
## Author
Cédric MARCOUX
A-OVR_TPLGPRPhysicalDiskDiscover PhysicalDiskZABBIX_ACTIVEsystem.run[%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy ByPass -nologo -EncodedCommand {$DISCOVERDISK1}{$DISCOVERDISK2}{$DISCOVERDISK3}{$DISCOVERDISK4}{$DISCOVERDISK5}]1d7dEncoded command splitted in 5 macro:
$drives = Get-WmiObject win32_PerfFormattedData_PerfDisk_PhysicalDisk | ?{$_.name -ne "_Total"} | Select Name;$idx = 1;write-host "{";write-host " `"data`":[`n";foreach ($perfDrives in $drives){if ($idx -lt $drives.Count){ $line= "{ `"{#DISKNUMLET}`" : `"" + $perfDrives.Name + "`" },";write-host $line;}elseif ($idx -ge $drives.Count){$line= "{ `"{#DISKNUMLET}`" : `"" + $perfDrives.Name + "`" }";write-host $line;}$idx++;};write-host;write-host " ]";write-host "}";Disk ({#DISKNUMLET}) - Average Disk Bytes TotalCALCULATEDAvgDiskBytesTotal[({#DISKNUMLET})]15s7dFLOATBlast("perf_counter[\"\234({#DISKNUMLET})\226\"]",0)+last("perf_counter[\"\234({#DISKNUMLET})\228\"]",0)PhysicalDiskDisk ({#DISKNUMLET}) - % Disk saturationCALCULATEDDiskSaturation[({#DISKNUMLET})]15s7dFLOAT100-last("perf_counter[\"\234({#DISKNUMLET})\1482\"]",0)PhysicalDiskDisk ({#DISKNUMLET}) - Current Disk Queue LengthZABBIX_ACTIVEperf_counter["\234({#DISKNUMLET})\198"]15s7dFLOATPhysicalDiskDisk ({#DISKNUMLET}) - Avg. Disk sec/Read (Latency)ZABBIX_ACTIVEperf_counter["\234({#DISKNUMLET})\208"]15s7dFLOATsPhysicalDiskDisk ({#DISKNUMLET}) - Avg. Disk sec/Write (Latency)ZABBIX_ACTIVEperf_counter["\234({#DISKNUMLET})\210"]15s7dFLOATsPhysicalDiskDisk ({#DISKNUMLET}) - Avg. Disk sec/Transfer (Latency)ZABBIX_ACTIVEperf_counter["\234({#DISKNUMLET})\212"]15s7dFLOATsAvg. Disk sec/Transfer (Avg. Disk sec/Read, Avg. Disk sec/Write)
Displays the average time the disk transfers took to complete, in seconds. Although the scale is seconds, the counter has millisecond precision, meaning a value of 0.004 indicates the average time for disk transfers to complete was 4 milliseconds.
This is the counter in Perfmon used to measure IO latency.PhysicalDiskMULTIPLIER0.001{avg(1m)}>=20RECOVERY_EXPRESSION{avg(1m)}<20Disk ({#DISKNUMLET}) - Disk high latency (>20ms) since 1 minuteWARNINGShould not be higher than ~20msYESDisk ({#DISKNUMLET}) - Average Disk Bytes ReadZABBIX_ACTIVEperf_counter["\234({#DISKNUMLET})\226"]15s7dFLOATBPhysicalDiskDisk ({#DISKNUMLET}) - Average Disk Bytes WriteZABBIX_ACTIVEperf_counter["\234({#DISKNUMLET})\228"]15s7dFLOATBPhysicalDiskDisk ({#DISKNUMLET}) - Avg. Disk Queue LengthZABBIX_ACTIVEperf_counter["\234({#DISKNUMLET})\1400"]15s7dFLOATPhysicalDiskDisk ({#DISKNUMLET}) - % Idle TimeZABBIX_ACTIVEperf_counter["\234({#DISKNUMLET})\1482"]15s7dFLOATPhysicalDisk{Windows Physical Disk IOPS:DiskSaturation[({#DISKNUMLET})].avg(5m)}>=99 or {Windows Physical Disk IOPS:perf_counter["\234({#DISKNUMLET})\1400"].avg(1m)}>=20RECOVERY_EXPRESSION{Windows Physical Disk IOPS:DiskSaturation[({#DISKNUMLET})].avg(5m)}<99 or {Windows Physical Disk IOPS:perf_counter["\234({#DISKNUMLET})\1400"].avg(1m)}<20Disk ({#DISKNUMLET}) - Disk activity saturation for 5 minutesWARNING% Idle Time
This counter provides a very precise measurement of how much time the disk remained in idle state, meaning all the requests from the operating system to the disk have been completed and there is zero pending requests.
This is how it’s calculated, the system timestamps an event when the disk goes idle, then timestamps another event when the disk receives a new request. At the end of the capture interval, we calculate the percentage of the time spent in idle. This counter ranges from 100 (meaning always Idle) to 0 (meaning always busy).YESDisk ({#DISKNUMLET}) - Data RateFIXEDGRADIENT_LINE1A7C11- Windows Physical Disk IOPSperf_counter["\234({#DISKNUMLET})\226"]
1GRADIENT_LINEF63100- Windows Physical Disk IOPSperf_counter["\234({#DISKNUMLET})\228"]
2BOLD_LINE2774A4- Windows Physical Disk IOPSAvgDiskBytesTotal[({#DISKNUMLET})]
Disk ({#DISKNUMLET}) - LatencyFIXEDGRADIENT_LINE1A7C11- Windows Physical Disk IOPSperf_counter["\234({#DISKNUMLET})\208"]
1BOLD_LINEF63100- Windows Physical Disk IOPSperf_counter["\234({#DISKNUMLET})\212"]
2GRADIENT_LINE2774A4- Windows Physical Disk IOPSperf_counter["\234({#DISKNUMLET})\210"]
Disk ({#DISKNUMLET}) - Saturation and QueueFIXEDFIXEDGRADIENT_LINE1A7C11- Windows Physical Disk IOPSDiskSaturation[({#DISKNUMLET})]
1BOLD_LINEF63100RIGHT- Windows Physical Disk IOPSperf_counter["\234({#DISKNUMLET})\198"]
{$DISCOVERDISK1}JABkAHIAaQB2AGUAcwAgAD0AIABHAGUAdAAtAFcAbQBpAE8AYgBqAGUAYwB0ACAAdwBpAG4AMwAyAF8AUABlAHIAZgBGAG8AcgBtAGEAdAB0AGUAZABEAGEAdABhAF8AUABlAHIAZgBEAGkAcwBrAF8AUABoAHkAcwBpAGMAYQBsAEQAaQBzAGsAIAB8ACAAPwB7ACQAXwAuAG4AYQBtAGUAIAAtAG4AZQAgACIAXwBUAG8AdABhAGwAIgB9ACA{$DISCOVERDISK2}AfAAgAFMAZQBsAGUAYwB0ACAATgBhAG0AZQA7ACQAaQBkAHgAIAA9ACAAMQA7AHcAcgBpAHQAZQAtAGgAbwBzAHQAIAAiAHsAIgA7AHcAcgBpAHQAZQAtAGgAbwBzAHQAIAAiACAAYAAiAGQAYQB0AGEAYAAiADoAWwBgAG4AIgA7AGYAbwByAGUAYQBjAGgAIAAoACQAcABlAHIAZgBEAHIAaQB2AGUAcwAgAGkAbgAgACQAZAByAGkAdgBlAH{$DISCOVERDISK3}MAKQB7AGkAZgAgACgAJABpAGQAeAAgAC0AbAB0ACAAJABkAHIAaQB2AGUAcwAuAEMAbwB1AG4AdAApAHsAIAAgACAAIAAgACAAIAAkAGwAaQBuAGUAPQAgACIAewAgAGAAIgB7ACMARABJAFMASwBOAFUATQBMAEUAVAB9AGAAIgAgADoAIABgACIAIgAgACsAIAAkAHAAZQByAGYARAByAGkAdgBlAHMALgBOAGEAbQBlACAAKwAgACIAYAAiA{$DISCOVERDISK4}CAAfQAsACIAOwB3AHIAaQB0AGUALQBoAG8AcwB0ACAAJABsAGkAbgBlADsAfQBlAGwAcwBlAGkAZgAgACgAJABpAGQAeAAgAC0AZwBlACAAJABkAHIAaQB2AGUAcwAuAEMAbwB1AG4AdAApAHsAJABsAGkAbgBlAD0AIAAiAHsAIABgACIAewAjAEQASQBTAEsATgBVAE0ATABFAFQAfQBgACIAIAA6ACAAYAAiACIAIAArACAAJABwAGUAcgBm{$DISCOVERDISK5}AEQAcgBpAHYAZQBzAC4ATgBhAG0AZQAgACsAIAAiAGAAIgAgAH0AIgA7AHcAcgBpAHQAZQAtAGgAbwBzAHQAIAAkAGwAaQBuAGUAOwB9ACQAaQBkAHgAKwArADsAfQA7AHcAcgBpAHQAZQAtAGgAbwBzAHQAOwB3AHIAaQB0AGUALQBoAG8AcwB0ACAAIgAgAF0AIgA7AHcAcgBpAHQAZQAtAGgAbwBzAHQAIAAiAH0AIgA7AA0ACgA=