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 <[email protected]>
Reviewed-by: Anthonin Bonnefoy <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://www.postgresql.org/message-id/[email protected]

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(-)

Reply via email to