Commit 2d306759 authored by Thomas Munro's avatar Thomas Munro

Pad semaphores to avoid false sharing.

In a USE_UNNAMED_SEMAPHORES build, the default on Linux and FreeBSD
since commit ecb0d20a, we have an array of sem_t objects.  This
turned out to reduce performance compared to the previous default
USE_SYSV_SEMAPHORES on an 8 socket system.  Testing showed that the
lost performance could be regained by padding the array elements so
that they have their own cache lines.  This matches what we do for
similar hot arrays (see LWLockPadded, WALInsertLockPadded).

Back-patch to 10, where unnamed semaphores were adopted as the default
semaphore interface on those operating systems.

Author: Thomas Munro
Reviewed-by: Andres Freund
Reported-by: Mithun Cy
Tested-by: Mithun Cy, Tom Lane, Thomas Munro
Discussion: https://postgr.es/m/CAD__OugYDM3O%2BdyZnnZSbJprSfsGFJcQ1R%3De59T3hcLmDug4_w%40mail.gmail.com
parent 487bcc6e
...@@ -41,13 +41,19 @@ ...@@ -41,13 +41,19 @@
#error cannot use named POSIX semaphores with EXEC_BACKEND #error cannot use named POSIX semaphores with EXEC_BACKEND
#endif #endif
typedef union SemTPadded
{
sem_t pgsem;
char pad[PG_CACHE_LINE_SIZE];
} SemTPadded;
/* typedef PGSemaphore is equivalent to pointer to sem_t */ /* typedef PGSemaphore is equivalent to pointer to sem_t */
typedef struct PGSemaphoreData typedef struct PGSemaphoreData
{ {
sem_t pgsem; SemTPadded sem_padded;
} PGSemaphoreData; } PGSemaphoreData;
#define PG_SEM_REF(x) (&(x)->pgsem) #define PG_SEM_REF(x) (&(x)->sem_padded.pgsem)
#define IPCProtection (0600) /* access/modify by user only */ #define IPCProtection (0600) /* access/modify by user only */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment