# Timeout waits

> Deliberate sleeps, retry intervals, throttles, and rate-limiting delays.
---

`Timeout` usually means PostgreSQL intentionally delayed work until a timer expires. The important question is not “why is the kernel slow?” but “which policy or safety mechanism inserted this delay?”

## Identify the policy owner {#how-to-read}

Vacuum cost delay, recovery delay, backup throttling, checkpoint spreading, retry intervals, and `pg_sleep()` are designed waits. They become a problem when the policy no longer matches the service objective or when another bottleneck makes the delay recur excessively.

- **Normal:** the configured policy is active and useful work advances at the expected rate.
- **Watch:** foreground latency includes a deliberate sleep, or maintenance falls behind while spending much of its time throttled.
- **Urgent:** recovery/backup/checkpoint deadlines are missed, a spin delay persists, or an operator did not intend the policy.

## Events to recognize {#top-events}

| Event | Policy |
| --- | --- |
| [VacuumDelay](vacuum-delay/) | Cost-based vacuum throttling |
| [CheckpointWriteDelay](checkpoint-write-delay/) | Spreading checkpoint writes across the interval |
| [RecoveryApplyDelay](recovery-apply-delay/) | Intentional delayed standby replay |
| [RecoveryRetrieveRetryInterval](recovery-retrieve-retry-interval/) | Retrying unavailable WAL sources |
| [BaseBackupThrottle](base-backup-throttle/) | Backup transfer-rate limit |
| [PgSleep](pg-sleep/) | SQL or internal sleep function |
| [SpinDelay](spin-delay/) | Backoff while acquiring a contended spinlock |

## Common misreads {#misreads}

- `Timeout` does not mean a statement or lock timeout fired; it means the process is currently sleeping on a timer.
- Reducing vacuum delay can recover maintenance throughput but also increase I/O and CPU pressure.
- `RecoveryApplyDelay` can be intentional disaster-recovery policy.
- Persistent `SpinDelay` deserves escalation: a spinlock should normally be held for an extremely short time.

---

Section pages:

- [Timeout: BaseBackupThrottle](/timeout/base-backup-throttle/): Waiting during base backup when throttling activity
- [Timeout: CheckpointWriteDelay](/timeout/checkpoint-write-delay/): Waiting between writes while performing a checkpoint
- [Timeout: PgSleep](/timeout/pg-sleep/): Waiting due to a call to pg_sleep or a sibling function
- [Timeout: RecoveryApplyDelay](/timeout/recovery-apply-delay/): Waiting to apply WAL during recovery because of a delay setting
- [Timeout: RecoveryRetrieveRetryInterval](/timeout/recovery-retrieve-retry-interval/): Waiting during recovery when WAL data is not available from any source (pg_wal, archive or stream)
- [Timeout: RegisterSyncRequest](/timeout/register-sync-request/): Waiting while sending synchronization requests to the checkpointer, because the request queue is full
- [Timeout: SpinDelay](/timeout/spin-delay/): Waiting while acquiring a contended spinlock
- [Timeout: VacuumDelay](/timeout/vacuum-delay/): Waiting in a cost-based vacuum delay point
- [Timeout: VacuumTruncate](/timeout/vacuum-truncate/): Waiting to acquire an exclusive lock to truncate off any empty pages at the end of a table vacuumed
- [Timeout: WalSummarizerError](/timeout/wal-summarizer-error/): Waiting after a WAL summarizer error
