diff options
Diffstat (limited to 'src/backend/access/transam/clog.c')
-rw-r--r-- | src/backend/access/transam/clog.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c index 4060e600ff5..69b6ef352b2 100644 --- a/src/backend/access/transam/clog.c +++ b/src/backend/access/transam/clog.c @@ -35,6 +35,7 @@ #include "access/clog.h" #include "access/slru.h" #include "access/transam.h" +#include "miscadmin.h" #include "pg_trace.h" /* @@ -409,6 +410,34 @@ TransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn) return status; } +/* + * Number of shared CLOG buffers. + * + * Testing during the PostgreSQL 9.2 development cycle revealed that on a + * large multi-processor system, it was possible to have more CLOG page + * requests in flight at one time than the numebr of CLOG buffers which existed + * at that time, which was hardcoded to 8. Further testing revealed that + * performance dropped off with more than 32 CLOG buffers, possibly because + * the linear buffer search algorithm doesn't scale well. + * + * Unconditionally increasing the number of CLOG buffers to 32 did not seem + * like a good idea, because it would increase the minimum amount of shared + * memory required to start, which could be a problem for people running very + * small configurations. The following formula seems to represent a reasonable + * compromise: people with very low values for shared_buffers will get fewer + * CLOG buffers as well, and everyone else will get 32. + * + * It is likely that some further work will be needed here in future releases; + * for example, on a 64-core server, the maximum number of CLOG requests that + * can be simultaneously in flight will be even larger. But that will + * apparently require more than just changing the formula, so for now we take + * the easy way out. + */ +Size +CLOGShmemBuffers(void) +{ + return Min(32, Max(4, NBuffers / 512)); +} /* * Initialization of shared memory for CLOG @@ -416,14 +445,14 @@ TransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn) Size CLOGShmemSize(void) { - return SimpleLruShmemSize(NUM_CLOG_BUFFERS, CLOG_LSNS_PER_PAGE); + return SimpleLruShmemSize(CLOGShmemBuffers(), CLOG_LSNS_PER_PAGE); } void CLOGShmemInit(void) { ClogCtl->PagePrecedes = CLOGPagePrecedes; - SimpleLruInit(ClogCtl, "CLOG Ctl", NUM_CLOG_BUFFERS, CLOG_LSNS_PER_PAGE, + SimpleLruInit(ClogCtl, "CLOG Ctl", CLOGShmemBuffers(), CLOG_LSNS_PER_PAGE, CLogControlLock, "pg_clog"); } |