diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-01-22 20:31:24 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-01-22 20:31:24 -0500 |
commit | 0f73aae13def660371c34c8feda6e684e6366bdb (patch) | |
tree | 8428d4ae32b17ff45efbca1c8ef4de5e80d253bb /src/backend/access/transam/xlog.c | |
parent | 518b1e96c02ba0fa52227c528d6e951004d0653f (diff) | |
download | postgresql-0f73aae13def660371c34c8feda6e684e6366bdb.tar.gz postgresql-0f73aae13def660371c34c8feda6e684e6366bdb.zip |
Allow the wal_buffers setting to be auto-tuned to a reasonable value.
If wal_buffers is initially set to -1 (which is now the default), it's
replaced by 1/32nd of shared_buffers, with a minimum of 8 (the old default)
and a maximum of the XLOG segment size. The allowed range for manual
settings is still from 4 up to whatever will fit in shared memory.
Greg Smith, with implementation correction by me.
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r-- | src/backend/access/transam/xlog.c | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 5b6a2302b19..85b2dcae070 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -69,7 +69,7 @@ /* User-settable parameters */ int CheckPointSegments = 3; int wal_keep_segments = 0; -int XLOGbuffers = 8; +int XLOGbuffers = -1; int XLogArchiveTimeout = 0; bool XLogArchiveMode = false; char *XLogArchiveCommand = NULL; @@ -4778,6 +4778,41 @@ GetSystemIdentifier(void) } /* + * Auto-tune the number of XLOG buffers. + * + * If the user-set value of wal_buffers is -1, we auto-tune to about 3% of + * shared_buffers, with a maximum of one XLOG segment and a minimum of 8 + * blocks (8 was the default value prior to PostgreSQL 9.1, when auto-tuning + * was added). We also clamp manually-set values to at least 4 blocks; prior + * to PostgreSQL 9.1, a minimum of 4 was enforced by guc.c, but since that + * is no longer possible, we just silently treat such values as a request for + * the minimum. + */ +static void +XLOGTuneNumBuffers(void) +{ + int xbuffers = XLOGbuffers; + char buf[32]; + + if (xbuffers == -1) + { + xbuffers = NBuffers / 32; + if (xbuffers > XLOG_SEG_SIZE / XLOG_BLCKSZ) + xbuffers = XLOG_SEG_SIZE / XLOG_BLCKSZ; + if (xbuffers < 8) + xbuffers = 8; + } + else if (xbuffers < 4) + xbuffers = 4; + + if (xbuffers != XLOGbuffers) + { + snprintf(buf, sizeof(buf), "%d", xbuffers); + SetConfigOption("wal_buffers", buf, PGC_POSTMASTER, PGC_S_OVERRIDE); + } +} + +/* * Initialization of shared memory for XLOG */ Size @@ -4785,6 +4820,10 @@ XLOGShmemSize(void) { Size size; + /* Figure out how many XLOG buffers we need. */ + XLOGTuneNumBuffers(); + Assert(XLOGbuffers > 0); + /* XLogCtl */ size = sizeof(XLogCtlData); /* xlblocks array */ |