| From: | Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us> | 
|---|---|
| To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> | 
| Cc: | pgsql-hackers(at)postgreSQL(dot)org | 
| Subject: | Re: Possible performance improvement: buffer replacement policy | 
| Date: | 2001-01-19 17:03:58 | 
| Message-ID: | 200101191703.MAA25873@candle.pha.pa.us | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-hackers | 
Tom, did we ever test this?  I think we did and found that it was the
same or worse, right?
> Those of you with long memories may recall a benchmark that Edmund Mergl
> drew our attention to back in May '99.  That test showed extremely slow
> performance for updating a table with many indexes (about 20).  At the
> time, it seemed the problem was due to bad performance of btree with
> many equal keys, so I thought I'd go back and retry the benchmark after
> this latest round of btree hackery.
> 
> The good news is that btree itself seems to be pretty well fixed; the
> bad news is that the benchmark is still slow for large numbers of rows.
> The problem is I/O: the CPU mostly sits idle waiting for the disk.
> As best I can tell, the difficulty is that the working set of pages
> needed to update this many indexes is too large compared to the number
> of disk buffers Postgres is using.  (I was running with -B 1000 and
> looking at behavior for a 100000-row test table.  This gave me a table
> size of 3876 pages, plus 11526 pages in 20 indexes.)
> 
> Of course, there's only so much we can do when the number of buffers
> is too small, but I still started to wonder if we are using the buffers
> as effectively as we can.  Some tracing showed that most of the pages
> of the indexes were being read and written multiple times within a
> single UPDATE query, while most of the pages of the table proper were
> fetched and written only once.  That says we're not using the buffers
> as well as we could; the index pages are not being kept in memory when
> they should be.  In a query like this, we should displace main-table
> pages sooner to allow keeping more index pages in cache --- but with
> the simple LRU replacement method we use, once a page has been loaded
> it will stay in cache for at least the next NBuffers (-B) page
> references, no matter what.  With a large NBuffers that's a long time.
> 
> I've come across an interesting article:
> 	The LRU-K Page Replacement Algorithm For Database Disk Buffering
> 	Elizabeth J. O'Neil, Patrick E. O'Neil, Gerhard Weikum
> 	Proceedings of the 1993 ACM SIGMOD international conference
> 	on Management of Data, May 1993
> (If you subscribe to the ACM digital library, you can get a PDF of this
> from there.)  This article argues that standard LRU buffer management is
> inherently not great for database caches, and that it's much better to
> replace pages on the basis of time since the K'th most recent reference,
> not just time since the most recent one.  K=2 is enough to get most of
> the benefit.  The big win is that you are measuring an actual page
> interreference time (between the last two references) and not just
> dealing with a lower-bound guess on the interreference time.  Frequently
> used pages are thus much more likely to stay in cache.
> 
> It looks like it wouldn't take too much work to replace shared buffers
> on the basis of LRU-2 instead of LRU, so I'm thinking about trying it.
> 
> Has anyone looked into this area?  Is there a better method to try?
> 
> 			regards, tom lane
> 
-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman(at)candle(dot)pha(dot)pa(dot)us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Bruce Momjian | 2001-01-19 17:25:18 | Re: Small patch to replace 'idle' by 'trans' if transaction is still open | 
| Previous Message | Bruce Momjian | 2001-01-19 16:40:54 | Re: Re: [PATCHES] s_lock.h cleanup |