Настройка контрольной точки

=> ALTER SYSTEM SET checkpoint_timeout = '30s';
ALTER SYSTEM
=> ALTER SYSTEM SET min_wal_size = '16MB';
ALTER SYSTEM
=> ALTER SYSTEM SET max_wal_size = '16MB';
ALTER SYSTEM
=> SELECT pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)

Нагрузка

Инициализируем таблицы.

=> CREATE DATABASE wal_checkpoint;
CREATE DATABASE
student$ pgbench -i wal_checkpoint
NOTICE:  table "pgbench_history" does not exist, skipping
NOTICE:  table "pgbench_tellers" does not exist, skipping
NOTICE:  table "pgbench_accounts" does not exist, skipping
NOTICE:  table "pgbench_branches" does not exist, skipping
creating tables...
100000 of 100000 tuples (100%) done (elapsed 0.13 s, remaining 0.00 s)
vacuum...
set primary keys...
done.

Сбросим статистику.

=> SELECT pg_stat_reset_shared('bgwriter');
 pg_stat_reset_shared 
----------------------
 
(1 row)

Запускаем pgbench, предварительно запомнив позицию в журнале.

=> SELECT pg_current_wal_insert_lsn();
 pg_current_wal_insert_lsn 
---------------------------
 0/2D0B6BF8
(1 row)

student$ pgbench -T 180 -R 100 wal_checkpoint
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
duration: 180 s
number of transactions actually processed: 17838
latency average = 2.358 ms
latency stddev = 1.637 ms
rate limit schedule lag: avg 0.526 (max 41.345) ms
tps = 99.112160 (including connections establishing)
tps = 99.113887 (excluding connections establishing)
=> SELECT pg_current_wal_insert_lsn();
 pg_current_wal_insert_lsn 
---------------------------
 0/327F3210
(1 row)

=> SELECT pg_size_pretty('0/327F3210'::pg_lsn - '0/2D0B6BF8'::pg_lsn);
 pg_size_pretty 
----------------
 87 MB
(1 row)

Статистика:

=> SELECT checkpoints_timed, checkpoints_req FROM pg_stat_bgwriter;
 checkpoints_timed | checkpoints_req 
-------------------+-----------------
                 3 |               5
(1 row)

Несмотря на то, что в среднем объем журнальных записей за контрольную точку не превосходит установленного предела, часть контрольных точек выполнялась не по расписанию. Это говорит о неравномерности потока журнальных записей (вызванной выполнением автоочистки и другими причинами).

Поэтому в реальной системе замеры лучше выполнять на достаточно больших интервалах времени.

Возвращаем настройки по умолчанию

=> ALTER SYSTEM RESET ALL;
ALTER SYSTEM
=> SELECT pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)