Re: New strategies for freezing, advancing relfrozenxid early
Peter Geoghegan <pg@bowt.ie>
From: Peter Geoghegan <pg@bowt.ie>
To: Dilip Kumar <dilipbalaut@gmail.com>
Cc: Jeff Davis <pgsql@j-davis.com>,
Matthias van de Meent <boekewurm+postgres@gmail.com>, John Naylor <john.naylor@enterprisedb.com>,
Andres Freund <andres@anarazel.de>, Justin Pryzby <pryzby@telsasoft.com>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2023-01-23T18:01:27Z
Lists: pgsql-hackers
On Mon, Jan 23, 2023 at 3:17 AM Dilip Kumar <dilipbalaut@gmail.com> wrote: > My final set of comments for 0002 Thanks for the review! > I do not understand much use of maintaining these two > 'scanned_pages_lazy' and 'scanned_pages_eager' variables. I think > just maintaining 'scanned_pages' should be sufficient. I do not see > in patches also they are really used. I agree that the visibility map snapshot struct could stand to be cleaned up -- some of that state may not be needed, and it wouldn't be that hard to use memory a little more economically, particularly with very small tables. It's on my TODO list already. > +#define MAX_PAGES_YOUNG_TABLEAGE 0.05 /* 5% of rel_pages */ > +#define MAX_PAGES_OLD_TABLEAGE 0.70 /* 70% of rel_pages */ > > Why is the logic behind 5% and 70% are those based on some > experiments? Should those be tuning parameters so that with real > world use cases if we realise that it would be good if the eager scan > is getting selected more frequently or less frequently then we can > tune those parameters? The specific multipliers constants chosen (for MAX_PAGES_YOUNG_TABLEAGE and MAX_PAGES_OLD_TABLEAGE) were based on both experiments and intuition. The precise values could be somewhat different without it really mattering, though. For example, with a table like pgbench_history (which is a really important case for the patch in general), there won't be any all-visible pages at all (at least after a short while), so it won't matter what these constants are -- eager scanning will always be chosen. I don't think that they should be parameters. The useful parameter for users remains vacuum_freeze_table_age/autovacuum_freeze_max_age (note that vacuum_freeze_table_age usually gets its value from autovacuum_freeze_max_age due to changes in 0002). Like today, vacuum_freeze_table_age forces VACUUM to scan all not-all-frozen pages so that relfrozenxid can be advanced. Unlike today, it forces eager scanning (not aggressive mode). But even long before eager scanning is *forced*, pressure to use eager scanning gradually builds. That pressure will usually cause some VACUUM to use eager scanning before it's strictly necessary. Overall, vacuum_freeze_table_age/autovacuum_freeze_max_age now provide loose guidance. It really has to be loose in this sense in order for lazy_scan_strategy() to have the freedom to do the right thing based on the characteristics of the table as a whole, according to its visibility map snapshot. This allows lazy_scan_strategy() to stumble upon once-off opportunities to advance relfrozenxid inexpensively, including cases where it could never happen with the current model. These opportunities are side-effects of workload characteristics that can be hard to predict [1][2]. > I think this should be moved as first if case, I mean why to do all > the calculations based on the 'tableagefrac' and > 'TABLEAGEFRAC_XXPOINT' if we are forced to scan them all. I agree the > extra computation we are doing might not really matter compared to the > vacuum work we are going to perform but still seems logical to me to > do the simple check first. This is only needed for DISABLE_PAGE_SKIPPING, which is an escape hatch option that is never supposed to be needed. I don't think that it's worth going to the trouble of indenting the code more just so this is avoided -- it really is an afterthought. Besides, the compiler might well be doing this for us. > 4. Should we move prefetching as a separate patch, instead of merging > with the scanning strategy? I don't think that breaking that out would be an improvement. A lot of the prefetching stuff informs how the visibility map code is structured. [1] https://wiki.postgresql.org/wiki/Freezing/skipping_strategies_patch:_motivating_examples#Patch_3 [2] https://wiki.postgresql.org/wiki/Freezing/skipping_strategies_patch:_motivating_examples#Opportunistically_advancing_relfrozenxid_with_bursty.2C_real-world_workloads -- Peter Geoghegan
Commits
-
Revert "Add eager and lazy freezing strategies to VACUUM."
- 6c6b49726644 16.0 landed
-
Add eager and lazy freezing strategies to VACUUM.
- 4d4179926139 16.0 landed
-
Refine the definition of page-level freezing.
- b37a08323964 16.0 landed
-
Avoid special XID snapshotConflictHorizon values.
- 6daeeb1f9196 16.0 cited
-
Add page-level freezing to VACUUM.
- 1de58df4fec7 16.0 landed
-
Remove overzealous MultiXact freeze assertion.
- 63c844a0a5d7 16.0 landed
-
Refactor how VACUUM passes around its XID cutoffs.
- 4ce3afb82ecf 16.0 landed
-
Deduplicate freeze plans in freeze WAL records.
- 9e5405993c1e 16.0 cited
-
Set relfrozenxid to oldest extant XID seen by VACUUM.
- 0b018fabaaba 15.0 cited
-
Only skip pages marked as clean in the visibility map, if the last 32
- bf136cf6e376 8.4.0 cited
-
Add vacuum_freeze_table_age GUC option, to control when VACUUM should
- 6587818542e7 8.4.0 cited