pgsql: Reuse the zstd context when compressing WAL full-page images

From: Michael Paquier <michael(at)paquier(dot)xyz>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Reuse the zstd context when compressing WAL full-page images
Date: 2026-10-14 07:41:23
Message-ID: E1xGtc3-00000001YwU-3kPn@gemulon.postgresql.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Reuse the zstd context when compressing WAL full-page images

When wal_compression=zstd, the compression of a full page image involves
ZSTD_compress(), that creates and destroys a zstd compression context
for each page processed.

Tests with FPI-heavy workloads have proven that this can be costly, and
a compression context can be reused across multiple pages. This commit
switches to use ZSTD_compressCCtx() for the compression of each page,
with ZSTD_CCtx allocated once in each backend, allocation happening the
first time it is required. If the allocation fails, the code
temporarily fails back to no compression, as a soft failure mode while
being inside a critical section.

Some tests have proved that this simple change can lead to a substantial
performance gain. For example, I have measured up to 6% faster runtime
and 8% less user CPU time for a VACUUM FULL generating WAL made mostly
of zstd-compressed FPIs.

ce3387b74b70 has done something similar for the decompression of pages
at replay.

Author: Andrey Borodin <x4mmm(at)yandex-team(dot)ru>
Reviewed-by: Anthonin Bonnefoy <anthonin(dot)bonnefoy(at)datadoghq(dot)com>
Reviewed-by: Michael Paquier <michael(at)paquier(dot)xyz>
Discussion: https://www.postgresql.org/message-id/asRsOl73nf8GeBFd@paquier.xyz

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/857340b0263da6d6a5f764bbab2fb39d0456f9fd

Modified Files
--------------
src/backend/access/transam/xloginsert.c | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message David Rowley 2026-10-14 09:07:15 pgsql: Accumulate Memoize parallel worker stats across rescans
Previous Message Michael Paquier 2026-10-14 06:14:55 pgsql: Fix typo in xlogreader.c