DBAtlas · Atlas für Datenbankbetrieb

Checkpoint-Verhalten prüfen (ab PG17 pg_stat_checkpointer, PG16 und früher pg_stat_bgwriter)

PostgreSQLParameter

Befehl

-- PG17+
SELECT num_timed,
       num_requested,
       round(100.0 * num_requested / NULLIF(num_timed + num_requested, 0), 1) AS req_pct,
       restartpoints_timed,
       restartpoints_req,
       round((write_time / 1000)::numeric / NULLIF(num_timed + num_requested, 0), 1) AS avg_write_s,
       round((sync_time / 1000)::numeric / NULLIF(num_timed + num_requested, 0), 1) AS avg_sync_s,
       pg_size_pretty(buffers_written * current_setting('block_size')::bigint) AS written_by_checkpoint,
       stats_reset
FROM pg_stat_checkpointer;

-- PG16 and earlier
SELECT checkpoints_timed,
       checkpoints_req,
       round(100.0 * checkpoints_req / NULLIF(checkpoints_timed + checkpoints_req, 0), 1) AS req_pct,
       round((checkpoint_write_time / 1000)::numeric / NULLIF(checkpoints_timed + checkpoints_req, 0), 1) AS avg_write_s,
       round((checkpoint_sync_time / 1000)::numeric / NULLIF(checkpoints_timed + checkpoints_req, 0), 1) AS avg_sync_s,
       pg_size_pretty(buffers_checkpoint * current_setting('block_size')::bigint) AS written_by_checkpoint,
       pg_size_pretty(buffers_clean * current_setting('block_size')::bigint) AS written_by_bgwriter,
       pg_size_pretty(buffers_backend * current_setting('block_size')::bigint) AS written_by_backends,
       maxwritten_clean,
       stats_reset
FROM pg_stat_bgwriter;

-- Related settings
SELECT name, current_setting(name) AS value
FROM pg_settings
WHERE name IN ('checkpoint_timeout', 'max_wal_size', 'min_wal_size',
               'checkpoint_completion_target', 'log_checkpoints')
ORDER BY name;

Was es tut

Zeigt das Verhältnis geplanter Checkpoints zu durch WAL-Volumen erzwungenen, die durchschnittliche Schreib-/Sync-Zeit je Checkpoint und das Volumen geschriebener Buffers (in PG16 und früher zusammen mit Schreibvorgängen von bgwriter und Backends).

Wann einsetzen

Wenn schreibintensive Phasen I/O-Spitzen zeigen, die WAL-Erzeugung hoch ist oder das Log 'checkpoints are occurring too frequently' meldet.

Vorsicht

Ein hoher req_pct (typisch über 10-20 %) bedeutet, dass Checkpoints erzwungen werden, weil max_wal_size vollläuft; erhöhe max_wal_size und achte mit log_checkpoints = on auf Zeilen 'checkpoint starting: wal'. Ein längeres checkpoint_timeout verteilt I/O, verlängert aber die Crash Recovery. In PG16 und früher bedeutet ein hoher written_by_backends, dass Backends Dirty Pages selbst schreiben müssen (shared_buffers/bgwriter unzureichend); in PG17 steht das in pg_stat_io. Durchschnitte zählen auch geplante Checkpoints mit, die mangels Arbeit übersprungen wurden, daher als grobe Werte lesen. Die Zähler sind seit stats_reset kumuliert.

In DBAtlas öffnen →

Verwandte Einträge