DBAtlas · Атлас эксплуатации баз данных

Проверить поведение checkpoint (PG17+ pg_stat_checkpointer, PG16 и ранее pg_stat_bgwriter)

PostgreSQLПараметры

Команда

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

Что делает

Показывает соотношение плановых checkpoint и checkpoint, вынужденных объёмом WAL, среднее время записи/синхронизации на checkpoint и объём записанных буферов (в PG16 и ранее — вместе с записью bgwriter и backend).

Когда использовать

Когда в периоды интенсивной записи наблюдаются всплески I/O, генерация WAL высока или журнал предупреждает 'checkpoints are occurring too frequently'.

Внимание

Высокий req_pct (обычно выше 10-20%) означает, что checkpoint вынуждены, потому что заполняется max_wal_size; увеличьте max_wal_size и следите за строками 'checkpoint starting: wal' при log_checkpoints = on. Более длинный checkpoint_timeout распределяет I/O, но удлиняет crash recovery. В PG16 и ранее высокий written_by_backends означает, что backend сами вынуждены записывать грязные страницы (недостаточно shared_buffers/bgwriter); в PG17 это видно в pg_stat_io. Средние значения учитывают и плановые checkpoint, пропущенные из-за отсутствия работы, поэтому воспринимайте их как приблизительные. Счётчики накапливаются с момента stats_reset.

Открыть в DBAtlas →

Связанные материалы