Commit e8f28cb2 authored by Alvaro Herrera's avatar Alvaro Herrera

Dynamically set a lower bound on autovacuum nap time so that we don't rebuild

the database list too often.

Per bug report from Łukasz Jagiełło and ensuing discussion on
pgsql-performance.
parent e5de6012
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
* *
* *
* IDENTIFICATION * 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; ...@@ -123,6 +123,8 @@ int Log_autovacuum_min_duration = -1;
/* how long to keep pgstat data in the launcher, in milliseconds */ /* how long to keep pgstat data in the launcher, in milliseconds */
#define STATS_READ_DELAY 1000 #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 */ /* Flags to tell if we are in an autovacuum process */
static bool am_autovacuum_launcher = false; static bool am_autovacuum_launcher = false;
...@@ -822,11 +824,11 @@ launcher_determine_sleep(bool canlaunch, bool recursing, struct timeval * nap) ...@@ -822,11 +824,11 @@ launcher_determine_sleep(bool canlaunch, bool recursing, struct timeval * nap)
return; return;
} }
/* 100ms is the smallest time we'll allow the launcher to sleep */ /* The smallest time we'll allow the launcher to sleep. */
if (nap->tv_sec <= 0 && nap->tv_usec <= 100000) if (nap->tv_sec <= 0 && nap->tv_usec <= MIN_AUTOVAC_SLEEPTIME * 1000)
{ {
nap->tv_sec = 0; 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) ...@@ -997,8 +999,17 @@ rebuild_database_list(Oid newdb)
/* sort the array */ /* sort the array */
qsort(dbary, nelems, sizeof(avl_dbase), db_comparator); 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; millis_increment = 1000.0 * autovacuum_naptime / nelems;
if (millis_increment <= MIN_AUTOVAC_SLEEPTIME)
millis_increment = MIN_AUTOVAC_SLEEPTIME * 1.1;
current_time = GetCurrentTimestamp(); current_time = GetCurrentTimestamp();
/* /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment