=> 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.
=> 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)
=> 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)
В данном случае - при наличии большого числа полных образов страниц - размер журнальных записей уменьшился примерно в три раза. Хотя включение сжатия и нагружает процессор, практически наверняка им стоит воспользоваться при включенных контрольных суммах.