Dynamically set a lower bound on autovacuum nap time so that we don't rebuild
authorAlvaro Herrera <[email protected]>
Tue, 9 Jun 2009 16:41:02 +0000 (16:41 +0000)
committerAlvaro Herrera <[email protected]>
Tue, 9 Jun 2009 16:41:02 +0000 (16:41 +0000)
the database list too often.

Per bug report from Łukasz Jagiełło and ensuing discussion on
pgsql-performance.

src/backend/postmaster/autovacuum.c

index a0a6671afffeb575a78808e2335cfaccd869af3a..e5b9c9bd4cc7189a2d70541a088baab657f37bc9 100644 (file)
@@ -55,7 +55,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.95 2009/05/15 15:56:39 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.96 2009/06/09 16:41:02 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -123,6 +123,8 @@ int         Log_autovacuum_min_duration = -1;
 /* how long to keep pgstat data in the launcher, in milliseconds */
 #define STATS_READ_DELAY 1000
 
+/* the minimum allowed time between two awakening of the launcher */
+#define MIN_AUTOVAC_SLEEPTIME 100.0 /* milliseconds */
 
 /* Flags to tell if we are in an autovacuum process */
 static bool am_autovacuum_launcher = false;
@@ -822,11 +824,11 @@ launcher_determine_sleep(bool canlaunch, bool recursing, struct timeval * nap)
        return;
    }
 
-   /* 100ms is the smallest time we'll allow the launcher to sleep */
-   if (nap->tv_sec <= 0 && nap->tv_usec <= 100000)
+   /* The smallest time we'll allow the launcher to sleep. */
+   if (nap->tv_sec <= 0 && nap->tv_usec <= MIN_AUTOVAC_SLEEPTIME * 1000)
    {
        nap->tv_sec = 0;
-       nap->tv_usec = 100000;  /* 100 ms */
+       nap->tv_usec = MIN_AUTOVAC_SLEEPTIME * 1000;
    }
 }
 
@@ -997,8 +999,17 @@ rebuild_database_list(Oid newdb)
        /* sort the array */
        qsort(dbary, nelems, sizeof(avl_dbase), db_comparator);
 
-       /* this is the time interval between databases in the schedule */
+       /*
+        * Determine the time interval between databases in the schedule.
+        * If we see that the configured naptime would take us to sleep times
+        * lower than our min sleep time (which launcher_determine_sleep is
+        * coded not to allow), silently use a larger naptime (but don't touch
+        * the GUC variable).
+        */
        millis_increment = 1000.0 * autovacuum_naptime / nelems;
+       if (millis_increment <= MIN_AUTOVAC_SLEEPTIME)
+           millis_increment = MIN_AUTOVAC_SLEEPTIME * 1.1;
+
        current_time = GetCurrentTimestamp();
 
        /*