Quick Answer
DISKIO_SUSPEND occurs when user processes wait for file access while Volume Shadow Copy Service (VSS) or external backup tools hold filesystem locks. This wait type signals interference between production workload and backup operations, becoming problematic when counts exceed 5 per user process or persist beyond backup windows.
Root Cause Analysis
DISKIO_SUSPEND manifests when SQL Server's I/O completion port mechanism encounters filesystem-level blocks initiated by VSS snapshots or third-party backup tools. The Windows I/O subsystem queues these requests in the kernel's I/O manager while VSS writers coordinate with the filesystem filter driver to create consistent snapshots.
SQL Server's scheduler threads submit I/O requests through the Windows overlapped I/O model, but VSS temporarily freezes write operations to ensure transactional consistency during snapshot creation. The SQLOS layer reports DISKIO_SUSPEND when these I/O requests remain queued beyond normal completion thresholds, typically 15-30 seconds depending on the operation type.
Buffer pool manager experiences secondary effects as dirty page flushes accumulate in the lazy writer and checkpoint queues. The lock manager may escalate shared locks to exclusive locks on heavily modified pages, compounding the suspension duration. Log writer threads face similar delays when transaction log backups trigger VSS operations on log file paths.
SQL Server 2019 introduced enhanced VSS integration with auto-recovery capabilities, reducing average suspension times compared to 2016. SQL Server 2022 further optimized buffer pool flushing during VSS operations through improved coordination with the Windows Storage Stack.
Third-party backup solutions using VSS without proper SQL Server integration generate longer suspension periods because they lack awareness of SQL Server's internal checkpoint and log flush cycles. Agent-based backups that coordinate directly with SQL Server through VDI (Virtual Device Interface) typically generate minimal DISKIO_SUSPEND waits.
AutoDBA checks Backup operation timing, VSS configuration conflicts, and I/O subsystem coordination issues across your entire SQL Server instance in 60 seconds. Download the free diagnostic script and see what else needs attention.
Diagnostic Queries
-- Current DISKIO_SUSPEND wait statistics and affected sessions
SELECT
s.session_id,
s.status,
r.wait_type,
r.wait_time_ms,
r.wait_resource,
s.program_name,
s.host_name,
t.text
FROM sys.dm_exec_sessions s
INNER JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.wait_type = 'DISKIO_SUSPEND'
ORDER BY r.wait_time_ms DESC;
-- Historical DISKIO_SUSPEND frequency and duration trends
SELECT
wait_type,
waiting_tasks_count,
wait_time_ms,
max_wait_time_ms,
signal_wait_time_ms,
wait_time_ms / NULLIF(waiting_tasks_count, 0) as avg_wait_ms
FROM sys.dm_os_wait_stats
WHERE wait_type = 'DISKIO_SUSPEND'
AND waiting_tasks_count > 0;
-- Active VSS operations and backup processes correlation
SELECT
p.spid,
p.cmd,
p.status,
p.blocked,
p.waittype,
p.waittime,
p.physical_io,
p.cpu,
OBJECT_NAME(p.objid) as object_name
FROM sys.sysprocesses p
WHERE p.program_name LIKE '%backup%'
OR p.program_name LIKE '%VSS%'
ORDER BY p.waittime DESC;
-- I/O file stats during backup operations
SELECT
mf.name,
mf.physical_name,
mf.type_desc,
fs.num_of_reads,
fs.num_of_writes,
fs.io_stall_read_ms,
fs.io_stall_write_ms,
fs.io_stall / NULLIF((fs.num_of_reads + fs.num_of_writes), 0) as avg_io_stall_ms
FROM sys.master_files mf
INNER JOIN sys.dm_io_virtual_file_stats(NULL, NULL) fs
ON mf.database_id = fs.database_id
AND mf.file_id = fs.file_id
WHERE fs.io_stall_write_ms > 1000
ORDER BY fs.io_stall_write_ms DESC;
-- Buffer pool pressure during DISKIO_SUSPEND events
SELECT
counter_name,
cntr_value,
cntr_type
FROM sys.dm_os_performance_counters
WHERE object_name = 'SQLServer:Buffer Manager'
AND counter_name IN (
'Page life expectancy',
'Lazy writes/sec',
'Checkpoint pages/sec',
'Free list stalls/sec'
);
Fix Scripts
Increase VSS timeout thresholds for backup operations
-- Extend VSS writer timeout to accommodate longer backup operations
-- WARNING: Test in development, affects system-wide VSS behavior
-- NOTE: Verify the exact registry path for your Windows/SQL Server version before applying
EXEC xp_cmdshell 'reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS\Settings" /v BackupTimeout /t REG_DWORD /d 7200 /f';
-- Restart SQL Server service required for changes to take effect
-- Default is 1800 seconds (30 minutes), increasing to 7200 seconds (2 hours)
Optimize checkpoint frequency during backup windows
-- Reduce checkpoint interval to minimize dirty pages during backups
-- Execute before backup operations begin
ALTER DATABASE [YourDatabase] SET TARGET_RECOVERY_TIME = 60 SECONDS;
-- Force immediate checkpoint to clear buffer pool before backup
CHECKPOINT;
-- Monitor checkpoint effectiveness
SELECT
name,
target_recovery_time_in_seconds,
is_auto_create_stats_on
FROM sys.databases
WHERE name = 'YourDatabase';
Configure backup compression and buffer count optimization
-- Optimize native SQL Server backup to reduce VSS suspension time
-- Adjust BUFFERCOUNT and BLOCKSIZE based on storage subsystem
BACKUP DATABASE [YourDatabase]
TO DISK = 'C:\Backup\YourDatabase.bak'
WITH
COMPRESSION,
BUFFERCOUNT = 50, -- Increase for faster I/O throughput
BLOCKSIZE = 65536, -- Optimize for storage alignment
CHECKSUM,
STATS = 10,
INIT;
-- Test buffer count values between 20-100 based on storage performance
-- Monitor backup duration and DISKIO_SUSPEND wait reduction
Implement backup scheduling coordination
-- Create job step to check for active DISKIO_SUSPEND waits before backup
-- Insert at beginning of backup job steps
IF EXISTS (
SELECT 1
FROM sys.dm_exec_requests
WHERE wait_type = 'DISKIO_SUSPEND'
AND wait_time_ms > 30000
)
BEGIN
PRINT 'DISKIO_SUSPEND detected, delaying backup start';
WAITFOR DELAY '00:05:00'; -- Wait 5 minutes before proceeding
END
-- Verify no competing backup operations
IF EXISTS (
SELECT 1
FROM sys.dm_exec_sessions s
INNER JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
WHERE s.program_name LIKE '%backup%'
)
BEGIN
RAISERROR('Competing backup operation detected', 16, 1);
RETURN;
END
AutoDBA generates fix scripts like these automatically, with impact estimates and rollback SQL included.
Prevention
Configure backup operations outside peak transaction periods using SQL Server Agent job scheduling with appropriate priority levels. Implement backup compression and optimize BUFFERCOUNT parameters based on storage subsystem capabilities, typically 20-50 buffers for SAN environments and 50-100 for local NVMe storage.
Coordinate third-party backup tools with SQL Server maintenance windows using VSS writer timeout extensions and proper backup sequence orchestration. Deploy backup solutions that support SQL Server VDI integration rather than filesystem-level VSS snapshots when possible.
Monitor DISKIO_SUSPEND wait statistics through automated alerts when waiting_tasks_count exceeds 5 per user process or max_wait_time_ms exceeds 60000 milliseconds. Establish baseline measurements during non-backup periods to identify anomalous suspension patterns.
Configure TARGET_RECOVERY_TIME to 60-120 seconds on user databases to reduce checkpoint-related I/O bursts during backup operations. Separate backup target storage from production data file storage to minimize I/O contention at the storage controller level.
Implement backup rotation strategies that minimize overlapping VSS operations across multiple databases. Stagger database backup schedules by 15-30 minute intervals to prevent simultaneous VSS writer coordination conflicts.
Need hands-on help?
Dealing with persistent diskio_suspend issues across your environment? Samix Technology provides hands-on SQL Server performance consulting with 15+ years of production DBA experience.