Sessions waiting on free buffer waits cannot find a clean buffer in the cache to read a new block into. The buffer cache is full of dirty buffers that DBWn has not yet flushed, so foreground processes that need to read a new block have nowhere to put it.
This is a write-path bottleneck, not a read-path problem. The root cause is DBWn falling behind on writes: either the storage cannot absorb the write rate, or DBWn itself is CPU-starved or process-limited. The fix is on the write side. Throwing a bigger buffer cache at the problem does not help and frequently makes it worse.
free buffer waits is never normal in a healthy system. Even a small sustained count is a yellow flag. The underlying condition (DBWn I/O starvation) escalates quickly under load, so treat any non-trivial occurrence as an incident.
What this means
Every server process that needs to read a block into the cache first walks the LRU list looking for a free (clean, reusable) buffer. When it cannot find one because the cache is full of dirty buffers waiting for DBWn, the session posts DBWn to write and waits. If DBWn cannot catch up, foreground work stalls across the instance.
Distinguish this from two adjacent wait events that look similar but are not the same problem:
buffer busy waits: contention on a specific in-cache block that another session is reading or modifying. Targeted, not global.read by other session: waiting for another session to finish an in-flight I/O on a block. Also targeted.
free buffer waits is a global resource problem. When it appears, the entire buffer cache write-back path is under pressure.
The single most important diagnostic step is to correlate it with db file parallel write, which is DBWn’s own I/O wait event. That correlation tells you where the bottleneck actually lives.
flowchart TD
A[Session scans LRU for free buffer] --> B{Clean buffer found?}
B -- yes --> C[Read block into cache]
B -- no, dirty buffers dominate --> D[Wait on free buffer waits]
D --> E[DBWn must write dirty buffers]
E --> F{db file parallel write high?}
F -- yes --> G[Storage-bound: slow data file writes]
F -- no --> H[DBWn-bound: CPU starvation or too few DBWn]Common causes
| Cause | What it looks like | First thing to check |
|---|---|---|
| Storage write latency on data files | db file parallel write average wait elevated, free buffer waits grows in lockstep | OS-level I/O latency on data file devices (iostat -x 1 5), AVGIOTIM in V$FILESTAT |
| DBWn CPU starvation | db file parallel write is low but DBWn processes show high CPU run queue or are starved by other consumers | CPU utilization and run queue on the DBWn OS processes |
| Single DBWn process insufficient | Multiple CPUs idle, but one DBWn process saturated; DB_WRITER_PROCESSES too low for write workload | DB_WRITER_PROCESSES parameter value and DBWn process count |
| Aggressive checkpoint from FAST_START_MTTR_TARGET | free buffer waits correlates with checkpoint bursts, log file switch (checkpoint incomplete) in alert log | FAST_START_MTTR_TARGET value, checkpoint messages in alert log |
| Buffer cache too small for write working set | DBWn keeps up with sustained writes, but too few clean buffers exist between write cycles | Dirty buffer count vs clean buffer count, write rate relative to cache size |
Quick checks
All of these are read-only.
# Confirm the symptom AND the key correlation in one shot.
# Sample twice, 60s apart, to confirm TOTAL_WAITS is still climbing.
sqlplus / as sysdba <<'EOF'
SELECT EVENT, TOTAL_WAITS, TIME_WAITED_MICRO,
ROUND(TIME_WAITED_MICRO/NULLIF(TOTAL_WAITS,0)/1000, 2) AS avg_ms
FROM V$SYSTEM_EVENT
WHERE EVENT IN ('free buffer waits', 'db file parallel write');
EOF
# Which wait class dominates active sessions right now?
sqlplus / as sysdba <<'EOF'
SELECT NVL(WAIT_CLASS, 'On CPU') AS wait_class, COUNT(*) AS sessions
FROM V$SESSION
WHERE STATUS = 'ACTIVE' AND TYPE = 'USER'
AND (WAIT_CLASS IS NULL OR WAIT_CLASS != 'Idle')
GROUP BY NVL(WAIT_CLASS, 'On CPU')
ORDER BY COUNT(*) DESC;
EOF
# DBWn and checkpoint configuration
sqlplus / as sysdba <<'EOF'
SELECT NAME, VALUE FROM V$PARAMETER
WHERE NAME IN ('db_writer_processes', 'fast_start_mttr_target',
'db_block_size', 'sga_target', 'db_cache_size',
'disk_asynch_io', 'filesystemio_options');
EOF
# OS-level: is the data file storage saturated?
iostat -x 1 5
# Per-datafile write latency, worst first
sqlplus / as sysdba <<'EOF'
SELECT f.FILE#, d.NAME, f.PHYWRTS, f.AVGIOTIM
FROM V$FILESTAT f JOIN V$DATAFILE d ON f.FILE# = d.FILE#
ORDER BY f.AVGIOTIM DESC;
EOF
# Checkpoint-related waits in the same window
sqlplus / as sysdba <<'EOF'
SELECT EVENT, TOTAL_WAITS, TIME_WAITED_MICRO
FROM V$SYSTEM_EVENT WHERE EVENT LIKE 'log file switch%';
EOF
# Rule out buffer busy waits (targeted block contention, not global)
sqlplus / as sysdba <<'EOF'
SELECT * FROM V$WAITSTAT ORDER BY COUNT DESC;
EOF
How to diagnose it
Confirm
free buffer waitsis actually accumulating, not a long-stale counter. SampleV$SYSTEM_EVENTtwice, 60 seconds apart, and confirm TOTAL_WAITS is increasing.Pull
db file parallel writein the same window. This is the most important correlative signal:- If
db file parallel writeaverage wait is elevated, the problem is on the storage side. Move to OS-level I/O latency checks and per-datafile write latency. - If
db file parallel writeis low, the problem is DBWn itself: CPU starvation, too few DBWn processes, or a scheduling issue.
- If
Check the alert log for
Checkpoint not completeandlog file switch (checkpoint incomplete)entries in the same time window. If they cluster with thefree buffer waitsincrease, the checkpoint path is the trigger.Verify
DB_WRITER_PROCESSES. On a busy write workload with multiple CPUs available, too few DBWn processes can be the bottleneck. The default targets roughly one DBWn per eight CPUs.Check
FAST_START_MTTR_TARGET. A very low target forces DBWn to write aggressively, which can backfire under load by competing with foreground I/O. A high target lets dirty buffers accumulate before checkpointing kicks in.Confirm you are not confusing this with
buffer busy waitsorread by other session. QueryV$WAITSTATto see whether contention is on specific block classes, which points tobuffer busy waits, notfree buffer waits.Look for correlated workload changes: a new batch job, a bulk DML window, or a stats gather that changed a plan toward more writes.
free buffer waitsrarely appears in a steady-state system without a workload shift.
Metrics and signals to monitor
| Signal | Why it matters | Warning sign |
|---|---|---|
free buffer waits in V$SYSTEM_EVENT | The primary symptom. Never normal in a healthy system. | Sustained non-trivial count; above 0.1% of total waits |
db file parallel write average wait | DBWn’s own I/O wait. Determines whether the bottleneck is storage or DBWn itself. | Average wait trending up in lockstep with free buffer waits |
log file switch (checkpoint incomplete) waits | Checkpoints are not keeping up, which pressures DBWn. | Sustained occurrence alongside free buffer waits |
| Per-datafile AVGIOTIM from V$FILESTAT | Identifies hotspot datafiles with slow write latency. | AVGIOTIM above 10ms (SSD) or 20ms (SAN) on write-heavy files |
| OS write latency on data file devices (iostat await) | Independent confirmation of storage-side write latency. | await climbing while %util climbs on data file devices |
| DBWn process CPU utilization | Reveals whether DBWn is CPU-starved despite idle I/O. | DBWn at 100% on one CPU while other CPUs idle |
| Redo generation rate and physical write rate | Tracks the write workload DBWn must keep up with. | Sudden increase correlated with free buffer waits onset |
Checkpoint not complete in alert log | Direct evidence that checkpoint pressure is the trigger. | More than a few per hour on a busy system |
Fixes
If DBWn is storage-bound (db file parallel write is high)
The data file storage cannot absorb DBWn’s write rate. Increasing the buffer cache will not help and will accumulate more dirty buffers before the same stall recurs.
- Identify hotspot datafiles. Use
V$FILESTAT.AVGIOTIMand OS-leveliostat -xto find the worst offenders. Move them to faster or less-contended storage. - Separate redo logs from data files. Redo and data file I/O contend badly when sharing physical storage. This is a common hidden cause of write-path stalls.
- Review filesystem mount options.
data=journalon ext4 or improperly tuned ZFS adds write latency. Oracle data files perform best ondata=writebackor raw ASM. - Verify async I/O is enabled and functional. Check
DISK_ASYNCH_IO(should be TRUE) andFILESYSTEMIO_OPTIONS(SETALL or ASYNCH for filesystem-backed files). Without async I/O, DBWn serializes on every write, which shows up directly as elevateddb file parallel writetime. - Short-term pressure relief. Defer non-critical batch loads, or adjust
FAST_START_MTTR_TARGETupward to spread checkpoint writes across a longer window.
If DBWn is CPU-bound or process-limited (db file parallel write is low)
DBWn has I/O headroom but cannot schedule or submit writes fast enough. This points to CPU starvation, too few DBWn processes, or a kernel-side scheduling issue.
- Increase DB_WRITER_PROCESSES. On write-heavy systems with many CPU cores, additional DBWn processes parallelize the write path. The default targets roughly one DBWn per eight CPUs. This parameter requires an instance restart to change.
- Check for CPU contention from other consumers. Parallel query slaves, RMAN, and stats gathering can starve DBWn of CPU cycles. Moving those workloads off-peak or isolating DBWn’s CPU budget can relieve contention.
- On VMware, check CPU ready time. vCPU scheduling latency can make DBWn appear CPU-bound when the real constraint is hypervisor scheduling. Check
esxtopor vCenter performance stats.
If checkpoint pressure is the trigger
free buffer waits that cluster with Checkpoint not complete or log file switch (checkpoint incomplete) indicate the checkpoint path is forcing DBWn into bursty write storms.
- Increase online redo log size and add redo log groups. This gives DBWn more time to flush between log switches and reduces checkpoint bursts. It buys time but does not fix a slow storage subsystem.
- Review FAST_START_MTTR_TARGET. A very low target forces aggressive DBWn writes that compete with foreground I/O. A high target lets dirty buffers accumulate. Tune toward a value consistent with your recovery SLA, not the absolute minimum.
- Check redo log switch frequency. Switches more than once per minute almost guarantee checkpoint pressure on a busy system. Aim for switches no more than every 10 to 15 minutes at peak redo generation.
What does not help
- Increasing the buffer cache. If DBWn cannot write fast enough, a larger cache just means more dirty buffers pile up before the same stall recurs. Confirm the write path is healthy first.
- Forcing a checkpoint.
ALTER SYSTEM CHECKPOINTcreates exactly the write burst you are trying to avoid.ALTER SYSTEM FLUSH BUFFER_CACHEexists but is undocumented, unsupported for tuning, and forces every buffer dirty or clean through the same path. - Adding SGA memory without verifying hugepages. Without hugepages, larger SGAs add page table overhead that can itself pressure CPU and memory.
Prevention
- Monitor
free buffer waitsanddb file parallel writeas a paired signal. Alert on any non-trivialfree buffer waitscount, and usedb file parallel writeaverage wait as the immediate triage input. - Track per-datafile write latency over time. Slow drift on a specific datafile often precedes an acute incident.
- Size redo logs conservatively. Keep switch frequency under one every 10 to 15 minutes at peak redo generation. Frequent switches create checkpoint pressure that propagates to DBWn.
- Verify DB_WRITER_PROCESSES after hardware changes. Ensure the value is appropriate for the host CPU count and write workload after any migration or resize.
- Keep redo logs on dedicated storage. The redo and data file I/O paths have different latency profiles and contend badly when shared.
- Include a write-path health check in your runbook. A small INSERT plus COMMIT into a health check table exercises DBWn and LGWR end to end. A read-only check will not surface write-path stalls.
How Netdata helps
Netdata surfaces the signals that disambiguate a free buffer waits incident at per-second resolution:
free buffer waitsanddb file parallel writecollected together, so you can see at a glance whether DBWn is storage-bound or CPU-bound without running two queries and mentally joining them.- OS-level disk latency (iostat-equivalent metrics) on the same dashboard as Oracle wait events, so storage-side and database-side signals sit next to each other during triage.
- Per-process CPU utilization (including the DBWn processes) to make a CPU-starved DBWn visible without manual
psandtopcross-referencing. - ML anomaly detection that flags the onset of
free buffer waitseven when the absolute count is still small, because this signal is never normal in a healthy system.
Netdata’s Oracle Database monitoring with Netdata brings these signals together with per-second metrics and ML anomaly detection.
Related guides
- How Oracle Database actually works in production: a mental model for operators
- Oracle archive log destination full: V$ARCHIVE_DEST_STATUS, the ERROR state, and space
- Oracle autoextend hit MAXSIZE: the space gotcha with a half-empty filesystem
- Oracle blocking sessions: finding the blocker at the head of the chain
- Oracle ‘Thread N cannot allocate new log’: the archive hang that masquerades as up
- Oracle ‘Checkpoint not complete’: redo log sizing, DBWn, and log-switch stalls
- Oracle ‘cursor: pin S wait on X’: mutex contention on hot cursors
- Oracle ‘db file scattered read’: multiblock reads, full scans, and plan regressions
- Oracle ’enq: TM - contention’: unindexed foreign keys and table-level locks
- Oracle ’enq: TX - row lock contention’: blocking sessions and uncommitted DML
- Oracle Fast Recovery Area full: db_recovery_file_dest_size, reclaimable space, and DELETE OBSOLETE
- Oracle hard parse storm: literal SQL, bind variables, and shared pool churn






