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