mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Keep heavily-contended fields in XLogCtlInsert on different cache lines.
Performance testing shows that if the insertpos_lck spinlock and the fields that it protects are on the same cache line with other variables that are frequently accessed, the false sharing can hurt performance a lot. Keep them apart by adding some padding.
This commit is contained in:
@ -408,7 +408,7 @@ typedef struct
|
||||
typedef union XLogInsertSlotPadded
|
||||
{
|
||||
XLogInsertSlot slot;
|
||||
char pad[64];
|
||||
char pad[CACHE_LINE_SIZE];
|
||||
} XLogInsertSlotPadded;
|
||||
|
||||
/*
|
||||
@ -428,8 +428,14 @@ typedef struct XLogCtlInsert
|
||||
uint64 CurrBytePos;
|
||||
uint64 PrevBytePos;
|
||||
|
||||
/* insertion slots, see above for details */
|
||||
XLogInsertSlotPadded *insertSlots;
|
||||
/*
|
||||
* Make sure the above heavily-contended spinlock and byte positions are
|
||||
* on their own cache line. In particular, the RedoRecPtr and full page
|
||||
* write variables below should be on a different cache line. They are
|
||||
* read on every WAL insertion, but updated rarely, and we don't want
|
||||
* those reads to steal the cache line containing Curr/PrevBytePos.
|
||||
*/
|
||||
char pad[CACHE_LINE_SIZE];
|
||||
|
||||
/*
|
||||
* fullPageWrites is the master copy used by all backends to determine
|
||||
@ -455,6 +461,9 @@ typedef struct XLogCtlInsert
|
||||
bool exclusiveBackup;
|
||||
int nonExclusiveBackups;
|
||||
XLogRecPtr lastBackupStart;
|
||||
|
||||
/* insertion slots, see XLogInsertSlot struct above for details */
|
||||
XLogInsertSlotPadded *insertSlots;
|
||||
} XLogCtlInsert;
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user