Re: Removing more vacuumlazy.c special cases, relfrozenxid optimizations
Robert Haas <robertmhaas@gmail.com>
On Thu, Jan 13, 2022 at 4:27 PM Peter Geoghegan <pg@bowt.ie> wrote: > 1. Cases where our inability to get a cleanup lock signifies nothing > at all about the page in question, or any page in the same table, with > the same workload. > > 2. Pathological cases. Cases where we're at least at the mercy of the > application to do something about an idle cursor, where the situation > may be entirely hopeless on a long enough timeline. (Whether or not it > actually happens in the end is less significant.) Sure. I'm worrying about case (2). I agree that in case (1) waiting for the lock is almost always the wrong idea. > I think that you're focussing on individual VACUUM operations, whereas > I'm more concerned about the aggregate effect of a particular policy > over time. I don't think so. I think I'm worrying about the aggregate effect of a particular policy over time *in the pathological cases* i.e. (2). > This is my concern -- what I've called category 2 cases have this > exact quality. So given that, why not freeze what you can, elsewhere, > on other pages that don't have the same issue (presumably the vast > vast majority in the table)? That way you have the best possible > chance of recovering once the DBA gets a clue and fixes the issue. That's the part I'm not sure I believe. Imagine a table with a gigantic number of pages that are not yet all-visible, a small number of all-visible pages, and one page containing very old XIDs on which a cursor holds a pin. I don't think it's obvious that not waiting is best. Maybe you're going to end up vacuuming the table repeatedly and doing nothing useful. If you avoid vacuuming it repeatedly, you still have a lot of work to do once the DBA locates a clue. I think there's probably an important principle buried in here: the XID threshold that forces a vacuum had better also force waiting for pins. If it doesn't, you can tight-loop on that table without getting anything done. > That's kind of what I meant. The difference between 50 million and 150 > million is rather unclear indeed. So having accepted that that might > be true, why not be open to the possibility that it won't turn out to > be true in the long run, for any given table? With the enhancements > from the patch series in place (particularly the early freezing > stuff), what do we have to lose by making the FreezeLimit XID cutoff > for freezing much higher than your typical vacuum_freeze_min_age? > Maybe the same as autovacuum_freeze_max_age or vacuum_freeze_table_age > (it can't be higher than that without also making these other settings > become meaningless, of course). We should probably distinguish between the situation where (a) an adverse pin is held continuously and effectively forever and (b) adverse pins are held frequently but for short periods of time. I think it's possible to imagine a small, very hot table (or portion of a table) where very high concurrency means there are often pins. In case (a), it's not obvious that waiting will ever resolve anything, although it might prevent other problems like infinite looping. In case (b), a brief wait will do a lot of good. But maybe that doesn't even matter. I think part of your argument is that if we fail to update relfrozenxid for a while, that really isn't that bad. I think I agree, up to a point. One consequence of failing to immediately advance relfrozenxid might be that pg_clog and friends are bigger, but that's pretty minor. Another consequence might be that we might vacuum the table more times, which is more serious. I'm not really sure that can happen to a degree that is meaningful, apart from the infinite loop case already described, but I'm also not entirely sure that it can't. -- Robert Haas EDB: http://www.enterprisedb.com
Commits
-
Have VACUUM warn on relfrozenxid "in the future".
- e83ebfe6d767 15.0 landed
-
vacuumlazy.c: Further consolidate resource allocation.
- c42a6fc41dc2 15.0 landed
-
Generalize how VACUUM skips all-frozen pages.
- f3c15cbe5065 15.0 landed
-
Set relfrozenxid to oldest extant XID seen by VACUUM.
- 0b018fabaaba 15.0 landed
-
Doc: Add relfrozenxid Tip to XID wraparound section.
- 05023a237c05 15.0 landed
-
vacuumlazy.c: document vistest and OldestXmin.
- 73f6ec3d3c8d 15.0 cited
-
Increase hash_mem_multiplier default to 2.0.
- 8f388f6f554b 15.0 cited
-
Consolidate VACUUM xid cutoff logic.
- efa4a9462a07 15.0 landed
-
Add VACUUM instrumentation for scanned pages, relfrozenxid.
- 872770fd6ccf 15.0 landed
-
Simplify lazy_scan_heap's handling of scanned pages.
- 44fa84881fff 15.0 landed
-
Try to stabilize reloptions test, again.
- b700f96cffd9 15.0 cited
-
Unify VACUUM VERBOSE and autovacuum logging.
- 49c9d9fcfa9a 15.0 cited
-
Fix possible HOT corruption when RECENTLY_DEAD changes to DEAD while pruning.
- 18b87b201f73 15.0 cited
-
pg_resetxlog: add option to set oldest xid & use by pg_upgrade
- 74cf7d46a91d 15.0 cited
-
Teach VACUUM to bypass unnecessary index vacuuming.
- 5100010ee4d5 14.0 cited
-
Centralize horizon determination for temp tables, fixing bug due to skew.
- 94bc27b57680 14.0 cited
-
pg_surgery: Try to stabilize regression tests.
- 0811f766fd74 14.0 cited
-
Add "split after new tuple" nbtree optimization.
- f21668f328c8 12.0 cited
-
Fix bugs in vacuum of shared rels, by keeping their relcache entries current.
- a54e1f158779 11.0 cited
-
Avoid useless truncation attempts during VACUUM.
- e842908233bb 9.6.0 cited
-
Only skip pages marked as clean in the visibility map, if the last 32
- bf136cf6e376 8.4.0 cited
-
Fix recently-understood problems with handling of XID freezing, particularly
- 48188e1621bb 8.2.0 cited