Revisar o comportamento dos checkpoints (PG17+ pg_stat_checkpointer, PG16 e anteriores pg_stat_bgwriter)
PostgreSQLParâmetrosComando
-- 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;O que faz
Mostra a proporção entre checkpoints agendados e checkpoints forçados pelo volume de WAL, o tempo médio de write/sync por checkpoint e o volume de buffers gravados (no PG16 e anteriores, junto com as gravações do bgwriter e dos backends).
Quando usar
Quando períodos com muitas gravações mostram picos de I/O, a geração de WAL é alta ou o log avisa 'checkpoints are occurring too frequently'.
Atenção
Um req_pct alto (tipicamente acima de 10-20%) significa que os checkpoints são forçados porque o max_wal_size enche; aumente o max_wal_size e observe as linhas 'checkpoint starting: wal' com log_checkpoints = on. Um checkpoint_timeout maior distribui o I/O, mas alonga a crash recovery. No PG16 e anteriores, um written_by_backends alto significa que os backends precisam gravar eles mesmos as páginas sujas (shared_buffers/bgwriter insuficientes); no PG17 isso está em pg_stat_io. As médias também contam checkpoints agendados pulados por falta de trabalho, então leia-as como valores aproximados. Os contadores são cumulativos desde stats_reset.