Blog Post

Disk IO performance and SQLIO


Performance testing  a new disk subsystem  from a SQL Server perspective is one of the fun aspects of DBA work. Firstly, it’s a great opportunity to influence the optimizations and give valuable feedback to the storage team. Secondly, it’s difficult to simulate the exact workloads and IO patterns. This is a good challenge to review and summarise database servers you’re managing.

SQLIO is a useful tool from Microsoft . Prior to doing SQL Server testing , I commit to generating some figures from SQLIO and working wit the storage guy. We focus on configurations to optimize various activity .

I prefer to set an IO optimal target – and see if SQLIO can verify the expectation. Some guidelines for setting optimal targets :

For tempdb aim for  highest io/sec possible.

For data file , aim for high 8KB and 64KB Random Read and Random Write along with highest possible IO\sec

For log files aim for highest possible MB\sec throughput

For backup files , aim for high MB/sec Sequentail Read and Sequential Writes

The general steps I use are  as follows

Install SQLIO on C:\

The default test file is normally not big enough  for SQL Server testing – normally I create a  25 GB file.This is  smaller then the cache – but is closer to some real performance testing.

Change the file size by adjusting the values in the SQLIO installation file. The default installation is on : C:\Program Files\SQLIO

 The file to edit is “param.txt” . You’ll see a  line entry :

 c:\testfile.dat 2 0x0 100

 Change it to the drive and size you prefer . The sizes are in MB. I’m changing it to test the E:\ with a 25 GB (25600 MB) file:

 e:\perftest.dat 2 0x0 25600

 For Sequential activity I focus on these IO sizes : 8KB, 64KB, 12KB, 256KB  and 1024 KB

For random activity I focus on these IO sizes : 8KB

 Create a Windows batch file called “perftest.bat” in the SQLIO directory. Place the code into the “perftest.bat”

The advice from Microsoft is to test each IO path individually.

In the example below I’m testing read and random , 8kb and 64 kb IO size for the E:\.

--execute the “perftest.bat”  with one input parameter  i.e an output file name

set outputfile=%1
if "%1"=="" goto syntax
sqlio -kW -t8 -s120 -o8 -frandom -b8 -BH -LS E:\perftest.dat >> %outputfile%
sqlio -kR -t8 -s120 -o8 -frandom -b8 -BH -LS E:\perftest.dat >> %outputfile%
sqlio -kW -t8 -s120 -o8 -fsequential -b64 -BH -LS E:\perftest.dat >> %outputfile%
sqlio -kR -t8 -s120 -o8 -fsequential -b64 -BH -LS E:\perftest.dat >> %outputfile%
sqlio -kR -t8 -s120 -o8 -fsequential -b128 -BH -LS E:\perftest.dat >> %outputfile%
sqlio -kR -t8 -s120 -o8 -fsequential -b256 -BH -LS E:\perftest.dat >> %outputfile%
sqlio -kR -t8 -s120 -o8 -fsequential -b1024 -BH -LS E:\perftest.dat >> %outputfile%
echo IO performance test - include an outputfile name 


-kW   testing  writes

-kR    testing reads

-t8      testing with 8 threads

-o8      8 outstanding requests at once

-s240   length of test in seconds

-frandom   testing random activity   e.g data activity

-fsequential  testing sequential activity  e.g Lg files

 From the command prompt type (check your permissions):

sqlio -kW –s20 -fsequential -t8 -o8 -b8 -LS -Fparam.txt timeout /T 20

 The purpose of this short test , defined by the /T switch as 20 seconds, is to create the data file, as defined in the “param.txt” .  It will take a few minutes, be patient.

 Once the command is finished , you are ready to execute:  perftest.bat <name_of_an_output_file>

An output example

sqlio v1.5.SG
using system counter for latency timings, 2001300000 counts per second
8 threads reading for 240 secs from file E:\perftest.dat
using 8KB random IOs
enabling multiple I/Os per thread with 8 outstanding
buffering set to use hardware disk cache (but not file cache)
using current size: 25600 MB for file: E:\perftest.dat
initialization done
throughput metrics:
IOs/sec:  1859.65
MBs/sec:    14.52
latency metrics:
Min_Latency(ms): 1
Avg_Latency(ms): 33
Max_Latency(ms): 1725
ms: 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24+
%:  0  0  0  0  0  0  0  0  0  1  1  2  3  3  3  3  3  3  3  3  3  3  3  3 59



How to Read the Output

 Focus on : IOs/sec , MBs/sec , histogram

 For sequential activity focus on MB/s (throughput) . for Random activity focus on IO/sec . This equates to OLTP v DSS.

This output example was for Random writes with 8KB IO Size .

 At this point , I’ll make an assessment for performance. I was looking for better performance on this disk response – in the region of < 2 ms.   

 I’ll post tomorrow on continuing the analysis and what other steps to take to when analysing data from output.

Related Posts:

SQL Server Storage and IO performance

SQL Server IO patterns and RAID levels

Author: Jack Vamvas (


You rated this post out of 5. Change rating




You rated this post out of 5. Change rating