SLEEP_BPOOL_FLUSH is recorded when the checkpoint process deliberately pauses issuing new writes because it detects it is saturating the I/O subsystem (around 20ms average write latency during normal operation, 100ms during shutdown). Checkpoint backs off for a few milliseconds, lets in-flight writes land, then resumes.
It is self-throttling by design: checkpoint being a considerate neighbour so your workload’s I/O still gets through.
Is It a Problem?
Normally no; it is one of the standard benign waits and worth filtering out of analysis. The checkpoint writes themselves show up under ASYNC_IO_COMPLETION, not here, so this wait is literally the pauses between them.
Two situations make it worth a second look. First, if it is large and constant, checkpoint is spending a lot of time backing off, which tells you the disk subsystem has little headroom, useful context even though the wait itself is harmless. Second, a blocked checkpoint can park here: the classic example is starting a backup (which triggers a checkpoint) while TDE encryption is in progress on the database.
Common Causes
- Normal checkpoint pacing on a system with modest I/O headroom.
- Indirect vs automatic checkpoint behaviour differences after changing
TARGET_RECOVERY_TIME. - A checkpoint blocked behind a conflicting operation, such as an in-flight TDE encryption scan.
What To Do
- Filter it out of routine wait analysis; our
Get-WaitStatisticsscript already treats it as noise. - If it is unusually dominant, measure data-file write latency in
sys.dm_io_virtual_file_stats. Persistent 20ms+ write stalls mean checkpoint is throttling because your storage is at capacity. - If a specific operation hangs (a backup that never starts), check for TDE scans or other checkpoint blockers before blaming the backup itself.
- Consider indirect checkpoints (
TARGET_RECOVERY_TIME), which smooth write bursts into a steadier stream, the default from SQL Server 2016 onward for new databases.
How To See It
Rank waits with Get-WaitStatistics; expect this one filtered. Its diagnostic value is as a storage-headroom hint, not as a bottleneck.
Part of the SQL Server Wait Types Library.
Related deep dive: IO_COMPLETION Wait Type.
Leave a Reply