Re: Berserk Autovacuum (let's save next Mandrill)
Masahiko Sawada <masahiko.sawada@2ndquadrant.com>
From: Masahiko Sawada <masahiko.sawada@2ndquadrant.com>
To: David Rowley <dgrowleyml@gmail.com>
Cc: Laurenz Albe <laurenz.albe@cybertec.at>, Justin Pryzby <pryzby@telsasoft.com>, 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-16T03:53:43Z
Lists: pgsql-hackers
On Fri, 13 Mar 2020 at 05:11, David Rowley <dgrowleyml@gmail.com> wrote: > > On Fri, 13 Mar 2020 at 01:43, Masahiko Sawada > <masahiko.sawada@2ndquadrant.com> wrote: > > > > On Thu, 12 Mar 2020 at 16:28, David Rowley <dgrowleyml@gmail.com> wrote: > > > Laurenz highlighted a seemingly very valid reason that the current > > > GUCs cannot be reused. Namely, say the table has 1 billion rows, if we > > > use the current scale factor of 0.2, then we'll run an insert-only > > > vacuum every 200 million rows. If those INSERTs are one per > > > transaction then the new feature does nothing as the wraparound vacuum > > > will run instead. Since this feature was born due to large insert-only > > > tables, this concern seems very valid to me. > > > > Yeah, I understand and agree that since most people would use default > > values we can reduce mis-configuration cases by adding separate GUCs > > that have appropriate default values for that purpose but on the other > > hand I'm not sure it's worth that we cover the large insert-only table > > case by adding separate GUCs in spite of being able to cover it even > > by existing two GUCs. > > In light of the case above, do you have an alternative suggestion? > > > If we want to disable this feature on the > > particular table, we can have a storage parameter that means not to > > consider the number of inserted tuples rather than having multiple > > GUCs that allows us to fine tuning. And IIUC even in the above case, I > > think that if we trigger insert-only vacuum by comparing the number of > > inserted tuples to the threshold computed by existing threshold and > > scale factor, we can cover it. > > So you're suggesting we drive the insert-vacuums from existing > scale_factor and threshold? What about the 1 billion row table > example above? My suggestion is the initial approach proposed by Justin; comparing the number of inserted tuples to the threshold computed by autovacuum_vacum_threshold and autovacuum_vacuum_scale_factor in order to trigger autovacuum. But as discussed, there is a downside; if the number of inserted tuples are almost the same as, but a little larger than, the number of dead tuples, we will trigger insert-only vacuum but it's wasteful. 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. Regards, -- Masahiko Sawada http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
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