Hi all,

I have a problem with autovacuum apparently not doing the job I need it to do.

I have a table named datasession that is frequently inserted, updated and 
deleted from.  Typically the table will have a few thousand rows in it.  Each 
row typically survives a few days and is updated every 5 - 10 mins.  The 
application receives unreliable, potentially duplicate data from its source, so 
this table is heavily used for synchronising application threads as well.  A 
typical access pattern is:

- tx begin
- SELECT FOR UPDATE on a single row
- Do some application processing (1 - 100 ms)
- Possibly UPDATE the row
- tx commit

In a few instances of our application we're seeing this table grow obscenely to 
the point where our monitoring servers get us out of bed to manually vacuum.  I 
like sleep, so I want to fix this =D

I've read some recent threads and found a discussion (below) on auto vacuum 
that mentions auto vacuum will be cancelled when a client requests a lock that 
auto vacuum is using… My questions:

1) Does it look like I'm affected by the same problem as in the below 
discussion?

2) Are there better solutions to this problem than a periodic task that 
vacuums/truncates-and-rebuilds the table?  


Perhaps relevant info:


# select version();
                                             version                            
                  
--------------------------------------------------------------------------------------------------
 PostgreSQL 8.3.12 on x86_64-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.4 
(Ubuntu 4.2.4-1ubuntu3)
(1 row)

Auto vacuum and vacuum parameters are set to the factory defaults.

Cheers,

--Royce

> From: Tom Lane <t...@sss.pgh.pa.us>
> Subject: Re: [GENERAL] Vacuum as "easily obtained" locks 
> Date: 4 August 2011 1:52:02 AM AEST
> To: Michael Graham <mgra...@bloxx.com>
> Cc: Pavan Deolasee <pavan.deola...@gmail.com>, pgsql-gene...@postgresql.org
> 
>>> On Wed, 2011-08-03 at 11:40 -0400, Tom Lane wrote:
>>> The other problem is that once autovacuum has gotten the lock, it has
>>> to keep it for long enough to re-scan the truncatable pages (to make
>>> sure they're still empty).  And it is set up so that any access to the
>>> table will kick autovacuum off the lock.  An access pattern like that
>>> would very likely prevent it from ever truncating, if there are a lot
>>> of pages that need to be truncated.  (There's been some discussion of
>>> modifying this behavior, but nothing's been done about it yet.) 

> Michael Graham <mgra...@bloxx.com> writes:
>> Ah!  This looks like it is very much the issue.  Since I've got around
>> 150GB of data that should be truncatable and a select every ~2s.
> 
>> Just to confirm would postgres write:
> 
>> 2011-08-03 16:09:55 BST ERROR:  canceling autovacuum task
>> 2011-08-03 16:09:55 BST CONTEXT:  automatic vacuum of table
>> "traffic.public.logdata5queue"
> 
>> Under those circumstances?
> 
> Yup ...
> 
> If you do a manual VACUUM, it won't allow itself to get kicked off the
> lock ... but as noted upthread, that will mean your other queries get
> blocked till it's done.  Not sure there's any simple fix for this that
> doesn't involve some downtime.
> 
>                       regards, tom lane
> 
> -- 
> Sent via pgsql-general mailing list (pgsql-gene...@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general


Reply via email to