The need
Since I build datacenters I need to verify performance and you can do that using SQLIO. But there is a lot of parameters, a lot of typing and to make testing a bit more consistent I was reading Jose Barreto’s blog http://blogs.technet.com/b/josebda/archive/2013/03/28/sqlio-powershell-and-storage-performance-measuring-iops-throughput-and-latency-for-both-local-disks-and-smb-file-shares.aspx and that gave me inspiration to create a PowerShell script that is a bit more complete and here you can see the result of it. We use this to measure performance on local disks, SMB storage, Storage Spaces, SAN storage, iSCSI storage, basically everything, now it is easy to “spot” the issue, since we have seen the numbers so many times.
Output sample in table format.
Output in Grid view.
The Download
You can download the script from here: http://1drv.ms/1pQNr4i
To use it you need to have SQLIO from Microsoft and you need to store the SQLIO.exe file in the same folder as the script, this way it is easy to move around the test tool as a kit, since SQLIO does not really needs to be installed, the download is an MSI file, so you need to install it once or extract it
You can download SQLIO from here: http://www.microsoft.com/en-us/download/details.aspx?id=20163
The script it is rather easy, it is basically a wrapper for SQLIO.exe but it gives you an output as a table or in a grid. There is two options to measure workload, you either measure IOPS or Transfer rate.
The howto
.\Measure-DiskPerformance.ps1 -TestFileName test.dat –TestFileSizeInGB 1 -TestFilepath C:\VMs -TestMode Get-LargeIO -FastMode True -RemoveTestFile True -OutputFormat Out-GridView
Explanation:
-TestFileName test.dat
The name of the file, it will create the file using FSUTIL, but it checks if it exists and if it does it stops, you can override that with the –RemoveTestFile True
–TestFileSizeInGB 1
Size of the file, it has fixed values, use the TAB key to flip through them
-TestFilepath C:\VMs
The folder, can also be an UNC path, it will create the folder so it does not need to exist.
-TestMode Get-LargeIO
There is too test modes Get-LargeIO or Get-SmallIO, you use Get-LargeIO to measure the transfer rate and you use Get-SmallIO to measure IOPS
-FastMode True
Fastmode true runs each test for just 10 seconds, it gives you a hint, if you don’t set it or set it to false it will run for 60 sec (it will take a break for 10 sec between each run)
-RemoveTestFile True
Removes the test file if it exists
-OutputFormat Out-GridView
Choose between Out-Gridview or Format-Table
/mike
Categories: PowerShell, Windows Server 2012 R2
Reblogged this on MDTGuy.WordPress.com and commented:
Powershell Por Vida! Another excellent post from Mikael Nystrom!
Can this be used on CSVs as well? Any limitations?
Yes, we use it on fileshares, CSV, localdisk, basically anything you can type in as a path will work…
Thanks will test it out soon. Much appreciated.
Arwidmark writes the following on his blog. Comment? “And please do not create the file using FSUtil, because it will just create an empty file, which the controller cache may suck into RAM immediately and your test results will be off the charts. Create a “real” file, with content, generate a giant ISO file, or a large WinRAR archive, anything you can think of as long as the file is full with data.”
Yep, I know, we disagree on that. I have come to the conclusion that it does not matter much as long as you use the same method everytime. But when using FSUTIL you must run it twice, the first time to create the file and the second to fill it with data, if you run it only once it will 100% empty
Could this script be used to measure disk performance inside a Virtual Machine ?
Or is just for Hyper-V hosts ?
Tips for measure diskspeed inside a VM?
/Anders
Yes, we use it inside VM as well..
Ok, great! What is “normal” values for different types of disksetups (SSD, SAS-Mirror, SATA-III ? would be great with som kind of list. I Ran the script within a VM where the vhdx is on SATA-3 mirror (storage spaces in 2012 R2) and got 7000MB and 13000 IOPs. That could not be correct I think? Runing on the host towards the same storage got me around 90MB and 200 IOPs. And towards a SSD-storage got me 535 MB/Sec and 1050 IOPs on the same host.
That cpould be correct, since the the fabric layer will try to not do anything pointless, it vill use cache and similar functions to avoid unneeded actions. But we have another script that will better simulate real load. (will post as soon as I have 5 minutes to spare)
Hi Mike!
Have you found 5 minutes to spare, so that you could upload that other script for better testing disk performance inside a VM?
/Anders
Awesome script! As Anders said, you get that script for testing within a VM uploaded?
Thanks.
Would be great to see that other script once you have uploaded it. I also have a requirement for testing against different types of storage.
I’m having this issue while running the script,
Method invocation failed because [System.Object[]] doesn’t contain a method named ‘Split’.
At C:\PS\Measure-DiskPerformance.ps1:120 char:25
+ $mbs = $Result.Split <<<< ("`n")[11].Split(':')[1].Trim()
+ CategoryInfo : InvalidOperation: (Split:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
any advice on to resolve the error?
No, not really. Try to run it on any other machine, with an other OS and see if the same thing happens. The error does not make any sense at all
I found the issue because I’m running on WIndows 2008 R2 and I need to update Windows PowerShell to 3.0 in order for the “split” command to work. Visit the following URL to download the update http://support.microsoft.com/kb/2506143
Hope it will be useful for everyone.
Thanks.
I ran into the same problem while doing some testing of my own. I think that it was a powershell version issue and that the resolution was to remove the first split (.Split(“`n”)), it seems that the output already was delivered by line.
As I wanted to test the performance of an old 2003 Server I hacked the script so that it now runs on PowerShell Version 2 with Format-Table
Reblogged this on Agile I/O and commented:
I just had to share this. Great script, valuable resource indeed!
I am seeing this error in PS and the throughput and IOPS do not populate
Method invocation failed because [System.Object[]] doesn’t contain a method named ‘Split’.
You are either running the script inside ISE or you are running an old version of PowerShell.
I’m not sure what ISE is and I am running the default PS in 2008 R2
Ah scripting environment, yes I recall having to enable this feature within 2008 R2 to get the script to even run. How would you suggest running it?
What if i want to run this for a long period of time ? Say 3 days and get results summing up the iops need ?
run the script using a script and repeat?
SQLIO no longer available, has been replaced by DiskSpd: https://gallery.technet.microsoft.com/DiskSpd-a-robust-storage-6cd2f223
The original download link for SQLIO now points at a PDF which states:
“The SQLIO Disk Subsystem Benchmark Tool has been retired and replaced by
DiskSpd.exe. You can download the tool and documentation
from http://aka.ms/diskspd. DiskSpd.exe is a versatile storage load generator and
performance tool from Microsoft that can be used to run storage performance
tests against files, partitions, and physical disks. It can simulate SQL Server I/O
activity or more complex, variable access patterns.
DISKSPD is provided “as is,” and no support is offered for any problems
encountered when using the tool. Please see the EULA.doc for the DiskSpd
license agreement.”
As i cannot find a copy of SQLIO anyhere…………..care to rewrite/update your script Mikael? :)
Working on it
The SQLIO download has been pulled by Microsoft and replaced with a Readme.PDF which says ‘The SQLIO Disk Subsystem Benchmark Tool has been retired and replaced by DiskSpd.exe.’ Bummer.
I know, and DiskSpd is not that great, but i’m working och doing something similar using DiskSpd.exe instead…