diff options
author | Alvaro Herrera | 2009-06-09 16:41:02 +0000 |
---|---|---|
committer | Alvaro Herrera | 2009-06-09 16:41:02 +0000 |
commit | fdb17362ad4ca499651f3f6cacc9e769c7afaf7d (patch) | |
tree | eadc197e331b5cf19d30794561b7322b66941665 | |
parent | 0065bc020c95f50e54ba060ac2b8749f2927ff8e (diff) |
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.
-rw-r--r-- | src/backend/postmaster/autovacuum.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index ad7228144f..3bdb12e3b0 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -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(); /* |