public inbox for [email protected]  
help / color / mirror / Atom feed
From: wenhui qiu <[email protected]>
To: Michael Paquier <[email protected]>
Cc: pgsql-hackers <[email protected]>
Cc: Japin Li <[email protected]>
Cc: John Naylor <[email protected]>
Cc: Christoph Berg <[email protected]>
Subject: Re: WAL compression setting after PostgreSQL LZ4 default change
Date: Wed, 1 Jul 2026 09:53:36 +0800
Message-ID: <CAGjGUAJaGmTwSSiF2so69Pjmjo4zwhsA+dmcUGRmqM856K9pBA@mail.gmail.com> (raw)
In-Reply-To: <[email protected]>
References: <CAGjGUAL1b=Mwd1SCvLbo+fivEr9KDpFcu4jmqKCZXwT=6CiiGQ@mail.gmail.com>
	<[email protected]>

Hi Michael


>
> > If I were switch the default, for me zstd goes first, lz4 is a close
> > second, and pglz is the last of its class.  The only reason why we
> > have not chosen zstd for TOAST is the fact that we don't support it
> > (trickier to add support for it as we have to preserve on-disk
> > compatibility for inline compressed TOAST entries).
>
> > In short, lz4 is available in many environments, but I'm also ready to
> > bet that zstd is equally available in these environments.
> Thanks for the feedback.
>
> Yes, I did consider zstd as well. I agree that zstd can provide a better
> compression ratio than lz4, and if we only look at compression ratio, zstd
> is
> a very attractive choice.
>
> The reason I started with lz4 was mainly to keep this change aligned with
> the
> recent TOAST compression change. Since lz4 has already been accepted there
> as
> the preferred default when available, I thought using the same choice for
> wal_compression=on would make the proposal smaller, more consistent, and
> easier
> to evaluate. so
>
> Second, WAL compression happens on the WAL insertion path for full-page
> images,
> so compression speed and CPU overhead matter a lot. lz4 is generally a
> good fit
> for that trade-off: it still reduces WAL volume, while keeping compression
> latency and CPU cost lower than zstd in many workloads.
>
> That said, I understand the argument for preferring zstd when it is
> available.
> I have prepared an alternative version where wal_compression=on selects
> zstd
> first, then lz4 if zstd is not available, and finally pglz as the fallback
>

Thanks


Attachments:

  [application/octet-stream] v002-wal-compression-on-zstd-lz4.patch (3.1K, ../CAGjGUAJaGmTwSSiF2so69Pjmjo4zwhsA+dmcUGRmqM856K9pBA@mail.gmail.com/3-v002-wal-compression-on-zstd-lz4.patch)
  download | inline diff:
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 009295f20e9..2282c9e99b8 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -3634,6 +3634,9 @@ include_dir 'conf.d'
         was compiled with <option>--with-lz4</option>) and
         <literal>zstd</literal> (if <productname>PostgreSQL</productname>
         was compiled with <option>--with-zstd</option>).
+        The value <literal>on</literal> selects <literal>zstd</literal>, if
+        available; otherwise, it selects <literal>lz4</literal>, if available;
+        otherwise, it selects <literal>pglz</literal>.
         The default value is <literal>off</literal>.
         Only superusers and users with the appropriate <literal>SET</literal>
         privilege can change this setting.
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index 290ccbc543e..9efd34aafea 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -484,13 +484,13 @@ static const struct config_enum_entry wal_compression_options[] = {
 #ifdef USE_ZSTD
 	{"zstd", WAL_COMPRESSION_ZSTD, false},
 #endif
-	{"on", WAL_COMPRESSION_PGLZ, false},
+	{"on", DEFAULT_WAL_COMPRESSION, false},
 	{"off", WAL_COMPRESSION_NONE, false},
-	{"true", WAL_COMPRESSION_PGLZ, true},
+	{"true", DEFAULT_WAL_COMPRESSION, true},
 	{"false", WAL_COMPRESSION_NONE, true},
-	{"yes", WAL_COMPRESSION_PGLZ, true},
+	{"yes", DEFAULT_WAL_COMPRESSION, true},
 	{"no", WAL_COMPRESSION_NONE, true},
-	{"1", WAL_COMPRESSION_PGLZ, true},
+	{"1", DEFAULT_WAL_COMPRESSION, true},
 	{"0", WAL_COMPRESSION_NONE, true},
 	{NULL, 0, false}
 };
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index ac38cddaaf9..43cb28fce48 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -263,6 +263,8 @@
                                         # (change requires restart)
 #wal_compression = off                  # enables compression of full-page writes;
                                         # off, pglz, lz4, zstd, or on
+                                        # (on = zstd if available, else lz4 if
+                                        # available, else pglz)
 #wal_init_zero = on                     # zero-fill new WAL files
 #wal_recycle = on                       # recycle WAL files
 #wal_buffers = -1                       # min 32kB, -1 sets based on shared_buffers
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index 437b4f32349..a7c46352b30 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -87,6 +87,19 @@ typedef enum WalCompression
 	WAL_COMPRESSION_ZSTD,
 } WalCompression;
 
+/*
+ * Choose an appropriate default WAL compression method for wal_compression=on.
+ * Prefer zstd when compiled in; otherwise use lz4 if available, falling back
+ * to pglz.
+ */
+#ifdef USE_ZSTD
+#define DEFAULT_WAL_COMPRESSION	WAL_COMPRESSION_ZSTD
+#elif defined(USE_LZ4)
+#define DEFAULT_WAL_COMPRESSION	WAL_COMPRESSION_LZ4
+#else
+#define DEFAULT_WAL_COMPRESSION	WAL_COMPRESSION_PGLZ
+#endif
+
 /* Recovery states */
 typedef enum RecoveryState
 {


view thread (12+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected], [email protected], [email protected], [email protected]
  Subject: Re: WAL compression setting after PostgreSQL LZ4 default change
  In-Reply-To: <CAGjGUAJaGmTwSSiF2so69Pjmjo4zwhsA+dmcUGRmqM856K9pBA@mail.gmail.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox