From: Alvaro Herrera Date: Tue, 9 Jun 2009 16:41:02 +0000 (+0000) Subject: Dynamically set a lower bound on autovacuum nap time so that we don't rebuild X-Git-Tag: REL8_4_RC1~37 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e8f28cb25d6f375d0d553b6fa16b398835951a1f;p=postgresql 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. --- diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index a0a6671aff..e5b9c9bd4c 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -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(); /*