Re: Removing more vacuumlazy.c special cases, relfrozenxid optimizations - Mailing list pgsql-hackers
From | Robert Haas |
---|---|
Subject | Re: Removing more vacuumlazy.c special cases, relfrozenxid optimizations |
Date | |
Msg-id | CA+TgmobKJm9BsZR3ETeb6MJdLKWxKK5ZXx0XhLf-W9kUgvOcNA@mail.gmail.com Whole thread Raw |
In response to | Re: Removing more vacuumlazy.c special cases, relfrozenxid optimizations (Peter Geoghegan <pg@bowt.ie>) |
Responses |
Re: Removing more vacuumlazy.c special cases, relfrozenxid optimizations
|
List | pgsql-hackers |
On Fri, Dec 17, 2021 at 9:30 PM Peter Geoghegan <pg@bowt.ie> wrote: > Can we fully get rid of vacuum_freeze_table_age? Maybe even get rid of > vacuum_freeze_min_age, too? Freezing tuples is a maintenance task for > physical blocks, but we use logical units (XIDs). I don't see how we can get rid of these. We know that catastrophe will ensue if we fail to freeze old XIDs for a sufficiently long time --- where sufficiently long has to do with the number of XIDs that have been subsequently consumed. So it's natural to decide whether or not we're going to wait for cleanup locks on pages on the basis of how old the XIDs they contain actually are. Admittedly, that decision doesn't need to be made at the start of the vacuum, as we do today. We could happily skip waiting for a cleanup lock on pages that contain only newer XIDs, but if there is a page that both contains an old XID and stays pinned for a long time, we eventually have to sit there and wait for that pin to be released. And the best way to decide when to switch to that strategy is really based on the age of that XID, at least as I see it, because it is the age of that XID reaching 2 billion that is going to kill us. I think vacuum_freeze_min_age also serves a useful purpose: it prevents us from freezing data that's going to be modified again or even deleted in the near future. Since we can't know the future, we must base our decision on the assumption that the future will be like the past: if the page hasn't been modified for a while, then we should assume it's not likely to be modified again soon; otherwise not. If we knew the time at which the page had last been modified, it would be very reasonable to use that here - say, freeze the XIDs if the page hasn't been touched in an hour, or whatever. But since we lack such timestamps the XID age is the closest proxy we have. > The > risk mostly comes from how much total work we still need to do to > advance relfrozenxid. If the single old XID is quite old indeed (~1.5 > billion XIDs), but there is only one, then we just have to freeze one > tuple to be able to safely advance relfrozenxid (maybe advance it by a > huge amount!). How long can it take to freeze one tuple, with the > freeze map, etc? I don't really see any reason for optimism here. There could be a lot of unfrozen pages in the relation, and we'd have to troll through all of those in order to find that single old XID. Moreover, there is nothing whatsoever to focus autovacuum's attention on that single old XID rather than anything else. Nothing in the autovacuum algorithm will cause it to focus its efforts on that single old XID at a time when there's no pin on the page, or at a time when that XID becomes the thing that's holding back vacuuming throughout the cluster. A lot of vacuum problems that users experience today would be avoided if autovacuum had perfect knowledge of what it ought to be prioritizing at any given time, or even some knowledge. But it doesn't, and is often busy fiddling while Rome burns. IOW, the time that it takes to freeze that one tuple *in theory* might be small. But in practice it may be very large, because we won't necessarily get around to it on any meaningful time frame. -- Robert Haas EDB: http://www.enterprisedb.com
pgsql-hackers by date: