Обсуждение: Feedback on auto-pruning approach

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

Feedback on auto-pruning approach

От
"Mark Liberman"
Дата:

Hi,

We have a system build on PG 8.1 that is constantly running and adding data to a bunch of tables, and can grow by over a Gig a day.  We deliver this as a packaged solution on a server that runs unattended.  So, we need to make sure we delete some of the data periodically (we have auto-vacuum running to minimize the amount of obsolete tuples).  What I am working on is a solution to delete the appropriate amount of historical data at any time to keep the free disk space above a certain threshold.  This will allow us to maximize the length of historical data we can keep without running out of disk space.

So, I have built a function that returns an approximation of the space taken up by the non-obsolete tuples, I call this used_size, and the physical disk space taken up by the data files - I call this disk_size.

The following sql query is what I use to return these values:

SELECT sum((bytes_per_row + row_overhead_bytes) * tuples) as used_size,
       sum(pages)::float * 8192  as disk_size,
       sum(pages) as total_pages
from
(
select c.relname,
       sum(case when a.attlen = -1 then _var_col_bytes
                else a.attlen
           end) as bytes_per_row,
       max(CASE WHEN c.relkind = 'i' THEN 4 ELSE 32 END) as row_overhead_bytes,
       max(c.reltuples) as tuples,
       max(c.relpages) as pages
from pg_class c,
     pg_attribute a,
     pg_namespace n
where c.oid = a.attrelid
  and c.relnamespace = n.oid
  and c.relkind in ('i','r')
  and a.atttypid not in (26,27,28,29)
group by c.relname) by_table;

A few notes:

1) I have used 32 bytes for the row tuple header overhead and 4 bytes for index tuple overhead
2) The attribute types 26,27,28,29 are oid,tid,xid,cid - which, I believe are already counted in the row overhead
3) _var_col_bytes is an input parameter to the function which measures the assumed size of any variable length columns

I then use the function to actively manage the used_size (after statistics are computed via ANALYZE, of course).  Through a process I track the daily growth of used_size and this tells me how many days of data I need to remove to stay within my limits.  The disk_size is not actively managed, but just represents the "high-water-mark" of the used_size.

Questions:

1) I have found the 32 bytes overhead mentioned in a few places, but have not seen any specific reference to the byte overhead of an index header row.  Does know the best number to use here for an assumption?

2) Are there any other holes in my logic/query?

3) Has anyone solved this entire problem in another fashion (e.g. auto-pruning - only delete what's necessary to stay within limits).

Any feedback is greatly appreciated,

Mark




Re: Feedback on auto-pruning approach

От
Tom Lane
Дата:
"Mark Liberman" <mliberman@goldpocket.com> writes:
> where c.oid = a.attrelid
>   and c.relnamespace = n.oid
>   and c.relkind in ('i','r')
>   and a.atttypid not in (26,27,28,29)
> group by c.relname) by_table;

> A few notes:

> 1) I have used 32 bytes for the row tuple header overhead and 4 bytes =
> for index tuple overhead
> 2) The attribute types 26,27,28,29 are oid,tid,xid,cid - which, I =
> believe are already counted in the row overhead

You should not do it that way, because those are perfectly valid
datatypes for user columns.  Instead of the type test, check for
attnum > 0.  The "system columns" that represent row overhead items
have attnum < 0.  You might want to consider ignoring columns where
attisdropped, too, though this is a bit of a judgment call since a
dropped column might still be eating storage space.

Another thing you could do is left-join to pg_stats and use ANALYZE's
estimate of average column width where available, instead of hardwired
guesses.

Another important point is that this calculation is ignoring TOAST
space ... do you have any columns wide enough to get toasted?

> 1) I have found the 32 bytes overhead mentioned in a few places, but =
> have not seen any specific reference to the byte overhead of an index =
> header row.  Does know the best number to use here for an assumption?

12 bytes (8-byte header + 4-byte line pointer).

