Re: [PERFORM] Monitoring buffercache...

2008-11-25 Thread Mark Kirkwood

Scott Marlowe wrote:

On Mon, Nov 24, 2008 at 12:52 PM, Brad Nicholson
[EMAIL PROTECTED] wrote:
  

I just ran it in a loop over and over on my 8 core opteron server and
it ran the load factor up by almost exactly 1.0.  Under our normal
daily load, it sits at 1.9 to 2.5, and it climbed to 2.9 under the new
load of running that query over and over.  So, it doesn't seem to be
blocking or anything.
  

The internal docs for pg_buffercache_pages.c state:

To get a consistent picture of the buffer state, we must lock all
partitions of the buffer map.  Needless to say, this is horrible
for concurrency.  Must grab locks in increasing order to avoid
possible deadlocks.



Well, the pg hackers tend to take a parnoid view (it's a good thing
TM) on things like this.  My guess is that the period of time for
which pg_buffercache takes locks on the buffer map are short enough
that it isn't a real big deal on a fast enough server.  On mine, it
certainly had no real negative effects for the 5 minutes or so it was
running in a loop.  None I could see, and we run hundreds of queries
per second on our system.

Of course, for certain other types of loads it could be a much bigger
issue.  But for our load, on our machine, it was virtually
unnoticeable.

  
Yeah, I wouldn't worry about accessing it every 15 minutes! I put the 
comment there to make it clear that (like pg_locks) selecting from it 
*very frequently* could effect performance.


Cheers

Mark

--
Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance


[PERFORM] Monitoring buffercache...

2008-11-24 Thread Kevin Kempter
Hi All;

I've installed pg_buffercache and I want to use it to help define the optimal 
shared_buffers size. 

Currently I run this each 15min via cron:
insert into buffercache_stats select now(), isdirty, count(*) as buffers, 
(count(*) * 8192) as memory from pg_buffercache group by 1,2;

and here's it's explain plan
explain insert into buffercache_stats select now(), isdirty, count(*) as 
buffers, (count(*) * 8192) as memory from pg_buffercache group by 1,2;
QUERY PLAN
---
 Subquery Scan *SELECT*  (cost=65.00..65.23 rows=2 width=25)
   -  HashAggregate  (cost=65.00..65.12 rows=2 width=1)
 -  Function Scan on pg_buffercache_pages p  (cost=0.00..55.00 
rows=1000 width=1)
(3 rows)


Then once a day I will pull a report from the buffercache_stats table. The 
buffercache_stats table is our own creation :

\d buffercache_stats
 Table public.buffercache_stats
 Column |Type | Modifiers
+-+---
 snap_timestamp | timestamp without time zone |
 isdirty| boolean |
 buffers  | integer   |
 memory| integer   |


Here's my issue, the server that we'll eventually roll this out to is 
extremely busy and the every 15min query above has the potential to have a 
huge impact on performance.

Does anyone have any suggestions per a better approach or maybe a way to 
improve the performance for the above query ?

Thanks in advance...

-- 
Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance


Re: [PERFORM] Monitoring buffercache...

2008-11-24 Thread Brad Nicholson
On Mon, 2008-11-24 at 11:43 -0700, Kevin Kempter wrote:
 Hi All;
 
 I've installed pg_buffercache and I want to use it to help define the optimal 
 shared_buffers size. 
 
 Currently I run this each 15min via cron:
 insert into buffercache_stats select now(), isdirty, count(*) as buffers, 
 (count(*) * 8192) as memory from pg_buffercache group by 1,2;
 
 and here's it's explain plan
 explain insert into buffercache_stats select now(), isdirty, count(*) as 
 buffers, (count(*) * 8192) as memory from pg_buffercache group by 1,2;
 QUERY PLAN
 ---
  Subquery Scan *SELECT*  (cost=65.00..65.23 rows=2 width=25)
-  HashAggregate  (cost=65.00..65.12 rows=2 width=1)
  -  Function Scan on pg_buffercache_pages p  (cost=0.00..55.00 
 rows=1000 width=1)
 (3 rows)
 
 
 Then once a day I will pull a report from the buffercache_stats table. The 
 buffercache_stats table is our own creation :
 
 \d buffercache_stats
  Table public.buffercache_stats
  Column |Type | Modifiers
 +-+---
  snap_timestamp | timestamp without time zone |
  isdirty| boolean |
  buffers  | integer   |
  memory| integer   |
 
 
 Here's my issue, the server that we'll eventually roll this out to is 
 extremely busy and the every 15min query above has the potential to have a 
 huge impact on performance.

I wouldn't routinely run pg_buffercache on a busy database.  Plus, I
don't think that pg_buffercache will answer this question for you. It
will tell you whats currently in the buffer pool and the clean/dirty
status, but that's not the first place I'd look, but what you really
need is to figure out the hit ratio on the buffer pool and go from
there.

 Does anyone have any suggestions per a better approach or maybe a way to 
 improve the performance for the above query ?

You should be able to use the blocks hit vs block read data in the
pg_stat_database view (for the overall database), and drill down into
pg_statio_user_tables/pg_statio_all_tables to get more detailed data if
you want.

-- 
Brad Nicholson  416-673-4106
Database Administrator, Afilias Canada Corp.


-- 
Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance


Re: [PERFORM] Monitoring buffercache...

