We recently noticed that vacuum buffer counters wraparound in extreme cases, with ridiculous results. Example:
2020-01-06 16:38:38.010 EST [45625-1] app= LOG: automatic vacuum of table "somtab.sf.foobar": index scans: 17 pages: 0 removed, 207650641 remain, 0 skipped due to pins, 13419403 skipped frozen tuples: 141265419 removed, 3186614627 remain, 87783760 are dead but not yet removable buffer usage: -2022059267 hits, -17141881 misses, 1252507767 dirtied avg read rate: -0.043 MB/s, avg write rate: 3.146 MB/s system usage: CPU 107819.92s/2932957.75u sec elapsed 3110498.10 sec That's to be expected, as tables exist that are large enough for 4 billion buffer accesses to be a possibility. Let's widen the counters, as in the attached patch. I propose to backpatch this. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 8ce501151e..049ec2703b 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -614,7 +614,7 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params, vacrelstats->new_dead_tuples, OldestXmin); appendStringInfo(&buf, - _("buffer usage: %d hits, %d misses, %d dirtied\n"), + _("buffer usage: %zd hits, %zd misses, %zd dirtied\n"), VacuumPageHit, VacuumPageMiss, VacuumPageDirty); diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c index b1f6291b99..eb19644419 100644 --- a/src/backend/utils/init/globals.c +++ b/src/backend/utils/init/globals.c @@ -140,9 +140,9 @@ int VacuumCostPageDirty = 20; int VacuumCostLimit = 200; double VacuumCostDelay = 0; -int VacuumPageHit = 0; -int VacuumPageMiss = 0; -int VacuumPageDirty = 0; +int64 VacuumPageHit = 0; +int64 VacuumPageMiss = 0; +int64 VacuumPageDirty = 0; int VacuumCostBalance = 0; /* working state for vacuum */ bool VacuumCostActive = false; diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 62d64aa0a1..f985453ec3 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -252,9 +252,9 @@ extern int VacuumCostPageDirty; extern int VacuumCostLimit; extern double VacuumCostDelay; -extern int VacuumPageHit; -extern int VacuumPageMiss; -extern int VacuumPageDirty; +extern int64 VacuumPageHit; +extern int64 VacuumPageMiss; +extern int64 VacuumPageDirty; extern int VacuumCostBalance; extern bool VacuumCostActive;