mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +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:
@@ -63,9 +63,8 @@ int LockTimeout = 0;
|
||||
int IdleInTransactionSessionTimeout = 0;
|
||||
bool log_lock_waits = false;
|
||||
|
||||
/* Pointer to this process's PGPROC and PGXACT structs, if any */
|
||||
/* Pointer to this process's PGPROC struct, if any */
|
||||
PGPROC *MyProc = NULL;
|
||||
PGXACT *MyPgXact = NULL;
|
||||
|
||||
/*
|
||||
* This spinlock protects the freelist of recycled PGPROC structures.
|
||||
@@ -110,10 +109,8 @@ ProcGlobalShmemSize(void)
|
||||
size = add_size(size, mul_size(TotalProcs, sizeof(PGPROC)));
|
||||
size = add_size(size, sizeof(slock_t));
|
||||
|
||||
size = add_size(size, mul_size(MaxBackends, sizeof(PGXACT)));
|
||||
size = add_size(size, mul_size(NUM_AUXILIARY_PROCS, sizeof(PGXACT)));
|
||||
size = add_size(size, mul_size(max_prepared_xacts, sizeof(PGXACT)));
|
||||
size = add_size(size, mul_size(TotalProcs, sizeof(*ProcGlobal->xids)));
|
||||
size = add_size(size, mul_size(TotalProcs, sizeof(*ProcGlobal->subxidStates)));
|
||||
size = add_size(size, mul_size(TotalProcs, sizeof(*ProcGlobal->vacuumFlags)));
|
||||
|
||||
return size;
|
||||
@@ -161,7 +158,6 @@ void
|
||||
InitProcGlobal(void)
|
||||
{
|
||||
PGPROC *procs;
|
||||
PGXACT *pgxacts;
|
||||
int i,
|
||||
j;
|
||||
bool found;
|
||||
@@ -202,18 +198,6 @@ InitProcGlobal(void)
|
||||
/* XXX allProcCount isn't really all of them; it excludes prepared xacts */
|
||||
ProcGlobal->allProcCount = MaxBackends + NUM_AUXILIARY_PROCS;
|
||||
|
||||
/*
|
||||
* Also allocate a separate array of PGXACT structures. This is separate
|
||||
* from the main PGPROC array so that the most heavily accessed data is
|
||||
* stored contiguously in memory in as few cache lines as possible. This
|
||||
* provides significant performance benefits, especially on a
|
||||
* multiprocessor system. There is one PGXACT structure for every PGPROC
|
||||
* structure.
|
||||
*/
|
||||
pgxacts = (PGXACT *) ShmemAlloc(TotalProcs * sizeof(PGXACT));
|
||||
MemSet(pgxacts, 0, TotalProcs * sizeof(PGXACT));
|
||||
ProcGlobal->allPgXact = pgxacts;
|
||||
|
||||
/*
|
||||
* Allocate arrays mirroring PGPROC fields in a dense manner. See
|
||||
* PROC_HDR.
|
||||
@@ -224,6 +208,8 @@ InitProcGlobal(void)
|
||||
ProcGlobal->xids =
|
||||
(TransactionId *) ShmemAlloc(TotalProcs * sizeof(*ProcGlobal->xids));
|
||||
MemSet(ProcGlobal->xids, 0, TotalProcs * sizeof(*ProcGlobal->xids));
|
||||
ProcGlobal->subxidStates = (XidCacheStatus *) ShmemAlloc(TotalProcs * sizeof(*ProcGlobal->subxidStates));
|
||||
MemSet(ProcGlobal->subxidStates, 0, TotalProcs * sizeof(*ProcGlobal->subxidStates));
|
||||
ProcGlobal->vacuumFlags = (uint8 *) ShmemAlloc(TotalProcs * sizeof(*ProcGlobal->vacuumFlags));
|
||||
MemSet(ProcGlobal->vacuumFlags, 0, TotalProcs * sizeof(*ProcGlobal->vacuumFlags));
|
||||
|
||||
@@ -372,7 +358,6 @@ InitProcess(void)
|
||||
(errcode(ERRCODE_TOO_MANY_CONNECTIONS),
|
||||
errmsg("sorry, too many clients already")));
|
||||
}
|
||||
MyPgXact = &ProcGlobal->allPgXact[MyProc->pgprocno];
|
||||
|
||||
/*
|
||||
* Cross-check that the PGPROC is of the type we expect; if this were not
|
||||
@@ -569,7 +554,6 @@ InitAuxiliaryProcess(void)
|
||||
((volatile PGPROC *) auxproc)->pid = MyProcPid;
|
||||
|
||||
MyProc = auxproc;
|
||||
MyPgXact = &ProcGlobal->allPgXact[auxproc->pgprocno];
|
||||
|
||||
SpinLockRelease(ProcStructLock);
|
||||
|
||||
|
Reference in New Issue
Block a user