2008-11-24 Thread Scott Marlowe
On Mon, Nov 24, 2008 at 11:43 AM, Kevin Kempter
[EMAIL PROTECTED] wrote:
 Hi All;

 I've installed pg_buffercache and I want to use it to help define the optimal
 shared_buffers size.

 Currently I run this each 15min via cron:
 insert into buffercache_stats select now(), isdirty, count(*) as buffers,
 (count(*) * 8192) as memory from pg_buffercache group by 1,2;

 and here's it's explain plan
 explain insert into buffercache_stats select now(), isdirty, count(*) as
 buffers, (count(*) * 8192) as memory from pg_buffercache group by 1,2;
QUERY PLAN
 ---
  Subquery Scan *SELECT*  (cost=65.00..65.23 rows=2 width=25)
   -  HashAggregate  (cost=65.00..65.12 rows=2 width=1)
 -  Function Scan on pg_buffercache_pages p  (cost=0.00..55.00
 rows=1000 width=1)
 (3 rows)


 Then once a day I will pull a report from the buffercache_stats table. The
 buffercache_stats table is our own creation :

 \d buffercache_stats
 Table public.buffercache_stats
 Column |Type | Modifiers
 +-+---
  snap_timestamp | timestamp without time zone |
  isdirty| boolean |
  buffers  | integer   |
  memory| integer   |


 Here's my issue, the server that we'll eventually roll this out to is
 extremely busy and the every 15min query above has the potential to have a
 huge impact on performance.

 Does anyone have any suggestions per a better approach or maybe a way to
 improve the performance for the above query ?

I wouldn't worry about running it every 15 minutes unless it's on a
REALLY slow machine.

I just ran it in a loop over and over on my 8 core opteron server and
it ran the load factor up by almost exactly 1.0.  Under our normal
daily load, it sits at 1.9 to 2.5, and it climbed to 2.9 under the new
load of running that query over and over.  So, it doesn't seem to be
blocking or anything.

-- 
Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance


Re: [PERFORM] Monitoring buffercache...

2008-11-24 Thread Brad Nicholson
On Mon, 2008-11-24 at 12:46 -0700, Scott Marlowe wrote:
 On Mon, Nov 24, 2008 at 11:43 AM, Kevin Kempter
 [EMAIL PROTECTED] wrote:
  Hi All;
 
  I've installed pg_buffercache and I want to use it to help define the 
  optimal
  shared_buffers size.
 
  Currently I run this each 15min via cron:
  insert into buffercache_stats select now(), isdirty, count(*) as buffers,
  (count(*) * 8192) as memory from pg_buffercache group by 1,2;
 
  and here's it's explain plan
  explain insert into buffercache_stats select now(), isdirty, count(*) as
  buffers, (count(*) * 8192) as memory from pg_buffercache group by 1,2;
 QUERY PLAN
  ---
   Subquery Scan *SELECT*  (cost=65.00..65.23 rows=2 width=25)
-  HashAggregate  (cost=65.00..65.12 rows=2 width=1)
  -  Function Scan on pg_buffercache_pages p  (cost=0.00..55.00
  rows=1000 width=1)
  (3 rows)
 
 
  Then once a day I will pull a report from the buffercache_stats table. The
  buffercache_stats table is our own creation :
 
  \d buffercache_stats
  Table public.buffercache_stats
  Column |Type | Modifiers
  +-+---
   snap_timestamp | timestamp without time zone |
   isdirty| boolean |
   buffers  | integer   |
   memory| integer   |
 
 
  Here's my issue, the server that we'll eventually roll this out to is
  extremely busy and the every 15min query above has the potential to have a
  huge impact on performance.
 
  Does anyone have any suggestions per a better approach or maybe a way to
  improve the performance for the above query ?
 
 I wouldn't worry about running it every 15 minutes unless it's on a
 REALLY slow machine.
 
 I just ran it in a loop over and over on my 8 core opteron server and
 it ran the load factor up by almost exactly 1.0.  Under our normal
 daily load, it sits at 1.9 to 2.5, and it climbed to 2.9 under the new
 load of running that query over and over.  So, it doesn't seem to be
 blocking or anything.

The internal docs for pg_buffercache_pages.c state:

To get a consistent picture of the buffer state, we must lock all
partitions of the buffer map.  Needless to say, this is horrible
for concurrency.  Must grab locks in increasing order to avoid
possible deadlocks.

I'd be concerned about that running routinely.

-- 
Brad Nicholson  416-673-4106
Database Administrator, Afilias Canada Corp.


-- 
Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance


Re: [PERFORM] Monitoring buffercache...

2008-11-24 Thread Scott Marlowe
On Mon, Nov 24, 2008 at 12:52 PM, Brad Nicholson
[EMAIL PROTECTED] wrote:
 I just ran it in a loop over and over on my 8 core opteron server and
 it ran the load factor up by almost exactly 1.0.  Under our normal
 daily load, it sits at 1.9 to 2.5, and it climbed to 2.9 under the new
 load of running that query over and over.  So, it doesn't seem to be
 blocking or anything.

 The internal docs for pg_buffercache_pages.c state:

 To get a consistent picture of the buffer state, we must lock all
 partitions of the buffer map.  Needless to say, this is horrible
 for concurrency.  Must grab locks in increasing order to avoid
 possible deadlocks.

Well, the pg hackers tend to take a parnoid view (it's a good thing
TM) on things like this.  My guess is that the period of time for
which pg_buffercache takes locks on the buffer map are short enough
that it isn't a real big deal on a fast enough server.  On mine, it
certainly had no real negative effects for the 5 minutes or so it was
running in a loop.  None I could see, and we run hundreds of queries
per second on our system.

Of course, for certain other types of loads it could be a much bigger
issue.  But for our load, on our machine, it was virtually
unnoticeable.

-- 
Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance