Re: New strategies for freezing, advancing relfrozenxid early
Peter Geoghegan <pg@bowt.ie>
From: Peter Geoghegan <pg@bowt.ie>
To: Jeff Davis <pgsql@j-davis.com>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2022-10-04T05:45:37Z
Lists: pgsql-hackers
On Mon, Oct 3, 2022 at 10:13 PM Jeff Davis <pgsql@j-davis.com> wrote: > Take the case where you load a lot of data in one transaction. After > the loading transaction finishes, those new pages will soon be marked > all-visible. > > In the future, vacuum runs will have to decide what to do. If a vacuum > decides to do an aggressive scan to freeze all of those pages, it may > be at some unfortunate time and disrupt the workload. But if it skips > them all, then it's just deferring the work until it runs up against > autovacuum_freeze_max_age, which might also be at an unfortunate time. Predicting the future accurately is intrinsically hard. We're already doing that today by freezing lazily. I think that we can come up with a better overall strategy, but there is always a risk that we'll come out worse off in some individual cases. I think it's worth it if it avoids ever really flying off the rails. > So how does your patch series handle this case? I assume there's some > mechanism to freeze a moderate number of pages without worrying about > advancing relfrozenxid? It mostly depends on whether or not the table exceeds the new vacuum_freeze_strategy_threshold GUC in size at the time of the VACUUM. This is 4GB by default, at least right now. The case where the table size doesn't exceed that threshold yet will see each VACUUM advance relfrozenxid when it happens to be very cheap to do so, in terms of the amount of extra scanned_pages. If the number of extra scanned_pages is less than 5% of the total table size (current rel_pages), then we'll advance relfrozenxid early by making sure to scan any all-visible pages. Actually, this scanned_pages threshold starts at 5%. It is usually 5%, but it will eventually start to grow (i.e. make VACUUM freeze eagerly more often) once table age exceeds 50% of autovacuum_freeze_max_age at the start of the VACUUM. So the skipping strategy threshold is more or less a blend of physical units (heap pages) and logical units (XID age). Then there is the case where it's already a larger table at the point a given VACUUM begins -- a table that ends up exceeding the same table size threshold, vacuum_freeze_strategy_threshold. When that happens we'll freeze all pages that are going to be marked all-visible as a matter of policy (i.e. use eager freezing strategy), so that the same pages can be marked all-frozen instead. We won't freeze pages that aren't full of all-visible tuples (except for LP_DEAD items), unless they have XIDs that are so old that vacuum_freeze_min_age triggers freezing. Once a table becomes larger than vacuum_freeze_strategy_threshold, VACUUM stops marking pages all-visible in the first place, consistently marking them all-frozen instead. So naturally there just cannot be any all-visible pages after the first eager freezing VACUUM (actually there are some obscure edge cases that can result in the odd all-visible page here or there, but this should be extremely rare, and have only negligible impact). Bigger tables always have pages frozen eagerly, and in practice always advance relfrozenxid early. In other words, eager freezing strategy implies eager freezing strategy -- though not the other way around. Again, these details that may change in the future. My focus is validating the high level concepts. So we avoid big spikes, and try to do the work when it's cheapest. -- 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