Подготовка

=> CREATE DATABASE wal_tuning;
CREATE DATABASE
student$ pgbench -i wal_tuning
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.

Full page writes = on

=> SHOW full_page_writes;
 full_page_writes 
------------------
 on
(1 row)

=> CHECKPOINT;
CHECKPOINT

Запускаем тест на 15 секунд.

=> SELECT pg_current_wal_insert_lsn();
 pg_current_wal_insert_lsn 
---------------------------
 0/33429A54
(1 row)

student$ pgbench -T 15 wal_tuning
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: 15 s
number of transactions actually processed: 14047
latency average = 1.068 ms
tps = 936.419516 (including connections establishing)
tps = 936.590413 (excluding connections establishing)
=> SELECT pg_current_wal_insert_lsn();
 pg_current_wal_insert_lsn 
---------------------------
 0/347BC290
(1 row)

Размер журнальных записей:

=> SELECT pg_size_pretty('0/347BC290'::pg_lsn - '0/33429A54'::pg_lsn);
 pg_size_pretty 
----------------
 20 MB
(1 row)

Full page writes = off

=> ALTER SYSTEM SET full_page_writes = off;
ALTER SYSTEM
=> SELECT pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)

=> CHECKPOINT;
CHECKPOINT

Запускаем тест на 15 секунд.

=> SELECT pg_current_wal_insert_lsn();
 pg_current_wal_insert_lsn 
---------------------------
 0/347BC348
(1 row)

student$ pgbench -T 15 wal_tuning
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: 15 s
number of transactions actually processed: 14039
latency average = 1.068 ms
tps = 935.919149 (including connections establishing)
tps = 936.039184 (excluding connections establishing)
=> SELECT pg_current_wal_insert_lsn();
 pg_current_wal_insert_lsn 
---------------------------
 0/35A677C0
(1 row)

Размер журнальных записей:

=> SELECT pg_size_pretty('0/35A677C0'::pg_lsn - '0/347BC348'::pg_lsn);
 pg_size_pretty 
----------------
 19 MB
(1 row)

Размер уменьшился, но не так существенно, как можно было бы ожидать.

Причина в том, что кластер инициализирован с контрольными суммами в страницах данных:

=> SHOW data_checksums;
 data_checksums 
----------------
 on
(1 row)

При этом, несмотря на то, что full_page_writes выключен, в журнал все равно записываются полные образы страниц при изменении битов подсказок. Эти данные и составляют большую часть всего объема:

postgres$ pg_waldump --stats -p /usr/local/pgsql/data/pg_wal -s '0/347BC348' -e '0/35A677C0'
Type                                           N      (%)          Record size      (%)             FPI size      (%)        Combined size      (%)
----                                           -      ---          -----------      ---             --------      ---        -------------      ---
XLOG                                        1719 (  2,00)                84231 (  1,50)             13840388 (100,00)             13924619 ( 71,62)
Transaction                                14040 ( 16,30)               477440 (  8,52)                    0 (  0,00)               477440 (  2,46)
Storage                                        1 (  0,00)                   42 (  0,00)                    0 (  0,00)                   42 (  0,00)
CLOG                                           1 (  0,00)                   30 (  0,00)                    0 (  0,00)                   30 (  0,00)
Database                                       0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
Tablespace                                     0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
MultiXact                                      0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
RelMap                                         0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
Standby                                        4 (  0,00)                  276 (  0,00)                    0 (  0,00)                  276 (  0,00)
Heap2                                      14189 ( 16,48)               886699 ( 15,83)                    0 (  0,00)               886699 (  4,56)
Heap                                       56159 ( 65,21)              4153565 ( 74,14)                    0 (  0,00)              4153565 ( 21,36)
Btree                                          5 (  0,01)                  320 (  0,01)                    0 (  0,00)                  320 (  0,00)
Hash                                           0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
Gin                                            0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
Gist                                           0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
Sequence                                       0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
SPGist                                         0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
BRIN                                           0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
CommitTs                                       0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
ReplicationOrigin                              0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
Generic                                        0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
LogicalMessage                                 0 (  0,00)                    0 (  0,00)                    0 (  0,00)                    0 (  0,00)
                                        --------                      --------                      --------                      --------
Total                                      86118                       5602603 [28,82%]             13840388 [71,18%]             19442991 [100%]

Обратите внимание на общий размер (строка Total) полных образов (столбец FPI size).

Сжатие

=> ALTER SYSTEM SET full_page_writes = on;
ALTER SYSTEM
=> ALTER SYSTEM SET wal_compression = on;
ALTER SYSTEM
=> SELECT pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)

=> CHECKPOINT;
CHECKPOINT

Запускаем тест на 15 секунд.

=> SELECT pg_current_wal_insert_lsn();
 pg_current_wal_insert_lsn 
---------------------------
 0/35A67878
(1 row)

student$ pgbench -T 15 wal_tuning
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: 15 s
number of transactions actually processed: 13763
latency average = 1.090 ms
tps = 917.474784 (including connections establishing)
tps = 917.615077 (excluding connections establishing)
=> SELECT pg_current_wal_insert_lsn();
 pg_current_wal_insert_lsn 
---------------------------
 0/3623DD38
(1 row)

Размер журнальных записей:

=> SELECT pg_size_pretty('0/3623DD38'::pg_lsn - '0/35A67878'::pg_lsn);
 pg_size_pretty 
----------------
 8025 kB
(1 row)

В данном случае - при наличии большого числа полных образов страниц - размер журнальных записей уменьшился примерно в три раза. Хотя включение сжатия и нагружает процессор, практически наверняка им стоит воспользоваться при включенных контрольных суммах.