Re: Berserk Autovacuum (let's save next Mandrill)
Justin Pryzby <pryzby@telsasoft.com>
From: Justin Pryzby <pryzby@telsasoft.com>
To: Masahiko Sawada <masahiko.sawada@2ndquadrant.com>
Cc: David Rowley <dgrowleyml@gmail.com>, Laurenz Albe <laurenz.albe@cybertec.at>, Tomas Vondra <tomas.vondra@2ndquadrant.com>, Amit Kapila <amit.kapila16@gmail.com>, Masahiko Sawada <sawada.mshk@gmail.com>, Darafei Komяpa Praliaskouski <me@komzpa.net>, Andres Freund <andres@anarazel.de>, PostgreSQL Developers <pgsql-hackers@lists.postgresql.org>, Alvaro Herrera <alvherre@2ndquadrant.com>, Michael Banck <mbanck@gmx.net>
Date: 2020-03-16T12:47:13Z
Lists: pgsql-hackers
On Mon, Mar 16, 2020 at 12:53:43PM +0900, Masahiko Sawada wrote: > There is already a consensus on introducing new 2 parameters, but as > the second idea I'd like to add one (or two) GUC(s) to my suggestion, > say autovacuum_vacuum_freeze_insert_ratio; this parameter is the ratio > of the number of inserted tuples for total number of tuples modified > and inserted, in order to trigger insert-only vacuum. For example, > suppose the table has 1,000,000 tuples and we set threshold = 0, > scale_factor = 0.2 and freeze_insert_ratio = 0.9, we will trigger > normal autovacuum when n_dead_tup + n_ins_since_vacuum > 200,000, but > we will instead trigger insert-only autovacuum, which is a vacuum with > vacuum_freeze_min_age = 0, when n_ins_since_vacuum > 180,000 (=200,000 > * 0.9). IOW if 90% of modified tuples are insertions, we freeze tuples > aggressively. If we want to trigger insert-only vacuum only on > insert-only table we can set freeze_insert_ratio = 1.0. The down side > of this idea is that we cannot disable autovacuum triggered by the > number of inserted, although we might be able to introduce more one > GUC that controls whether to include the number of inserted tuples for > triggering autovacuum (say, autovacuum_vacuum_triggered_by_insert = > on|off). The pros of this idea would be that we can ensure that > insert-only vacuum will run only in the case where the ratio of > insertion is large enough. I was thinking about something like this myself. I would appreciate keeping separate the thresholds for 1) triggering vacuum; and, 2) the options autovacuum uses when it runs (in this case, FREEZE). Someone might want autovacuum to run with FREEZE on a table vacuumed due to dead tuples (say, on a partitioned table), or might *not* want to run FREEZE on a table vacuumed due to insertions (maybe because index scans are too expensive or FREEZE makes it too slow). Normally, when someone complains about bad plan related to no index-onlyscan, we tell them to run vacuum, and if that helps, then ALTER TABLE .. SET (autovacuum_vacuum_scale_factor=0.005). If there's two thresholds (4 GUCs and 4 relopts) for autovacuum, then do we have to help determine which one was being hit, and which relopt to set? I wonder if the new insert GUCs should default to -1 (disabled)? And the insert thresholds should be set by new insert relopt (if set), or by new insert GUC (default -1), else normal relopt, or normal GUC. The defaults would give 50 + 0.20*n. When someone asks about IOS, we'd tell them to set autovacuum_vacuum_scale_factor=0.005, same as now. vac_ins_scale_factor = (relopts && relopts->vacuum_ins_scale_factor >= 0) ? relopts->vacuum_ins_scale_factor : autovacuum_vac_ins_scale >= 0 ? autovacuum_vac_ins_scale : (relopts && relopts->vacuum_scale_factor >= 0) ? relopts->vacuum_scale_factor : autovacuum_vac_scale; One would disable autovacuum triggered by insertions by setting autovacuum_vacuum_insert_scale_factor=1e10 (which I think should also be the max for this patch). It seems to me that the easy thing to do is to implement this initially without FREEZE (which is controlled by vacuum_freeze_table_age), and defer until July/v14 further discussion and implementation of another GUC/relopt for autovacuum freezing to be controlled by insert thresholds (or ratio). -- Justin
Commits
-
Further improve stability fix for partition_aggregate test.
- 18d85e9b8a2b 13.0 landed
-
Improve stability fix for partition_aggregate test.
- 7cb0a423f914 13.0 landed
-
Attempt to stabilize partitionwise_aggregate test
- cefb82d49e21 13.0 landed
-
Fix race condition in statext_store().
- fe3036527a1f 13.0 landed
- 6c426cd43790 12.3 landed
-
Attempt to fix unstable regression tests, take 2
- 24566b359d09 13.0 landed
-
Attempt to fix unstable regression tests
- 2dc16efedc76 13.0 landed
-
Trigger autovacuum based on number of INSERTs
- b07642dbcd8d 13.0 landed
-
Fix upper limit for vacuum_cleanup_index_scale_factor
- 4d54543efa5e 11.0 cited