> 3) Has anyone solved this entire problem in another fashion (e.g. =
> auto-pruning - only delete what's necessary to stay within limits).

Have you looked at contrib/pgstattuple?

            regards, tom lane

Re: Feedback on auto-pruning approach

От
"Mark Liberman"
Дата:

So, I have finally complete this auto-pruning solution.  It has proven effective in keeping the size of the db under whichever threshold I set in an unattended fashion.

I have one final question.  If my goal is to maximize the amount of historical data that we can keep - e.g. set the db size limit to be as large as possible - how much disk space should I reserve for standard Postgres operations - e.g. sort space, WAL, etc..  I'm sure this depends a bit on our configuration, etc.. but if someone can point me in the direction as to what factors I should consider, I'd greatly appreciate it.

Thanks,

Mark

Re: Feedback on auto-pruning approach

От
"Jim C. Nasby"
Дата:
On Mon, Mar 27, 2006 at 06:32:42PM -0800, Mark Liberman wrote:
> So, I have finally complete this auto-pruning solution.  It has proven effective in keeping the size of the db under
whicheverthreshold I set in an unattended fashion. 
>
> I have one final question.  If my goal is to maximize the amount of historical data that we can keep - e.g. set the
dbsize limit to be as large as possible - how much disk space should I reserve for standard Postgres operations - e.g.
sortspace, WAL, etc..  I'm sure this depends a bit on our configuration, etc.. but if someone can point me in the
directionas to what factors I should consider, I'd greatly appreciate it. 

Probably your biggest issue will be temporary files created by temporary
tables, sorts that spill to disk, etc.

What I'm confused by is the concern about disk space in the first place.
Drives are very cheap, people are normally much more concerned about IO
bandwidth.
--
Jim C. Nasby, Sr. Engineering Consultant      jnasby@pervasive.com
Pervasive Software      http://pervasive.com    work: 512-231-6117
vcard: http://jim.nasby.net/pervasive.vcf       cell: 512-569-9461

Re: Feedback on auto-pruning approach

От
"Mark Liberman"
Дата:

> Probably your biggest issue will be temporary files created by temporary tables, sorts that spill to disk, etc.

Is there any way to monitor this so I can estimate?

> What I'm confused by is the concern about disk space in the first place.

We provide a device to customers that must run in an unattended fashion for as long as the hardward holds up.  So, regardless of the disk size, they will run out at some time.  Some of our solutions grow by 3.5 Gigs per day - and 6 months of history is not an unreasonable expectation.  We've just decided we want to keep as much history as possible given space limitations.


-----Original Message-----
From: Jim C. Nasby [mailto:jnasby@pervasive.com]
Sent: Tue 3/28/2006 10:19 AM
To: Mark Liberman
Cc: pgsql-admin@postgresql.org
Subject: Re: [ADMIN] Feedback on auto-pruning approach

On Mon, Mar 27, 2006 at 06:32:42PM -0800, Mark Liberman wrote:
> So, I have finally complete this auto-pruning solution.  It has proven effective in keeping the size of the db under whichever threshold I set in an unattended fashion.
>
> I have one final question.  If my goal is to maximize the amount of historical data that we can keep - e.g. set the db size limit to be as large as possible - how much disk space should I reserve for standard Postgres operations - e.g. sort space, WAL, etc..  I'm sure this depends a bit on our configuration, etc.. but if someone can point me in the direction as to what factors I should consider, I'd greatly appreciate it.

Probably your biggest issue will be temporary files created by temporary
tables, sorts that spill to disk, etc.

What I'm confused by is the concern about disk space in the first place.
Drives are very cheap, people are normally much more concerned about IO
bandwidth.
--
Jim C. Nasby, Sr. Engineering Consultant      jnasby@pervasive.com
Pervasive Software      http://pervasive.com    work: 512-231-6117
vcard: http://jim.nasby.net/pervasive.vcf       cell: 512-569-9461



Re: Feedback on auto-pruning approach

От
Scott Marlowe
Дата:
On Tue, 2006-03-28 at 12:23, Mark Liberman wrote:
> > Probably your biggest issue will be temporary files created by
> temporary tables, sorts that spill to disk, etc.
>
> Is there any way to monitor this so I can estimate?
>
> > What I'm confused by is the concern about disk space in the first
> place.
>
> We provide a device to customers that must run in an unattended
> fashion for as long as the hardward holds up.  So, regardless of the
> disk size, they will run out at some time.  Some of our solutions grow
> by 3.5 Gigs per day - and 6 months of history is not an unreasonable
> expectation.  We've just decided we want to keep as much history as
> possible given space limitations.

If most of that is text, it should be fairly compressible.

So, how compressible are the data, and have you done some very basic
checks to see how much your postgresql data directory grows when you add
to the database.  It's pretty easy to do.  Just, as the postgres user:

cd $PGDATA
du -sh base
(load a couple gigs of data)
du -sh base

and compare the difference.  It'll at least get you in the ball park.

Re: Feedback on auto-pruning approach

От
"Jim C. Nasby"
Дата:
On Tue, Mar 28, 2006 at 10:23:45AM -0800, Mark Liberman wrote:
> > Probably your biggest issue will be temporary files created by temporary tables, sorts that spill to disk, etc.
>
> Is there any way to monitor this so I can estimate?

Keep an eye on $PGDATA/base/{database_oid}/pgsql_tmp.

> > What I'm confused by is the concern about disk space in the first place.
>
> We provide a device to customers that must run in an unattended fashion for as long as the hardward holds up.  So,
regardlessof the disk size, they will run out at some time.  Some of our solutions grow by 3.5 Gigs per day - and 6
monthsof history is not an unreasonable expectation.  We've just decided we want to keep as much history as possible
givenspace limitations. 

You might want to take a look at http://rrs.decibel.org, which is
something I created for a similar purpose.
--
Jim C. Nasby, Sr. Engineering Consultant      jnasby@pervasive.com
Pervasive Software      http://pervasive.com    work: 512-231-6117
vcard: http://jim.nasby.net/pervasive.vcf       cell: 512-569-9461

Re: Feedback on auto-pruning approach

От
Richard Broersma Jr
Дата:
Could RRS be implemented in a similar fashion to OPC-HDA?

Regards,
Richard

--- "Jim C. Nasby" <jnasby@pervasive.com> wrote:

> On Tue, Mar 28, 2006 at 10:23:45AM -0800, Mark Liberman wrote:
> > > Probably your biggest issue will be temporary files created by temporary tables, sorts that
> spill to disk, etc.
> >
> > Is there any way to monitor this so I can estimate?
>
> Keep an eye on $PGDATA/base/{database_oid}/pgsql_tmp.
>
> > > What I'm confused by is the concern about disk space in the first place.
> >
> > We provide a device to customers that must run in an unattended fashion for as long as the
> hardward holds up.  So, regardless of the disk size, they will run out at some time.  Some of
> our solutions grow by 3.5 Gigs per day - and 6 months of history is not an unreasonable
> expectation.  We've just decided we want to keep as much history as possible given space
> limitations.
>
> You might want to take a look at http://rrs.decibel.org, which is
> something I created for a similar purpose.
> --
> Jim C. Nasby, Sr. Engineering Consultant      jnasby@pervasive.com
> Pervasive Software      http://pervasive.com    work: 512-231-6117
> vcard: http://jim.nasby.net/pervasive.vcf       cell: 512-569-9461
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: Have you checked our extensive FAQ?
>
>                http://www.postgresql.org/docs/faq
>


Re: Feedback on auto-pruning approach

От
"Jim C. Nasby"
Дата:
On Tue, Mar 28, 2006 at 10:42:13AM -0800, Richard Broersma Jr wrote:
> Could RRS be implemented in a similar fashion to OPC-HDA?

I'm not really familiar with that. The idea behind RRS is that you keep
historical information, but you don't keep the detailed data, similar to
how RRD works.
--
Jim C. Nasby, Sr. Engineering Consultant      jnasby@pervasive.com
Pervasive Software      http://pervasive.com    work: 512-231-6117
vcard: http://jim.nasby.net/pervasive.vcf       cell: 512-569-9461