title: SQL Server Check DB IO requests taking longer than 15 seconds warning
body: <p>I am experiencing some problems with performing CHECKDB on my SQL Server. I am running SQL Server 2008 SP4 and SQL Server 2014 SP2 CU4. The SQL Server 2008 instance uses SAN storage, the SQL Server 2014 instance uses just local storage.</p>
  
  <p>During CHECKDB is running I get messages in the error log like the following:</p>
  
  <blockquote>
    <p>SQL Server has encountered 61 occurrence(s) of I/O requests taking longer than 15 seconds to complete on file ...</p>
  </blockquote>
  
  <p>I am aware that my disks (local and SAN) are not optimal regarding throughput but unfortunately that's the setup I have to stick with in the nearer future. Furthermore the throughput is sufficient for my daily workload but the time CHECKDB is running things tend to get out of control and the disks are overwhelmed by the traffic generated.</p>
  
  <p>CHECKDB is invoked by Ola Hallengren's Backup solution using commands like </p>
  
  <blockquote>
    <p>DBCC CHECKDB ([mydb]) WITH NO_INFOMSGS, ALL_ERRORMSGS, DATA_PURITY</p>
  </blockquote>
  
  <p>The IO warnings in the error log are mainly for tempdb and for a few user database files.</p>
  
  <p>Tempdb is configured according to the setup checklist by Brent Ozar: 8 datafiles, each pregrown to the sames size, autogrowth disabled.  The transaction log file resides on a different volume. I do not use any traceflags like 1117 and 1118 so far.</p>
  
  <p>Interestingly I get the IO warnings on the SQL 2014 instance just after my biggest database have grown from 100GB to 200GB in a few days (resulting from data being migrated into the database...the usual growth rate is much lower).</p>
  
  <p>The IO warnings on the SQL 2014 go along with timeouts in Nagios monitoring.
  Here's a screenshot of the disk throughput from Nagios: The time CHECKDB runs the overall throughput (read and write) is identical with the max values over time:
  <a href="https://i.stack.imgur.com/FYePn.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/FYePn.jpg" alt="disk throughput"></a></p>
  
  <p>Here's a statistic of disk throughput on checkdb with physical_only:
  <a href="https://i.stack.imgur.com/dPYSn.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/dPYSn.jpg" alt="disk throughput physical only"></a></p>
  
  <p>Interestingly the IO warnings have gone now. Additionally there were no further timeouts on Nagios checks.</p>
  
  <p>Is there anything I could do to get rid of the warnings and the IO overkill situation like</p>
  
  <ul>
  <li>telling CHECKDB to run slower and use less resources</li>
  <li>optimize the structure of my biggest database (VLF count? Index maintenance is running daily)</li>
  <li>moving tempdb to the SAN</li>
  </ul>
  
  <p>The 2014 instance just got one local RAID drive consisting of two sata disks (due to blade server) which is partitioned for windows and has separate partitions for data, log and tempdb.
  I am aware that this is against best practice configuration using different disks for tempdb, windows, data and log. But unfortunately there is currently no way to implement such a solution. I could switch using the SAN but unfortunately this is even slower most of the time (poorly configured...outdated technology...etc).</p>
  
  <p>It's perfectly acceptable for you to think "man get a better IO subsystem and shut up" but as I wrote that's not possible short term. Therefore it would help tremeandously to be able to solve the problem in another way. As I said for my regular workload the current IO subsystem (however old fashioned it might seem) is perfectly sufficient.</p>