mirror of
https://github.com/postgres/postgres.git
synced 2025-11-25 12:03:53 +03:00
snapshot scalability: Move subxact info to ProcGlobal, remove PGXACT.
Similar to the previous changes this increases the chance that data frequently needed by GetSnapshotData() stays in l2 cache. In many workloads subtransactions are very rare, and this makes the check for that considerably cheaper. As this removes the last member of PGXACT, there is no need to keep it around anymore. On a larger 2 socket machine this and the two preceding commits result in a ~1.07x performance increase in read-only pgbench. For read-heavy mixed r/w workloads without row level contention, I see about 1.1x. 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
This commit is contained in:
@@ -35,6 +35,14 @@
|
||||
*/
|
||||
#define PGPROC_MAX_CACHED_SUBXIDS 64 /* XXX guessed-at value */
|
||||
|
||||
typedef struct XidCacheStatus
|
||||
{
|
||||
/* number of cached subxids, never more than PGPROC_MAX_CACHED_SUBXIDS */
|
||||
uint8 count;
|
||||
/* has PGPROC->subxids overflowed */
|
||||
bool overflowed;
|
||||
} XidCacheStatus;
|
||||
|
||||
struct XidCache
|
||||
{
|
||||
TransactionId xids[PGPROC_MAX_CACHED_SUBXIDS];
|
||||
@@ -187,6 +195,8 @@ struct PGPROC
|
||||
*/
|
||||
SHM_QUEUE myProcLocks[NUM_LOCK_PARTITIONS];
|
||||
|
||||
XidCacheStatus subxidStatus; /* mirrored with
|
||||
* ProcGlobal->subxidStates[i] */
|
||||
struct XidCache subxids; /* cache for subtransaction XIDs */
|
||||
|
||||
/* Support for group XID clearing. */
|
||||
@@ -235,22 +245,6 @@ struct PGPROC
|
||||
|
||||
|
||||
extern PGDLLIMPORT PGPROC *MyProc;
|
||||
extern PGDLLIMPORT struct PGXACT *MyPgXact;
|
||||
|
||||
/*
|
||||
* Prior to PostgreSQL 9.2, the fields below were stored as part of the
|
||||
* PGPROC. However, benchmarking revealed that packing these particular
|
||||
* members into a separate array as tightly as possible sped up GetSnapshotData
|
||||
* considerably on systems with many CPU cores, by reducing the number of
|
||||
* cache lines needing to be fetched. Thus, think very carefully before adding
|
||||
* anything else here.
|
||||
*/
|
||||
typedef struct PGXACT
|
||||
{
|
||||
bool overflowed;
|
||||
|
||||
uint8 nxids;
|
||||
} PGXACT;
|
||||
|
||||
/*
|
||||
* There is one ProcGlobal struct for the whole database cluster.
|
||||
@@ -310,12 +304,16 @@ typedef struct PROC_HDR
|
||||
{
|
||||
/* Array of PGPROC structures (not including dummies for prepared txns) */
|
||||
PGPROC *allProcs;
|
||||
/* Array of PGXACT structures (not including dummies for prepared txns) */
|
||||
PGXACT *allPgXact;
|
||||
|
||||
/* Array mirroring PGPROC.xid for each PGPROC currently in the procarray */
|
||||
TransactionId *xids;
|
||||
|
||||
/*
|
||||
* Array mirroring PGPROC.subxidStatus for each PGPROC currently in the
|
||||
* procarray.
|
||||
*/
|
||||
XidCacheStatus *subxidStates;
|
||||
|
||||
/*
|
||||
* Array mirroring PGPROC.vacuumFlags for each PGPROC currently in the
|
||||
* procarray.
|
||||
|
||||
Reference in New Issue
Block a user