Fix it now
SQL Server has issued reads or writes that took longer than fifteen seconds to come back. It is informational and the instance keeps running, but fifteen seconds is a stall, not a delay, and the fault is below the database.
SELECT DB_NAME(vfs.database_id) AS db, mf.physical_name,
vfs.num_of_reads, vfs.io_stall_read_ms / NULLIF(vfs.num_of_reads,0) AS avg_read_ms,
vfs.num_of_writes, vfs.io_stall_write_ms / NULLIF(vfs.num_of_writes,0) AS avg_write_ms
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs
JOIN sys.master_files AS mf
ON mf.database_id = vfs.database_id AND mf.file_id = vfs.file_id
ORDER BY avg_write_ms DESC;
- Read the error log entries and note which file and which database each names. Data files, the log and tempdb sit on different parts of the storage path.
- Compare the figures above with the PhysicalDisk counters for average seconds per read and per write, so you know whether Windows sees the same delay.
- Check the Windows system event log for disk and storage driver events at the same timestamps. Reset and retry entries put the fault below SQL Server.
- Exclude SQL Server data files from real-time antivirus scanning. Microsoft names filter drivers, including antivirus, as a documented cause and the exclusion as a documented action.
- Check whether a backup, snapshot or replication job runs at those times. Correlating timestamps usually names the culprit in one step.
Microsoft’s own guidance for 833 starts with the system event log and hardware logs, then driver and firmware levels, then the antivirus exclusion. Work in that order before touching the database.
If the stalls stop when the overlapping job or the scanner is dealt with, you are done. If they do not, the next section covers what 833 measures and how 845, 17883 and 17884 fit around it.
Why it happens
SQL Server tracks how long each outstanding I/O has been pending. When a request against a file has been waiting fifteen seconds or longer, it writes a message naming the file, the database, how many such occurrences it has seen, the OS file handle and the offset of the most recent long I/O. That threshold is deliberately generous. Fifteen seconds is not a marginal delay; by the time you see 833, latency has been poor for a while and only the very worst requests are being reported.
Microsoft’s own cause list for this message is wider than most people expect: faulty hardware, hardware configured incorrectly, firmware settings, filter drivers such as antivirus, compression, software bugs, a workload that exceeds what the I/O path can carry, and operating system performance problems. Note what is not on it – a shortage of database memory. Adding RAM reduces physical reads, which reduces the number of stalls you see, but it does nothing for log writes, checkpoints or backups, all of which still have to reach the disk.
845 sits one layer up. It is Time-out occurred while waiting for buffer latch type %d for page %S_PGID, database ID %d, and it usually means a task waited for a page that was still coming off disk. 17883 is the scheduler monitor reporting a worker that appears to be non-yielding, with kernel and user CPU times and the system idle percentage in the message. 17884 is its sibling, SRV_SCHEDULER_DEADLOCK: new queries assigned to a node have not been picked up by any worker thread for some seconds. Slow storage produces all four, because workers blocked on I/O stop behaving like workers.
Something else is reading or scanning the database files
You have this one if The stalls cluster at fixed times, and a backup, snapshot or scanning product runs then.
- Exclude the data, log and backup files and their directories from real-time antivirus scanning, following the antivirus vendor’s documented method.
- Move host-level snapshots and virtual machine backups away from the busy period.
- Stagger index maintenance and consistency checks so they do not overlap the transactional peak.
Microsoft lists filter drivers and compression among the causes of 833 and names excluding SQL Server data files from antivirus scans among the actions. This is not folklore.
The storage path is saturated or misconfigured
You have this one if Latency is high across every file on the same volume and the operating system counters agree with SQL Server.
- Check queue depth, multipath configuration and host bus adapter settings against the storage vendor’s guidance for database workloads.
- Look for thin provisioning or an oversubscribed array. A volume that looks dedicated can be sharing spindles with everything else.
- In a virtual machine, check host memory ballooning and CPU contention; both appear inside the guest as slow I/O.
- Confirm the volumes holding data and log files are not NTFS-compressed, which is unsupported for those files.
File growth is stalling writes
You have this one if 833 entries coincide with autogrowth events, and the growth increments are small percentages rather than fixed sizes.
- Pre-size data and log files to what they will actually need instead of letting them grow in small steps.
- Set growth increments to a fixed size appropriate to the file, not a percentage.
- Grant the Database Engine service account or its service SID the Perform volume maintenance tasks right so data file growth can use instant file initialization.
- Turn autoshrink off. Microsoft lists it among the actions for 845 because it creates repeated size changes for no benefit.
Since SQL Server 2022, transaction log autogrowth events up to 64 MB can also use instant file initialization, and those do not need the volume maintenance privilege. Growth events larger than 64 MB still cannot, which is another argument for a sensible fixed growth increment.
A device or path is failing rather than merely busy
You have this one if Storage retry or reset events appear in the Windows system log and the latency is erratic rather than uniformly high.
- Take the storage events to whoever owns the array or the host. Retry and reset entries from the storage driver are hardware or fabric evidence, not database evidence.
- Update device drivers and firmware for the adapter and the array against the vendor’s supported matrix; Microsoft names this explicitly for 833.
- Until it is resolved, treat the instance as at risk: verify that your backups restore and run consistency checks.
Full reference
Where the delay usually comes from
| Observation | Likely source |
|---|---|
| Only the log file is slow | The write path, a cache policy, or the log sharing a spindle |
| Only tempdb is slow | tempdb on the wrong storage, or a spill-heavy workload |
| Everything slow at the same times each day | A backup, snapshot or antivirus scan overlapping production |
| Latency spikes with storage retry events in the system log | A failing device or a saturated fabric |
| Autogrowth events at the same moment | File growth stalling writes, often without instant file initialization |
| High latency on a virtual machine, host looks idle | Ballooning or CPU contention at the host, seen inside the guest as I/O |
The four messages and what each one is telling you
| Error | Published message | Layer |
|---|---|---|
| 833 | SQL Server has encountered N occurrence(s) of I/O requests taking longer than 15 seconds to complete on file… | The file, from the storage engine |
| 845 | Time-out occurred while waiting for buffer latch type N for page…, database ID N | The buffer pool waiting on a page |
| 17883 | Worker appears to be non-yielding on Scheduler… | The scheduler monitor, on one worker |
| 17884 | New queries assigned to process on Node N haven’t been picked up by a worker thread in the last N seconds | The scheduler monitor, on a whole node |
Microsoft’s guidance on 845 includes a line worth repeating: if the errors are infrequent, they can generally be ignored. It is repetition and clustering that make these worth an incident, not a single entry after a busy night.
Configuration options Microsoft names for 845
- Priority boost – leave it off.
- Lightweight pooling, the fibre mode option – leave it off.
- Set working set size – leave it off.
- Autoshrink – off, so the database is not repeatedly resizing itself.
- Autogrow – configured with large increments so growth happens rarely.
- Compressed volumes – unsupported for data and log files; move them.
Instant file initialization, and its one trade-off
Granting the Database Engine service account the Perform volume maintenance tasks right lets data file creation, growth, resize and restore skip the zeroing pass. The documented trade-off is that deleted disk content is overwritten only as new data is written, so until it is, that content is potentially readable by anyone who can get at the file – which in practice means detached files, backups without restrictive permissions, and storage handed back to a shared array. Microsoft’s own position is that the benefits usually outweigh the risk; the mitigation is restrictive permissions on detached files and backups. Note also that transparent data encryption prevents instant file initialization for data files.
What to do once the storage is stable again
Persistent I/O stalls can leave torn or damaged pages behind. When the storage is healthy again, run DBCC CHECKDB on the affected databases and confirm your most recent backups restore cleanly on another server before you treat the incident as closed.
Reading the scheduler messages
17883 carries kernel time, user time, process utilisation and system idle. Microsoft’s own reading of those numbers is worth borrowing: user mode climbing fast points at a loop inside the engine, kernel mode climbing fast points at the operating system, and both flat with process utilisation high points at preemptive work such as garbage collection. Low process utilisation and low system idle together mean SQL Server is not getting enough CPU at all, which is a host-level problem rather than a storage one.
When a licence is the actual fix
Fix the storage first; a licence does not make a slow disk fast, and nothing in Microsoft’s guidance for 833 involves buying anything. There is one narrow case where an edition change genuinely reduces the load on the storage path. SQL Server Standard has a published ceiling on the buffer pool – for SQL Server 2025 it is 256 GB per instance, alongside 32 GB for the columnstore segment cache and 32 GB of memory-optimized data per database – while Enterprise is limited only by the operating system. Where the working set is far larger than that ceiling, the buffer pool cannot hold enough data, ordinary queries generate far more physical reads than they should, and a storage path that would otherwise cope is pushed past its limit. Lifting the ceiling reduces read volume, not latency, so treat it as a second step once the storage measurements are clean. Arco supplies SQL Server 2025 Enterprise licences and will tell you when the measured numbers do not justify one.
Every code this article covers
| Code | What it points at | Source |
|---|---|---|
833 |
SQL Server has encountered occurrences of I/O requests taking longer than 15 seconds to complete on a named file. Informational, and a symptom of the I/O path | Microsoft Learn |
845 |
Time-out occurred while waiting for a buffer latch on a page, usually because the I/O behind it took too long | Microsoft Learn |
17883 |
A worker appears to be non-yielding on a scheduler, reported with kernel and user CPU time, process utilisation and system idle | Microsoft Learn |
17884 |
New queries assigned to a node have not been picked up by a worker thread for some seconds; the scheduler deadlock message | Microsoft Learn |
Confirm the fix worked
- Average stall per file from
sys.dm_io_virtual_file_stats, re-measured after a full business day, has fallen. - No new 833, 845, 17883 or 17884 entries appear in the error log across a peak period.
- The Windows system log shows no storage retry or reset events during the same window.
DBCC CHECKDBon the affected databases reports no errors.- A recent backup has been restored on another server and comes up clean.
Questions people ask about this
Is 833 dangerous or just noisy?
It is informational and the instance keeps running, but requests are stalling for fifteen seconds or more. Treat repeated entries as an incident: the same conditions produce timeouts, failovers and, at worst, damaged pages.
Will adding memory fix it?
It can reduce physical reads and therefore the number of stalls, which is not the same as fixing the storage. It does nothing for log writes, checkpoints or backups, all of which still have to reach the disk.
Should I move tempdb to different storage?
If tempdb is the file named in the entries, yes. Separating it from the data and log path also stops spill-heavy queries interfering with transactional work.
Do I need a bigger edition to fix slow I/O?
No. Microsoft’s documented causes and actions for 833 are hardware, firmware, drivers, filter drivers and workload. An edition change only helps in the narrow case where a capped buffer pool is forcing far more reads than the workload should need.
Can I ignore an occasional 845?
Microsoft says that if 845 errors are infrequent they can generally be ignored. It is clustering and repetition that matter, particularly alongside 833 on the same files.
