diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 39c58d00fe..386811389d 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -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; /* diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h index 1d60be2c47..2e6aad1ca5 100644 --- a/src/include/pg_config_manual.h +++ b/src/include/pg_config_manual.h @@ -199,6 +199,17 @@ #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