One of the main metrics, which allows to estimate the performance of the existing or developed storage system is IOPS (Input/Output Operations Per Second). In simple terms, IOPS is the number of blocks read from or written to a media or a file system in a time unit. The larger is this number, the higher is the performance of the disk subsystem. (Frankly speaking, the IOPS value has to be considered together with other data storage characteristics, like average latency, throughput, etc.)
You can roughly estimate the performance of a disk subsystem using performance counters in Performance Monitor (like Disk Reads/sec, Disk Writes/sec, Current Disk Queue Length).
I needed to have a more visual and convenient PowerShell tool at hand, which allowed to quickly measure the current performance of a data storage system in IOPS, whether they are a local hard disk, an SSD, a network folder (SMB), a CSV volume or a LUN on the SAN (Storage Area Network ).
I have found a PowerShell script (by Mikael Nystrom, Microsoft MVP), which is essentially an add-on to SQLIO.exe utility(a set of file storage performance tests). Although there is SQL in the name of the utility, MSSQL is not required: it can be used in any Windows system.
So, download the archive containing 2 files: SQLIO.exe and DiskPerformance.ps1 (disk_perf_iops.ZIP — 74 KB) and extract it to any folder.
An example of running a script to estimate IOPS:
.\DiskPerformance.ps1 -TestFileName test.dat –TestFileSizeInGB 1 -TestFilepath C:\temp -TestMode Get-LargeIO -FastMode True -RemoveTestFile True -OutputFormat Out-GridView
Let’s consider the script arguments:
The name of the file created by FSUTIL
The size of the test file. Possible variants are 1.5, 10, 50, 100, 500, 1,000 GB. The file size has to be larger than the size of the system cache. Otherwise, IOPS will be measured for the cache data, instead for the disk.
Here you specify the disk to estimate the performance for and the folder on the disk, in which a test file will be created. You can also specify an UNC path to the shared folder.
There are two variants of input-output measurement: Get-SmallIO allows to measure IOPS, and Get-LargeIO measures data transmission rate. The difference between SmallIO and LargeIO arguments is in the block size of 8 KB and 512 KB while measuring the rate, and the type of access, Random or Sequential, correspondingly.
In the Fastmode, each test takes 10 seconds, otherwise it takes 60 seconds.
Remove the test file after the test is over.
The test results can be displayed either in PowerShell console (Format-Table) or in a separate graphic chart window (Out-Gridview).
In our case (a virtual disk in the VMFS storage on HP MSA 2040 with SAN access) the disk array showed the average IOPS value of about 15,000 and the data transmission rate (throughput) about 5 Gbit/s.
In the following table, the approximate IOPS values for different disk types are shown:
I have found some considerations on performance in IOPS for some popular services:
- Microsoft Exchange 2010 with 5,000 users, each of them getting 75 and sending 30 letters a day, requires at least 3,750 IOPS
- Microsoft SQL 2008 Server with 3,500 SQL transactions per second (TPS) requires 28,000 IOPS
- A common Windows application server for 10-100 users requires 10-40 IOPS