Re: New strategies for freezing, advancing relfrozenxid early - Mailing list pgsql-hackers
From | Peter Geoghegan |
---|---|
Subject | Re: New strategies for freezing, advancing relfrozenxid early |
Date | |
Msg-id | CAH2-WznBEThxagQ7zy7=bfK+ev887BXpGAc4NfLG+hK+VPDZXw@mail.gmail.com Whole thread Raw |
In response to | Re: New strategies for freezing, advancing relfrozenxid early (Jeff Davis <pgsql@j-davis.com>) |
Responses |
Re: New strategies for freezing, advancing relfrozenxid early
|
List | 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
pgsql-hackers by date: