DBAtlas · Atlas de operaciones de bases de datos

Revisar el comportamiento de los checkpoints (PG17+ pg_stat_checkpointer, PG16 y anteriores pg_stat_bgwriter)

PostgreSQLParámetros

Comando

-- 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;

Qué hace

Muestra la proporción entre los checkpoints programados y los forzados por el volumen de WAL, el tiempo medio de escritura/sync por checkpoint y el volumen de buffers escritos (en PG16 y anteriores, junto con las escrituras de bgwriter y de los backends).

Cuándo usarlo

Cuando los periodos de mucha escritura muestran picos de I/O, la generación de WAL es alta o el log advierte 'checkpoints are occurring too frequently'.

Precaución

Un req_pct alto (normalmente por encima del 10-20%) significa que los checkpoints se fuerzan porque se llena max_wal_size; aumente max_wal_size y vigile las líneas 'checkpoint starting: wal' con log_checkpoints = on. Un checkpoint_timeout más largo reparte la I/O pero alarga la crash recovery. En PG16 y anteriores, un written_by_backends alto significa que los backends tienen que escribir ellos mismos las páginas sucias (shared_buffers/bgwriter insuficientes); en PG17 esto está en pg_stat_io. Los promedios también cuentan los checkpoints programados omitidos por falta de trabajo, así que léalos como cifras aproximadas. Los contadores son acumulados desde stats_reset.

Abrir en DBAtlas →

Relacionado