Обсуждение: Allowing VACUUM to time out when waiting for locks?

Поиск
Список
Период
Сортировка

Allowing VACUUM to time out when waiting for locks?

От
Philip Warner
Дата:
We have a frequently updated (peak > 5/sec) table with about 1000 rows.

We run VACCUM FULL on this table every 5 minutes.

The regular updates are not long in duration, and the vacuum is fast, so they
do not produce noticeable delays.

When we run a pg_dump on the database:

- the dump takes a long standing AccessShareLock lock on this table
(the database is large, and the table is locked for the duration).

- the regular updates run quite happily

- the VACUUM FULL comes along and asks for a AccessExclusiveLock  (which is not granted due to PG_DUMP).

- the regular updates hang until the dump completes

Is it possible to set up a vacuum to fail if a lock is not granted in
a limited period of time (eg. 1 minute)?

We could use lock files to synchronize our dumps with our vacuums, but
were hoping for a way of managing this within the DB so that ad-hoc dumps
will not cause a problem.


----------------------------------------------------------------
Philip Warner                    |     __---_____
Albatross Consulting Pty. Ltd.   |----/       -  \
(A.B.N. 75 008 659 498)          |          /(@)   ______---_
Tel: (+61) 0500 83 82 81         |                 _________  \
Fax: (+61) 03 5330 3172          |                 ___________ |
Http://www.rhyme.com.au          |                /           \|                                 |    --________--
PGP key available upon request,  |  /
and from pgp.mit.edu:11371       |/ 



Re: Allowing VACUUM to time out when waiting for locks?

От
Bruno Wolff III
Дата:
On Sun, Jan 30, 2005 at 01:23:11 +1100, Philip Warner <pjw@rhyme.com.au> wrote:
> 
> We have a frequently updated (peak > 5/sec) table with about 1000 rows.
> 
> We run VACCUM FULL on this table every 5 minutes.

Why not just use plain VACUUM? The table will reach a steady state size.
You should only need to use VACUUM FULL if an event causes the table
to bloat to significantly more than steady state size and you want to reduce
the size again.


Re: Allowing VACUUM to time out when waiting for locks?

От
Tom Lane
Дата:
Philip Warner <pjw@rhyme.com.au> writes:
> We have a frequently updated (peak > 5/sec) table with about 1000 rows.
> We run VACCUM FULL on this table every 5 minutes.

I agree with Bruno's comment that you shouldn't be doing that in the
first place.  Plain vacuum (perhaps executed even more often, like
once a minute) will cause fewer locking headaches.

> Is it possible to set up a vacuum to fail if a lock is not granted in
> a limited period of time (eg. 1 minute)?

I think you could do that by setting a statement timeout.
        regards, tom lane


Re: Allowing VACUUM to time out when waiting for

От
Philip Warner
Дата:
At 02:53 AM 30/01/2005, Tom Lane wrote:
>Philip Warner <pjw@rhyme.com.au> writes:
> > We have a frequently updated (peak > 5/sec) table with about 1000 rows.
> > We run VACCUM FULL on this table every 5 minutes.
>
>Plain vacuum (perhaps executed even more often, like
>once a minute) will cause fewer locking headaches.

We have done both in the past, but found some tables still just grew 
(perhaps just because of infrequent locks that prevented the plain VACUUM). 
I'll go back to the plain VACUUM and monitor the table growth.

Am I correct in saying that the FSM now tracks the entire table, and that 
the FSM parameters just determine how much is stored in memory?


>I think you could do that by setting a statement timeout.

This would be a good solution if we still see growth with plain VACUUM.


Is any type of opportunistic locking likely/planned for a future version 
(ie. a has lock, b asks for conflicting lock, c asks for lock that is OK 
with a but denied by b; so c's lock is allowed and b stays waiting).




----------------------------------------------------------------
Philip Warner                    |     __---_____
Albatross Consulting Pty. Ltd.   |----/       -  \
(A.B.N. 75 008 659 498)          |          /(@)   ______---_
Tel: (+61) 0500 83 82 81         |                 _________  \
Fax: (+61) 03 5330 3172          |                 ___________ |
Http://www.rhyme.com.au          |                /           \|                                 |    --________--
PGP key available upon request,  |  /
and from pgp.mit.edu:11371       |/ 



Re: Allowing VACUUM to time out when waiting for locks?

От
Tom Lane
Дата:
Philip Warner <pjw@rhyme.com.au> writes:
> Am I correct in saying that the FSM now tracks the entire table, and that 
> the FSM parameters just determine how much is stored in memory?

No.  Any free space that can't be remembered in FSM is lost to use.
(Not completely --- an update of a row on the same page can reuse it ---
but for the most part you want to make FSM large enough to remember all
the useful free space.)

> Is any type of opportunistic locking likely/planned for a future version 
> (ie. a has lock, b asks for conflicting lock, c asks for lock that is OK 
> with a but denied by b; so c's lock is allowed and b stays waiting).

That's deliberately disallowed by the current logic because of the risk
of starving b indefinitely.  IIRC it would be a trivial code change to
do the other, but I doubt it's a good idea.  The typical situation is
exactly a VACUUM that wants an exclusive lock, versus a fairly
continuous stream of shared lock requests for select/insert/update/delete.
        regards, tom lane