Re: New strategies for freezing, advancing relfrozenxid early
Matthias van de Meent <boekewurm+postgres@gmail.com>
On Wed, 14 Dec 2022 at 00:07, Peter Geoghegan <pg@bowt.ie> wrote: > > On Tue, Dec 13, 2022 at 9:16 AM Peter Geoghegan <pg@bowt.ie> wrote: > > That's not the only thing we care about, though. And to the extent we > > care about it, we mostly care about the consequences of either > > freezing or not freezing eagerly. Concentration of unfrozen pages in > > one particular table is a lot more of a concern than the same number > > of heap pages being spread out across multiple tables. Those tables > > can all be independently vacuumed, and come with their own > > relfrozenxid, that can be advanced independently, and are very likely > > to be frozen as part of a vacuum that needed to happen anyway. > > At the suggestion of Jeff, I wrote a Wiki page that shows motivating > examples for the patch series: > > https://wiki.postgresql.org/wiki/Freezing/skipping_strategies_patch:_motivating_examples > > These are all cases where VACUUM currently doesn't do the right thing > around freezing, in a way that is greatly ameliorated by the patch. > Perhaps this will help other hackers to understand the motivation > behind some of these mechanisms. There are plenty of details that only > make sense in the context of a certain kind of table, with certain > performance characteristics that the design is sensitive to, and seeks > to take advantage of in one way or another. In this mentioned wiki page, section "Simple append-only", the following is written: > Our "transition from lazy to eager strategies" concludes with an autovacuum that actually advanced relfrozenxid eagerly: >> automatic vacuum of table "regression.public.pgbench_history": index scans: 0 >> pages: 0 removed, 1078444 remain, 561143 scanned (52.03% of total) >> [...] >> frozen: 560841 pages from table (52.00% of total) had 88051825 tuples frozen >> [...] >> WAL usage: 1121683 records, 557662 full page images, 4632208091 bytes I think that this 'transition from lazy to eager' could benefit from a limit on how many all_visible blocks each autovacuum iteration can freeze. This first run of (auto)vacuum after the 8GB threshold seems to appear as a significant IO event (both in WAL and relation read/write traffic) with 50% of the table updated and WAL-logged. I think this should be limited to some degree, such as only freeze all_visible blocks up to 10% of the table's blocks in eager vacuum, so that the load is spread across a larger time frame and more VACUUM runs. Kind regards, Matthias van de Meent.
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