typedef union XLogInsertSlotPadded
{
XLogInsertSlot slot;
- char pad[64];
+ char pad[CACHE_LINE_SIZE];
} XLogInsertSlotPadded;
/*
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
bool exclusiveBackup;
int nonExclusiveBackups;
XLogRecPtr lastBackupStart;
+
+ /* insertion slots, see XLogInsertSlot struct above for details */
+ XLogInsertSlotPadded *insertSlots;
} XLogCtlInsert;
/*
#define USE_PPC_LWSYNC
#endif
+/*
+ * Assumed cache line size. This doesn't affect correctness, but can be
+ * used for low-level optimizations. Currently, this is only used to pad
+ * some data structures in xlog.c, to ensure that highly-contended fields
+ * are on different cache lines. Too small a value can hurt performance due
+ * to false sharing, while the only downside of too large a value is a few
+ * bytes of wasted memory. The default is 128, which should be large enough
+ * for all supported platforms.
+ */
+#define CACHE_LINE_SIZE 128
+
/*
*------------------------------------------------------------------------
* The following symbols are for enabling debugging code, not for