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: | Raw Message | Whole Thread | 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 |