From 2986aa6a668bce3cfb83606bb52e9d01ae66ad6c Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Fri, 15 Nov 2002 02:44:57 +0000
Subject: [PATCH] Add checkpoint_warning to warn of excessive checkpoints
 caused by too few WAL files.

---
 doc/src/sgml/runtime.sgml                     | 14 ++++++++++++-
 doc/src/sgml/wal.sgml                         | 12 ++++++++++-
 src/backend/postmaster/postmaster.c           | 20 ++++++++++++++++++-
 src/backend/utils/misc/guc.c                  |  7 ++++++-
 src/backend/utils/misc/postgresql.conf.sample |  1 +
 src/include/access/xlog.h                     |  3 ++-
 6 files changed, 52 insertions(+), 5 deletions(-)

diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index 6ca8f820e34..26777ae43a8 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.154 2002/11/15 01:57:25 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.155 2002/11/15 02:44:50 momjian Exp $
 -->
 
 <Chapter Id="runtime">
@@ -2081,6 +2081,18 @@ dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir'
       </listitem>
      </varlistentry>
 
+    <variablelist>
+     <varlistentry>
+      <term><varname>CHECKPOINT_WARNING</varname> (<type>integer</type>)</term>
+      <listitem>
+       <para>
+        Send a message to the server logs if checkpoints caused by the
+        filling of checkpoint segment files happens more frequently than
+        this number of seconds.  Zero turns off the warning.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><varname>COMMIT_DELAY</varname> (<type>integer</type>)</term>
       <listitem>
diff --git a/doc/src/sgml/wal.sgml b/doc/src/sgml/wal.sgml
index 7f603221acc..2589ab8163b 100644
--- a/doc/src/sgml/wal.sgml
+++ b/doc/src/sgml/wal.sgml
@@ -1,4 +1,4 @@
-<!-- $Header: /cvsroot/pgsql/doc/src/sgml/wal.sgml,v 1.21 2002/11/02 22:23:01 tgl Exp $ -->
+<!-- $Header: /cvsroot/pgsql/doc/src/sgml/wal.sgml,v 1.22 2002/11/15 02:44:54 momjian Exp $ -->
 
 <chapter id="wal">
  <title>Write-Ahead Logging (<acronym>WAL</acronym>)</title>
@@ -300,6 +300,16 @@
    correspondingly increase shared memory usage.
   </para>
 
+  <para>
+   Checkpoints are fairly expensive because they force all dirty kernel
+   buffers to disk using the operating system <literal>sync()</> call.
+   Busy servers may fill checkpoint segment files too quickly,
+   causing excessive checkpointing. If such forced checkpoints happen
+   more frequently than <varname>CHECKPOINT_WARNING</varname> seconds, 
+   a message, will be output to the server logs recommending increasing 
+   <varname>CHECKPOINT_SEGMENTS</varname>.
+  </para>
+
   <para>
    The <varname>COMMIT_DELAY</varname> parameter defines for how many
    microseconds the backend will sleep after writing a commit
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index a9d18a575b8..53aa731e719 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.296 2002/11/15 01:57:26 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.297 2002/11/15 02:44:55 momjian Exp $
  *
  * NOTES
  *
@@ -198,6 +198,8 @@ bool		SilentMode = false; /* silent mode (-S) */
 int			PreAuthDelay = 0;
 int			AuthenticationTimeout = 60;
 int			CheckPointTimeout = 300;
+int			CheckPointWarning = 30;
+time_t		LastSignalledCheckpoint = 0;
 
 bool		log_hostname;		/* for ps display */
 bool		LogSourcePort;
@@ -2329,6 +2331,22 @@ sigusr1_handler(SIGNAL_ARGS)
 
 	if (CheckPostmasterSignal(PMSIGNAL_DO_CHECKPOINT))
 	{
+		if (CheckPointWarning != 0)
+		{
+			/*
+			 *	This only times checkpoints forced by running out of
+			 *	segment files.  Other checkpoints could reduce
+			 *	the frequency of forced checkpoints.
+			 */
+			time_t now = time(NULL);
+
+			if (now - LastSignalledCheckpoint < CheckPointWarning)
+				elog(LOG, "Checkpoint segments are being created too frequently (%d secs)\n
+				Consider increasing CHECKPOINT_SEGMENTS",
+				now - LastSignalledCheckpoint);
+			LastSignalledCheckpoint = now;
+		}
+
 		/*
 		 * Request to schedule a checkpoint
 		 *
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 96d42109e06..62417bfe118 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -5,7 +5,7 @@
  * command, configuration file, and command line options.
  * See src/backend/utils/misc/README for more information.
  *
- * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.105 2002/11/15 01:57:27 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.106 2002/11/15 02:44:57 momjian Exp $
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  * Written by Peter Eisentraut <peter_e@gmx.net>.
@@ -660,6 +660,11 @@ static struct config_int
 		300, 30, 3600, NULL, NULL
 	},
 
+	{
+		{"checkpoint_warning", PGC_SIGHUP}, &CheckPointWarning,
+		30, 0, INT_MAX, NULL, NULL
+	},
+
 	{
 		{"wal_buffers", PGC_POSTMASTER}, &XLOGbuffers,
 		8, 4, INT_MAX, NULL, NULL
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index becc6dfbe74..5fbfafd214a 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -65,6 +65,7 @@
 #
 #checkpoint_segments = 3	# in logfile segments, min 1, 16MB each
 #checkpoint_timeout = 300	# range 30-3600, in seconds
+#checkpoint_warning = 30	# 0 is off, in seconds
 #
 #commit_delay = 0		# range 0-100000, in microseconds
 #commit_siblings = 5		# range 1-1000
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index f5c3e59cbce..1659c65b930 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: xlog.h,v 1.39 2002/09/26 22:58:34 tgl Exp $
+ * $Id: xlog.h,v 1.40 2002/11/15 02:44:57 momjian Exp $
  */
 #ifndef XLOG_H
 #define XLOG_H
@@ -184,6 +184,7 @@ extern XLogRecPtr ProcLastRecEnd;
 
 /* these variables are GUC parameters related to XLOG */
 extern int	CheckPointSegments;
+extern int	CheckPointWarning;
 extern int	XLOGbuffers;
 extern int	XLOG_DEBUG;
 extern char *XLOG_sync_method;
-- 
GitLab