Re: [HACKERS] Autovacuum Improvements

Steve Atkins <steve@blighty.com>

From: Steve Atkins <steve@blighty.com>
To: pgsql-hackers@postgresql.org, pgsql general <pgsql-general@postgresql.org>
Date: 2007-01-22T23:39:10Z
Lists: pgsql-hackers
On Jan 22, 2007, at 11:16 AM, Richard Huxton wrote:

> Bruce Momjian wrote:
>> Yep, agreed on the random I/O issue.  The larger question is if  
>> you have
>> a huge table, do you care to reclaim 3% of the table size, rather  
>> than
>> just vacuum it when it gets to 10% dirty?  I realize the vacuum is  
>> going
>> to take a lot of time, but vacuuming to relaim 3% three times  
>> seems like
>> it is going to be more expensive than just vacuuming the 10%  
>> once.  And
>> vacuuming to reclaim 1% ten times seems even more expensive.  The
>> partial vacuum idea is starting to look like a loser to me again.
>
> Buying a house with a 25-year mortgage is much more expensive than  
> just paying cash too, but you don't always have a choice.
>
> Surely the key benefit of the partial vacuuming thing is that you  
> can at least do something useful with a large table if a full  
> vacuum takes 24 hours and you only have 4 hours of idle I/O.
>
> It's also occurred to me that all the discussion of scheduling way  
> back when isn't directly addressing the issue. What most people  
> want (I'm guessing) is to vacuum *when the user-workload allows*  
> and the time-tabling is just a sysadmin first-approximation at that.

Yup. I'd really like for my app to be able to say "Hmm. No  
interactive users at the moment, no critical background tasks. Now  
would be a really good time for the DB to do some maintenance." but  
also to be able to interrupt the maintenance process if some new  
users or other system load show up.

> With partial vacuuming possible, we can arrange things with just  
> three thresholds and two measurements:
>   Measurement 1 = system workload
>   Measurement 2 = a per-table "requires vacuuming" value
>   Threshold 1 = workload at which we do more vacuuming
>   Threshold 2 = workload at which we do less vacuuming
>   Threshold 3 = point at which a table is considered worth vacuuming.
> Once every 10 seconds, the manager compares the current workload to  
> the thresholds and starts a new vacuum, kills one or does nothing.  
> New vacuum processes keep getting started as long as there is  
> workload spare and tables that need vacuuming.
>
> Now the trick of course is how you measure system workload in a  
> meaningful manner.

I'd settle for a "start maintenance", "stop maintenance" API.  
Anything else (for instance the heuristics you suggest above) would  
definitely be gravy.

It's not going to be simple to do, though, I don't think.

Cheers,
   Steve