I wrote this patch last year in response to a customer issue and I thought I had submitted it here, but evidently I didn't. So here it is.
The short story is: in commit 5364b357fb11 we increased the size of pg_commit (née pg_clog) but we didn't increase the size of pg_commit_ts to match. When commit_ts is in use, this can lead to significant buffer thrashing and thus poor performance. Since commit_ts entries are larger than pg_commit, my proposed patch uses twice as many buffers. Suffice it to say once we did this the customer problem went away. (Andrey Borodin already has a patch to change the behavior for multixact, which is something we should perhaps also do. I now notice that they're also reporting a bug in that thread ... sigh) -- Álvaro Herrera 39°49'30"S 73°17'W "The problem with the future is that it keeps turning into the present" (Hobbes)
diff --git a/src/backend/access/transam/commit_ts.c b/src/backend/access/transam/commit_ts.c index b786eeff7a..712f1eff01 100644 --- a/src/backend/access/transam/commit_ts.c +++ b/src/backend/access/transam/commit_ts.c @@ -530,7 +530,7 @@ pg_xact_commit_timestamp_origin(PG_FUNCTION_ARGS) Size CommitTsShmemBuffers(void) { - return Min(16, Max(4, NBuffers / 1024)); + return Min(256, Max(4, NBuffers / 512)); } /*