diff options
| author | Tom Lane | 2005-12-11 21:02:18 +0000 |
|---|---|---|
| committer | Tom Lane | 2005-12-11 21:02:18 +0000 |
| commit | ec0baf949ecdee0bf8d8e60cc8dba0137aac8d19 (patch) | |
| tree | b435a97a4e87c31a6b644ac2d9d1f433de487588 /src/include | |
| parent | be8100d64ec93ccd8160b37379ba189aab4d0ef1 (diff) | |
Divide the lock manager's shared state into 'partitions', so as to
reduce contention for the former single LockMgrLock. Per my recent
proposal. I set it up for 16 partitions, but on a pgbench test this
gives only a marginal further improvement over 4 partitions --- we need
to test more scenarios to choose the number of partitions.
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/storage/lock.h | 13 | ||||
| -rw-r--r-- | src/include/storage/lwlock.h | 12 | ||||
| -rw-r--r-- | src/include/storage/proc.h | 18 |
3 files changed, 27 insertions, 16 deletions
diff --git a/src/include/storage/lock.h b/src/include/storage/lock.h index e289632054c..9af03fb4742 100644 --- a/src/include/storage/lock.h +++ b/src/include/storage/lock.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/storage/lock.h,v 1.92 2005/12/09 01:22:04 tgl Exp $ + * $PostgreSQL: pgsql/src/include/storage/lock.h,v 1.93 2005/12/11 21:02:18 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -19,6 +19,13 @@ #include "storage/shmem.h" +/* + * Number of partitions the shared lock tables are divided into. + * + * See LockTagToPartition() if you change this. + */ +#define NUM_LOCK_PARTITIONS 16 + /* originally in procq.h */ typedef struct PROC_QUEUE { @@ -348,6 +355,7 @@ typedef struct LOCALLOCK LOCK *lock; /* associated LOCK object in shared mem */ PROCLOCK *proclock; /* associated PROCLOCK object in shmem */ bool isTempObject; /* true if lock is on a temporary object */ + int partition; /* ID of partition containing this lock */ int nLocks; /* total number of times lock is held */ int numLockOwners; /* # of relevant ResourceOwners */ int maxLockOwners; /* allocated size of array */ @@ -389,6 +397,7 @@ typedef enum */ extern void InitLocks(void); extern LockMethod GetLocksMethodTable(const LOCK *lock); +extern int LockTagToPartition(const LOCKTAG *locktag); extern LockAcquireResult LockAcquire(const LOCKTAG *locktag, bool isTempObject, LOCKMODE lockmode, @@ -406,7 +415,7 @@ extern int LockCheckConflicts(LockMethod lockMethodTable, LOCK *lock, PROCLOCK *proclock, PGPROC *proc); extern void GrantLock(LOCK *lock, PROCLOCK *proclock, LOCKMODE lockmode); extern void GrantAwaitedLock(void); -extern void RemoveFromWaitQueue(PGPROC *proc); +extern void RemoveFromWaitQueue(PGPROC *proc, int partition); extern Size LockShmemSize(void); extern bool DeadLockCheck(PGPROC *proc); extern void DeadLockReport(void); diff --git a/src/include/storage/lwlock.h b/src/include/storage/lwlock.h index 4291e0b2e74..c318e60b577 100644 --- a/src/include/storage/lwlock.h +++ b/src/include/storage/lwlock.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/storage/lwlock.h,v 1.23 2005/10/15 02:49:46 momjian Exp $ + * $PostgreSQL: pgsql/src/include/storage/lwlock.h,v 1.24 2005/12/11 21:02:18 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -16,9 +16,9 @@ /* * We have a number of predefined LWLocks, plus a bunch of LWLocks that are - * dynamically assigned (for shared buffers). The LWLock structures live - * in shared memory (since they contain shared data) and are identified by - * values of this enumerated type. We abuse the notion of an enum somewhat + * dynamically assigned (e.g., for shared buffers). The LWLock structures + * live in shared memory (since they contain shared data) and are identified + * by values of this enumerated type. We abuse the notion of an enum somewhat * by allowing values not listed in the enum declaration to be assigned. * The extra value MaxDynamicLWLock is there to keep the compiler from * deciding that the enum can be represented as char or short ... @@ -27,7 +27,6 @@ typedef enum LWLockId { BufMappingLock, BufFreelistLock, - LockMgrLock, OidGenLock, XidGenLock, ProcArrayLock, @@ -46,8 +45,7 @@ typedef enum LWLockId RelCacheInitLock, BgWriterCommLock, TwoPhaseStateLock, - - NumFixedLWLocks, /* must be last except for MaxDynamicLWLock */ + FirstLockMgrLock, /* must be last except for MaxDynamicLWLock */ MaxDynamicLWLock = 1000000000 } LWLockId; diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h index 4cba391048e..2cfee41eff9 100644 --- a/src/include/storage/proc.h +++ b/src/include/storage/proc.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/storage/proc.h,v 1.84 2005/10/15 02:49:46 momjian Exp $ + * $PostgreSQL: pgsql/src/include/storage/proc.h,v 1.85 2005/12/11 21:02:18 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -52,7 +52,8 @@ struct XidCache * so that the prepared transactions appear to be still running and are * correctly shown as holding locks. A prepared transaction PGPROC can be * distinguished from a real one at need by the fact that it has pid == 0. - * The semaphore and lock-related fields in a prepared-xact PGPROC are unused. + * The semaphore and lock-activity fields in a prepared-xact PGPROC are unused, + * but its myProcLocks[] lists are valid. */ struct PGPROC { @@ -86,8 +87,12 @@ struct PGPROC LOCKMASK heldLocks; /* bitmask for lock types already held on this * lock object by this backend */ - SHM_QUEUE procLocks; /* list of PROCLOCK objects for locks held or - * awaited by this backend */ + /* + * All PROCLOCK objects for locks held or awaited by this backend are + * linked into one of these lists, according to the partition number of + * their lock. + */ + SHM_QUEUE myProcLocks[NUM_LOCK_PARTITIONS]; struct XidCache subxids; /* cache for subtransaction XIDs */ }; @@ -99,7 +104,7 @@ extern DLLIMPORT PGPROC *MyProc; /* - * There is one ProcGlobal struct for the whole installation. + * There is one ProcGlobal struct for the whole database cluster. */ typedef struct PROC_HDR { @@ -134,8 +139,7 @@ extern bool HaveNFreeProcs(int n); extern void ProcReleaseLocks(bool isCommit); extern void ProcQueueInit(PROC_QUEUE *queue); -extern int ProcSleep(LockMethod lockMethodTable, LOCKMODE lockmode, - LOCK *lock, PROCLOCK *proclock); +extern int ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable); extern PGPROC *ProcWakeup(PGPROC *proc, int waitStatus); extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock); extern bool LockWaitCancel(void); |
