diff options
author | Andres Freund <andres@anarazel.de> | 2020-08-13 16:25:21 -0700 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2020-08-13 16:25:21 -0700 |
commit | 1f51c17c68d05c28d5b9294d8013cb9e7e653160 (patch) | |
tree | bb2dc0ab3009ced3ccfe819aba406f1f5810d4e4 /src/backend/access/transam | |
parent | a811ea5bde2fbf450095994b5726dcbf64d68668 (diff) | |
download | postgresql-1f51c17c68d05c28d5b9294d8013cb9e7e653160.tar.gz postgresql-1f51c17c68d05c28d5b9294d8013cb9e7e653160.zip |
snapshot scalability: Move PGXACT->xmin back to PGPROC.
Now that xmin isn't needed for GetSnapshotData() anymore, it leads to
unnecessary cacheline ping-pong to have it in PGXACT, as it is updated
considerably more frequently than the other PGXACT members.
After the changes in dc7420c2c92, this is a very straight-forward change.
For highly concurrent, snapshot acquisition heavy, workloads this change alone
can significantly increase scalability. E.g. plain pgbench on a smaller 2
socket machine gains 1.07x for read-only pgbench, 1.22x for read-only pgbench
when submitting queries in batches of 100, and 2.85x for batches of 100
'SELECT';. The latter numbers are obviously not to be expected in the
real-world, but micro-benchmark the snapshot computation
scalability (previously spending ~80% of the time in GetSnapshotData()).
Author: Andres Freund <andres@anarazel.de>
Reviewed-By: Robert Haas <robertmhaas@gmail.com>
Reviewed-By: Thomas Munro <thomas.munro@gmail.com>
Reviewed-By: David Rowley <dgrowleyml@gmail.com>
Discussion: https://postgr.es/m/20200301083601.ews6hz5dduc3w2se@alap3.anarazel.de
Diffstat (limited to 'src/backend/access/transam')
-rw-r--r-- | src/backend/access/transam/README | 4 | ||||
-rw-r--r-- | src/backend/access/transam/twophase.c | 2 |
2 files changed, 3 insertions, 3 deletions
diff --git a/src/backend/access/transam/README b/src/backend/access/transam/README index 98acb429b67..eab8edd20ec 100644 --- a/src/backend/access/transam/README +++ b/src/backend/access/transam/README @@ -296,7 +296,7 @@ ensure that the C compiler does exactly what you tell it to.) Another important activity that uses the shared ProcArray is ComputeXidHorizons, which must determine a lower bound for the oldest xmin of any active MVCC snapshot, system-wide. Each individual backend -advertises the smallest xmin of its own snapshots in MyPgXact->xmin, or zero +advertises the smallest xmin of its own snapshots in MyProc->xmin, or zero if it currently has no live snapshots (eg, if it's between transactions or hasn't yet set a snapshot for a new transaction). ComputeXidHorizons takes the MIN() of the valid xmin fields. It does this with only shared lock on @@ -331,7 +331,7 @@ necessary. Note that while it is certain that two concurrent executions of GetSnapshotData will compute the same xmin for their own snapshots, there is no such guarantee for the horizons computed by ComputeXidHorizons. This is -because we allow XID-less transactions to clear their MyPgXact->xmin +because we allow XID-less transactions to clear their MyProc->xmin asynchronously (without taking ProcArrayLock), so one execution might see what had been the oldest xmin, and another not. This is OK since the thresholds need only be a valid lower bound. As noted above, we are already diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 31f135f5ced..eb5f4680a3d 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -464,7 +464,7 @@ MarkAsPreparingGuts(GlobalTransaction gxact, TransactionId xid, const char *gid, /* We set up the gxact's VXID as InvalidBackendId/XID */ proc->lxid = (LocalTransactionId) xid; pgxact->xid = xid; - pgxact->xmin = InvalidTransactionId; + Assert(proc->xmin == InvalidTransactionId); proc->delayChkpt = false; pgxact->vacuumFlags = 0; proc->pid = 0; |