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