Обсуждение: Problem with autovacuum and pg_autovacuum
Hello,
we got a small problem with auto_vacuum: since we have some big tables
which have heavy read/write access, we tried to exclude this tables
from autovacuum:
database1=# select vacrelid,enabled,(select relname from pg_class where oid=vacrelid) as relname from pg_autovacuum;
vacrelid | enabled | relname
----------+---------+----------------------
42041 | f | guestbook
42344 | f | forum_threads
42406 | f | forum_thread_entries
41937 | f | user_online
42255 | f | forum_fora
41570 | f | users
41694 | f | user_data
(7 rows)
Now it seems, that autovacuum is processing exactly this tables:
2007-07-04 22:37:05 CEST DEBUG: autovacuum: processing database "database1"
2007-07-04 22:37:06 CEST DEBUG: autovac: will VACUUM ANALYZE users
2007-07-04 22:37:06 CEST DEBUG: autovac: will VACUUM ANALYZE user_stats
2007-07-04 22:37:06 CEST DEBUG: autovac: will VACUUM ANALYZE guestbook
2007-07-04 22:37:06 CEST DEBUG: autovac: will VACUUM ANALYZE forum_fora
2007-07-04 22:37:06 CEST DEBUG: autovac: will VACUUM ANALYZE forum_threads
2007-07-04 22:37:06 CEST DEBUG: autovac: will VACUUM ANALYZE forum_thread_entries
2007-07-04 22:37:06 CEST DEBUG: autovac: will VACUUM ANALYZE user_data
2007-07-04 22:37:06 CEST DEBUG: autovac: will VACUUM ANALYZE user_online
2007-07-04 22:37:06 CEST DEBUG: vacuuming "schema1.users"
2007-07-04 22:38:39 CEST DEBUG: vacuuming "pg_toast.pg_toast_41570"
2007-07-04 22:38:47 CEST DEBUG: vacuuming "schema1.user_stats"
2007-07-04 22:49:06 CEST DEBUG: vacuuming "pg_toast.pg_toast_43602"
2007-07-04 22:51:51 CEST DEBUG: vacuuming "schema1.guestbook"
2007-07-04 23:00:38 CEST DEBUG: vacuuming "pg_toast.pg_toast_42041"
2007-07-04 23:00:43 CEST DEBUG: vacuuming "schema1.forum_fora"
2007-07-04 23:00:50 CEST DEBUG: vacuuming "pg_toast.pg_toast_42255"
2007-07-04 23:00:50 CEST DEBUG: vacuuming "schema1.forum_threads"
2007-07-04 23:01:06 CEST DEBUG: vacuuming "schema1.forum_thread_entries"
2007-07-04 23:01:50 CEST DEBUG: vacuuming "pg_toast.pg_toast_42406"
2007-07-04 23:01:54 CEST DEBUG: vacuuming "schema1.user_data"
2007-07-04 23:05:36 CEST DEBUG: vacuuming "pg_toast.pg_toast_41694"
2007-07-04 23:05:45 CEST DEBUG: vacuuming "schema1.user_online"
database1=# select version();
version
-----------------------------------------------------------------------------------------------------------------
PostgreSQL 8.2.4 on x86_64-pc-linux-gnu, compiled by GCC cc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
(1 row)
Any idea, what's wrong here?
Kind regards
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Andreas 'ads' Scherbaum wrote: > > Hello, > > we got a small problem with auto_vacuum: since we have some big tables > which have heavy read/write access, we tried to exclude this tables > from autovacuum: > > database1=# select vacrelid,enabled,(select relname from pg_class where oid=vacrelid) as relname from pg_autovacuum; > vacrelid | enabled | relname > ----------+---------+---------------------- > 42041 | f | guestbook > 42344 | f | forum_threads > 42406 | f | forum_thread_entries > 41937 | f | user_online > 42255 | f | forum_fora > 41570 | f | users > 41694 | f | user_data > (7 rows) Most likely it is worried about XID wraparound, and those are precisely the tables that need urgent vacuumed because they haven't been vacuumed in a long time. What do you do to keep them clear of dead tuples? -- Alvaro Herrera http://www.CommandPrompt.com/ PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Hello,
On Wed, 4 Jul 2007 18:04:35 -0400 Alvaro Herrera wrote:
> Most likely it is worried about XID wraparound, and those are precisely
> the tables that need urgent vacuumed because they haven't been vacuumed
> in a long time.
No, autovacuum is doing this with every run. Beside this, the database has
only some 10k changes per day. The wraparound was my first idea, but i
don't see a reason, why this should be happen with every autovacuum run.
> What do you do to keep them clear of dead tuples?
Most of this tables are just big (guestbook or forum entries as example).
But there will be no dead tuples, since the entries are inserted and never
changed. The main reason for putting this tables into the pg_autovacuum
table was to avoid the locks at all with normal autovacuum processing
and analyze the tables in a nightly maintenance window.
Kind regards
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Andreas 'ads' Scherbaum wrote:
>
> Hello,
>
> On Wed, 4 Jul 2007 18:04:35 -0400 Alvaro Herrera wrote:
>
> > Most likely it is worried about XID wraparound, and those are precisely
> > the tables that need urgent vacuumed because they haven't been vacuumed
> > in a long time.
>
> No, autovacuum is doing this with every run. Beside this, the database has
> only some 10k changes per day. The wraparound was my first idea, but i
> don't see a reason, why this should be happen with every autovacuum run.
Ok a new weird scenario. Could you please let us look at
select relname, relfrozenxid, age(relfrozenxid) from pg_class where
relkind in ('r', 't') order by 3 desc;
and
select datfrozenxid, age(datfrozenxid) from pg_database where
datname = 'your database';
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
Hello,
On Wed, 4 Jul 2007 18:40:15 -0400 Alvaro Herrera wrote:
> Andreas 'ads' Scherbaum wrote:
> >
> > On Wed, 4 Jul 2007 18:04:35 -0400 Alvaro Herrera wrote:
> >
> > > Most likely it is worried about XID wraparound, and those are precisely
> > > the tables that need urgent vacuumed because they haven't been vacuumed
> > > in a long time.
> >
> > No, autovacuum is doing this with every run. Beside this, the database has
> > only some 10k changes per day. The wraparound was my first idea, but i
> > don't see a reason, why this should be happen with every autovacuum run.
>
> Ok a new weird scenario. Could you please let us look at
>
> select relname, relfrozenxid, age(relfrozenxid) from pg_class where
> relkind in ('r', 't') order by 3 desc;
Thats a bit more information ...
http://rafb.net/p/xJ4W6W43.html
> select datfrozenxid, age(datfrozenxid) from pg_database where
> datname = 'your database';
database1=# select datfrozenxid, age(datfrozenxid) from pg_database where datname = 'database1';
datfrozenxid | age
--------------+----------
524 | 35952722
(1 row)
Kind regards
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Andreas 'ads' Scherbaum wrote:
>
> Hello,
>
> On Wed, 4 Jul 2007 18:40:15 -0400 Alvaro Herrera wrote:
>
> > Andreas 'ads' Scherbaum wrote:
> > >
> > > On Wed, 4 Jul 2007 18:04:35 -0400 Alvaro Herrera wrote:
> > >
> > > > Most likely it is worried about XID wraparound, and those are precisely
> > > > the tables that need urgent vacuumed because they haven't been vacuumed
> > > > in a long time.
> > >
> > > No, autovacuum is doing this with every run. Beside this, the database has
> > > only some 10k changes per day. The wraparound was my first idea, but i
> > > don't see a reason, why this should be happen with every autovacuum run.
> >
> > Ok a new weird scenario. Could you please let us look at
> >
> > select relname, relfrozenxid, age(relfrozenxid) from pg_class where
> > relkind in ('r', 't') order by 3 desc;
>
> Thats a bit more information ...
>
> http://rafb.net/p/xJ4W6W43.html
Oh. It's not the age. Please let us look at the pg_stat_user_tables
entries for the involved tables? If it's picking the same tables maybe
pgstats has stale info, but why is it not updating it?
--
Alvaro Herrera http://www.amazon.com/gp/registry/5ZYLFMCVHXC
"The problem with the facetime model is not just that it's demoralizing, but
that the people pretending to work interrupt the ones actually working."
(Paul Graham)
On 7/5/07, Andreas 'ads' Scherbaum <adsmail@wars-nicht.de> wrote:
Hello,
On Wed, 4 Jul 2007 18:04:35 -0400 Alvaro Herrera wrote:
> Most likely it is worried about XID wraparound, and those are precisely
> the tables that need urgent vacuumed because they haven't been vacuumed
> in a long time.
No, autovacuum is doing this with every run. Beside this, the database has
only some 10k changes per day. The wraparound was my first idea, but i
don't see a reason, why this should be happen with every autovacuum run.
Did you check freeze_max_age values in the pg_autovacuum table ? A very
small value can trigger XID wraparound related VACUUMs in every run.
Thanks,
Pavan
--
Pavan Deolasee
EnterpriseDB http://www.enterprisedb.com
On Wed, 4 Jul 2007 19:47:12 -0400 Alvaro Herrera wrote:
> Andreas 'ads' Scherbaum wrote:
>
> Oh. It's not the age. Please let us look at the pg_stat_user_tables
> entries for the involved tables? If it's picking the same tables maybe
> pgstats has stale info, but why is it not updating it?
Hmm, maybe because all the columns have '0' values ...
stats_row_level is on and stats_start_collector is on default (on).
Greetings from italy
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
On Fri, 6 Jul 2007 11:30:19 +0530 Pavan Deolasee wrote:
Hello,
> On 7/5/07, Andreas 'ads' Scherbaum <adsmail@wars-nicht.de> wrote:
> >
> > On Wed, 4 Jul 2007 18:04:35 -0400 Alvaro Herrera wrote:
> >
> > > Most likely it is worried about XID wraparound, and those are precisely
> > > the tables that need urgent vacuumed because they haven't been vacuumed
> > > in a long time.
> >
> > No, autovacuum is doing this with every run. Beside this, the database has
> > only some 10k changes per day. The wraparound was my first idea, but i
> > don't see a reason, why this should be happen with every autovacuum run.
> >
> Did you check freeze_max_age values in the pg_autovacuum table ? A very
> small value can trigger XID wraparound related VACUUMs in every run.
The value is '0' for all columns in all entries, except 'vacrelid' and 'enabled'.
Can a VACUUM run happen, even if enabled is set to false?
Greetings from Italy
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Andreas 'ads' Scherbaum wrote: > On Fri, 6 Jul 2007 11:30:19 +0530 Pavan Deolasee wrote: > > Hello, > > > On 7/5/07, Andreas 'ads' Scherbaum <adsmail@wars-nicht.de> wrote: > > > > > > On Wed, 4 Jul 2007 18:04:35 -0400 Alvaro Herrera wrote: > > > > > > > Most likely it is worried about XID wraparound, and those are precisely > > > > the tables that need urgent vacuumed because they haven't been vacuumed > > > > in a long time. > > > > > > No, autovacuum is doing this with every run. Beside this, the database has > > > only some 10k changes per day. The wraparound was my first idea, but i > > > don't see a reason, why this should be happen with every autovacuum run. > > > > > Did you check freeze_max_age values in the pg_autovacuum table ? A very > > small value can trigger XID wraparound related VACUUMs in every run. > > The value is '0' for all columns in all entries, except 'vacrelid' and 'enabled'. > Can a VACUUM run happen, even if enabled is set to false? Huh, try putting -1 in all columns instead. 0 is a nasty value to have in there. I haven't tested the effects but if freeze_max_age is 0 it may be doing what Pavan says. A fix is pending for out-of-range values in pg_autovacuum, per Galy Lee. I should have worked harder at moving this stuff into pg_class.reloptions, which would have meant less problems since there would be no need to put values to those variables in the first place :-( Sorry. -- Alvaro Herrera http://www.CommandPrompt.com/ The PostgreSQL Company - Command Prompt, Inc.
On Fri, 6 Jul 2007 12:06:41 -0400 Alvaro Herrera wrote:
> Andreas 'ads' Scherbaum wrote:
> > On Fri, 6 Jul 2007 11:30:19 +0530 Pavan Deolasee wrote:
> >
> > > On 7/5/07, Andreas 'ads' Scherbaum <adsmail@wars-nicht.de> wrote:
> > > >
> > > > On Wed, 4 Jul 2007 18:04:35 -0400 Alvaro Herrera wrote:
> > > >
> > > > > Most likely it is worried about XID wraparound, and those are precisely
> > > > > the tables that need urgent vacuumed because they haven't been vacuumed
> > > > > in a long time.
> > > >
> > > > No, autovacuum is doing this with every run. Beside this, the database has
> > > > only some 10k changes per day. The wraparound was my first idea, but i
> > > > don't see a reason, why this should be happen with every autovacuum run.
> > > >
> > > Did you check freeze_max_age values in the pg_autovacuum table ? A very
> > > small value can trigger XID wraparound related VACUUMs in every run.
> >
> > The value is '0' for all columns in all entries, except 'vacrelid' and 'enabled'.
> > Can a VACUUM run happen, even if enabled is set to false?
>
> Huh, try putting -1 in all columns instead. 0 is a nasty value to have
> in there. I haven't tested the effects but if freeze_max_age is 0 it
> may be doing what Pavan says.
Ok, did this. Will take a look, what autovacuum is doing now.
Thanks for the help
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
On Sat, 7 Jul 2007 00:12:32 +0200 Andreas 'ads' Scherbaum wrote:
> On Fri, 6 Jul 2007 12:06:41 -0400 Alvaro Herrera wrote:
>
> > Andreas 'ads' Scherbaum wrote:
> > > The value is '0' for all columns in all entries, except 'vacrelid' and 'enabled'.
> > > Can a VACUUM run happen, even if enabled is set to false?
> >
> > Huh, try putting -1 in all columns instead. 0 is a nasty value to have
> > in there. I haven't tested the effects but if freeze_max_age is 0 it
> > may be doing what Pavan says.
>
> Ok, did this. Will take a look, what autovacuum is doing now.
Seems like that was the problem. I changed all '0' to '-1' and VACUUM is
skipping this tables now.
Thanks for finding this out
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Andreas 'ads' Scherbaum wrote: > On Sat, 7 Jul 2007 00:12:32 +0200 Andreas 'ads' Scherbaum wrote: > > > On Fri, 6 Jul 2007 12:06:41 -0400 Alvaro Herrera wrote: > > > > > Andreas 'ads' Scherbaum wrote: > > > > The value is '0' for all columns in all entries, except 'vacrelid' and 'enabled'. > > > > Can a VACUUM run happen, even if enabled is set to false? > > > > > > Huh, try putting -1 in all columns instead. 0 is a nasty value to have > > > in there. I haven't tested the effects but if freeze_max_age is 0 it > > > may be doing what Pavan says. > > > > Ok, did this. Will take a look, what autovacuum is doing now. > > Seems like that was the problem. I changed all '0' to '-1' and VACUUM is > skipping this tables now. > > > Thanks for finding this out Oops :-( We should certainly make an effort to check the validity of the values in pg_autovacuum, but 0 is a perfectly valid value, so the check would not help you any in this case :-( -- Alvaro Herrera http://www.PlanetPostgreSQL.org/ "Right now the sectors on the hard disk run clockwise, but I heard a rumor that you can squeeze 0.2% more throughput by running them counterclockwise. It's worth the effort. Recommended." (Gerry Pourwelle)
On Sun, 8 Jul 2007 19:12:46 -0400 Alvaro Herrera wrote:
> Oops :-( We should certainly make an effort to check the validity of
> the values in pg_autovacuum, but 0 is a perfectly valid value, so the
> check would not help you any in this case :-(
Apparently not, taken into account, that the 'enabled' column was set
to false. So the question remains, why autovacuum is not checking
this column first and then skip other calculations in the case, the table
is not activated at all.
Thinking more forward: would it make sense to have some kind of helper
in the database which gives (if enabled) notices back, if you are doing
something crazy? As example insert a value into a serial column (would
not be wrong and can be perfectly valid but for a beginner this could just
be a problem), maybe some helps from the planner about index usage or
missing index or in case of pg_autovacuum give some hints about
values which seem to create problems.
Kind regards
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)