aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xlog.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2011-01-22 20:31:24 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2011-01-22 20:31:24 -0500
commit0f73aae13def660371c34c8feda6e684e6366bdb (patch)
tree8428d4ae32b17ff45efbca1c8ef4de5e80d253bb /src/backend/access/transam/xlog.c
parent518b1e96c02ba0fa52227c528d6e951004d0653f (diff)
downloadpostgresql-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.c41
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 */