From faa981a71b006f77f8ecdf6e1350baa95af11a71 Mon Sep 17 00:00:00 2001 From: Andrew Pogrebnoi Date: Fri, 13 Feb 2026 16:14:45 +0200 Subject: [PATCH] Change wal_blocksize default to 4KB With the current 8KB default, we do more flushes of partially written buffers, which significantly increases the number of disk writes compared to 4KB XLOG_BLCKSZ. 4KB pages result in more overhead for headers, but it is small in comarison with the actual WAL data (~0.29% of space is headers with 8KB pages, and 0.59% with 4KB). See more on justification and benchmarks: https://www.postgresql.org/message-id/20231009230805.funj5ipoggjyzjz6%40awork3.anarazel.de --- configure | 4 ++-- configure.ac | 4 ++-- doc/src/sgml/installation.sgml | 4 ++-- doc/src/sgml/wal.sgml | 2 +- meson_options.txt | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/configure b/configure index ba293931878..06b50b61d25 100755 --- a/configure +++ b/configure @@ -1574,7 +1574,7 @@ Optional Packages: --with-segsize-blocks=SEGSIZE_BLOCKS set table segment size in blocks [0] --with-wal-blocksize=BLOCKSIZE - set WAL block size in kB [8] + set WAL block size in kB [4] --with-llvm build with LLVM based JIT support --without-icu build without ICU support --with-tcl build Tcl modules (PL/Tcl) @@ -3840,7 +3840,7 @@ if test "${with_wal_blocksize+set}" = set; then : esac else - wal_blocksize=8 + wal_blocksize=4 fi diff --git a/configure.ac b/configure.ac index 412fe358a2f..59678a7dd99 100644 --- a/configure.ac +++ b/configure.ac @@ -324,9 +324,9 @@ AC_DEFINE_UNQUOTED([RELSEG_SIZE], ${RELSEG_SIZE}, [ # WAL block size # AC_MSG_CHECKING([for WAL block size]) -PGAC_ARG_REQ(with, wal-blocksize, [BLOCKSIZE], [set WAL block size in kB [8]], +PGAC_ARG_REQ(with, wal-blocksize, [BLOCKSIZE], [set WAL block size in kB [4]], [wal_blocksize=$withval], - [wal_blocksize=8]) + [wal_blocksize=4]) case ${wal_blocksize} in 1) XLOG_BLCKSZ=1024;; 2) XLOG_BLCKSZ=2048;; diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index c903ccff988..6f3409406db 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -1520,7 +1520,7 @@ build-postgresql: Set the WAL block size, in kilobytes. This is the unit - of storage and I/O within the WAL log. The default, 8 kilobytes, + of storage and I/O within the WAL log. The default, 4 kilobytes, is suitable for most situations; but other values may be useful in special cases. The value must be a power of 2 between 1 and 64 (kilobytes). @@ -3047,7 +3047,7 @@ ninja install Set the WAL block size, in kilobytes. This is the unit - of storage and I/O within the WAL log. The default, 8 kilobytes, + of storage and I/O within the WAL log. The default, 4 kilobytes, is suitable for most situations; but other values may be useful in special cases. The value must be a power of 2 between 1 and 64 (kilobytes). diff --git a/doc/src/sgml/wal.sgml b/doc/src/sgml/wal.sgml index f3b86b26be9..731b8b6c6f0 100644 --- a/doc/src/sgml/wal.sgml +++ b/doc/src/sgml/wal.sgml @@ -881,7 +881,7 @@ pg_wal under the data directory, as a set of segment files, normally each 16 MB in size (but the size can be changed by altering the initdb option). Each segment is - divided into pages, normally 8 kB each (this size can be changed via the + divided into pages, normally 4 kB each (this size can be changed via the configure option). The WAL record headers are described in access/xlogrecord.h; the record content is dependent on the type of event that is being logged. Segment diff --git a/meson_options.txt b/meson_options.txt index 6a793f3e479..22d936973d8 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -9,7 +9,7 @@ option('blocksize', type: 'combo', option('wal_blocksize', type: 'combo', choices: ['1', '2', '4', '8', '16', '32', '64'], - value: '8', + value: '4', description: 'WAL block size, in kilobytes') option('segsize', type: 'integer', value: 1, -- 2.43.0