5233
Comment:
|
← Revision 43 as of 2017-12-30 01:05:10 ⇥
3734
converted to 1.6 markup
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
The basic assumptions behind LRU have been invalidated by streaming media, garbage collection and other things possible in large address spaces, but until 2002 there weren't many replacements available that are suitable to be implemented in a general purpose OS. However, with the advent of LIRS, ARC, Clock-pro and CAR/CART algorithms, it looks like there could be a benefit to Linux in implementing something better than LRU or the unbalanced use-once that is in use currently. | The basic assumptions behind [[LRU]] have been invalidated by streaming media, garbage collection and other things possible in large address spaces, but until 2002 there weren't many replacements available that are suitable to be implemented in a general purpose OS. However, with the advent of LIRS, ARC, Clock-pro and CAR/CART algorithms, it looks like there could be a benefit to Linux in implementing something better than LRU or the unbalanced use-once that is in use currently. |
Line 5: | Line 5: |
Please feel free to edit this page, after having created an account. | Please feel free to edit this page. |
Line 8: | Line 8: |
* More robust in corner cases where LRU / use-once fail. * Able to deal with long inter-reference distances, as a second level cache. Eg. caching for a database or being a file server. * Clean implementation. * SMP scalable. * Still good performance as a generic VM. |
* More robust in corner cases where LRU / use-once fail. * Able to deal with long inter-reference distances, as a second level cache. Eg. caching for a database or being a file server. * Clean implementation. * SMP scalable. * Still good performance as a generic VM. * PageReplacementRequirements |
Line 16: | Line 15: |
* [http://www.almaden.ibm.com/StorageSystems/autonomic_storage/ARC/index.shtml ARC] Adaptive Replacement Cache. * [http://www.cs.wm.edu/~sjiang/lirs.htm LIRS] Low Inter-Reference Recency Set. * [http://www.cs.wm.edu/hpcs/WWW/HTML/publications/abs05-3.html CLOCK-Pro] an effective improvement of the CLOCK replacement, and the ClockProApproximation that Rik van Riel is planning to implement. * [http://www.almaden.ibm.com/cs/people/dmodha/clockfast.pdf CAR] Clock with Adaptive Replacement. == Proposals for dealing with non-resident pages == Rik's interface (for implementation, see NonResidentPages, code and patches on [http://surriel.com/patches/nonresident my home page]): {{{ extern int recently_evicted(struct address_space * mapping, unsigned long offset); extern int remember_page(struct address_space * mapping, unsigned long offset); }}} The ''recently_evicted'' function is queried by the pagein or page cache allocation code, to determine whether the data at the offset ''offset'' from the page cache or process object ''mapping'' was recently evicted. The function returns 0 if the page was not found, 1 if the page was found. The ''remember_page'' function is called by the pageout code, telling the non-resident page management code to remember that a page at offset ''offset'' from ''mapping'' was just paged out. We use a hash of ''mapping->host->i_ino'' and ''mapping->host->i_sb'' (and/or possibly other fields) to keep things unique. == Status of Linux CART implementation by Rahul Iyer == I'd like to say that as of now, CART on Linux works... almost. There is some odd case where some pages get pinned in memory and cannot be freed, because of which we OOM every now and again if we malloc() enough. I presume this is a flags issue. Also, I need to fix a few other things: 1. I'm kmalloc()'ing the memory for the non resident nodes. This is proving to be painful for speed. I'm thinking of using the slab allocator for these purposes. 2. Currently, there is a non resident node "list". Lookups of this will get painful, so maybe a hash table is in order. All in all, if i'm not mistaken, on every page fault CART involves an overhead larger than the current system because of the requirement to update the non resident list. So, I guess, this will be faster only if the difference in the number of page faults that a workload generates on CART as opposed to the current scheme can mask the extra overhead. Also, i guess, that lock contention on the nonresident list will also be an issue on multiprocessor machines. I plan to release the code by Thursday or Friday (worst case by the weekend) without fix #2. I have to fix the "glued" pages issue and do some code cleanup. Hoping for the best |
* [[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.13.5210|ARC]] Adaptive Replacement Cache. * [[http://www.cse.ohio-state.edu/hpcs/WWW/HTML/publications/abs02-6.html|LIRS]] Low Inter-Reference Recency Set. * [[http://www.cse.ohio-state.edu/hpcs/WWW/HTML/publications/abs05-3.html|CLOCK-Pro]] an effective improvement of the CLOCK replacement, and the ClockProApproximation that Rik van Riel is planning to implement. Linux Weekly News has a nice article [[http://lwn.net/Articles/147879/|explaining CLOCK-Pro]]. * [[http://www.almaden.ibm.com/cs/people/dmodha/clockfast.pdf|CAR]] Clock with Adaptive Replacement. == Linux implementations == * Rahul Iyer's implementation of CART, [[RahulIyerCART]] * Rik van Riel's ClockProApproximation. * Rik van Riel's proposal for the tracking of NonResidentPages, which is used by both his ClockProApproximation and by Peter Zijlstra's [[http://www.linux-mm.org/PeterZCart|CART]] and [[http://linux-mm.org/PeterZClockPro2|Clock-pro]] implementations. * Peter Zijlstra's CART [[PeterZCart]] * Peter Zijlstra's Clock-Pro [[PeterZClockPro2]] == NetBSD == NetBSD folks are also discussing [[http://marc.theaimsgroup.com/?l=netbsd-tech-kern&m=111806501516943&w=2|better]] page replacement policies. |
Line 50: | Line 29: |
Line 53: | Line 31: |
Recently ARC was implemented in the [http://www.postgresql.org postgresql DB]. However, after it was discovered that ARC is patented (by IBM) it was removed again. You can see a patch that was sent to the ''pgsql-patches'' mail-list proposing that ARC be reverted back to LRU [http://archives.postgresql.org/pgsql-patches/2005-01/msg00253.php here]. | Recently ARC was implemented in the [[http://www.postgresql.org|postgresql DB]]. However, after it was discovered that ARC is patented (by IBM) it was removed again. You can see a patch that was sent to the ''pgsql-patches'' mail-list proposing that ARC be reverted back to LRU [[http://archives.postgresql.org/pgsql-patches/2005-01/msg00253.php|here]]. |
Line 55: | Line 33: |
More [http://www.varlena.com/varlena/GeneralBits/96.php details] about ARC removal from PostgreSQL. | More [[http://www.varlena.com/varlena/GeneralBits/96.php|details]] about ARC removal from PostgreSQL. |
Line 57: | Line 35: |
It looks like ARC has finally been [http://archives.postgresql.org/pgsql-patches/2005-02/msg00015.php replaced by the 2Q algorithm], which is a cache replacement algorithm designed for databases. | It looks like ARC has finally been [[http://archives.postgresql.org/pgsql-patches/2005-02/msg00015.php|replaced by the 2Q algorithm]], which is a cache replacement algorithm designed for databases. |
Line 59: | Line 37: |
== CART Patch v2 == I have implemented a second version of a zoned CART with hashtables for speeding up lookup. Also, I have used the short term/long term lists for the active list only. There is a separate inactive list which works in the standard way. Both patches are available at http://www.cs.cmu.edu/~412/projects/CART/ |
== Benchmarking == Testing is an essential part of implementing one of the above page replacement algorithms on Linux. The PageReplacementTesting page points out problems with LRU worst cases and is used to collect benchmarks to demonstrate LRU deficiencies. For other pages in this category, see CategoryAdvancedPageReplacement |
The basic assumptions behind LRU have been invalidated by streaming media, garbage collection and other things possible in large address spaces, but until 2002 there weren't many replacements available that are suitable to be implemented in a general purpose OS. However, with the advent of LIRS, ARC, Clock-pro and CAR/CART algorithms, it looks like there could be a benefit to Linux in implementing something better than LRU or the unbalanced use-once that is in use currently.
The only problem is, the advanced page replacement algorithms need to keep a history of recently evicted pages, and we don't want to spend too much memory or cpu on that. This page is a template for brainstorming on how we can implement such a framework, and on which of the advanced page replacement algorithms we should experiment with.
Please feel free to edit this page.
Goals
- More robust in corner cases where LRU / use-once fail.
- Able to deal with long inter-reference distances, as a second level cache. Eg. caching for a database or being a file server.
- Clean implementation.
- SMP scalable.
- Still good performance as a generic VM.
The replacement algorithms
ARC Adaptive Replacement Cache.
LIRS Low Inter-Reference Recency Set.
CLOCK-Pro an effective improvement of the CLOCK replacement, and the ClockProApproximation that Rik van Riel is planning to implement. Linux Weekly News has a nice article explaining CLOCK-Pro.
CAR Clock with Adaptive Replacement.
Linux implementations
Rahul Iyer's implementation of CART, RahulIyerCART
Rik van Riel's ClockProApproximation.
Rik van Riel's proposal for the tracking of NonResidentPages, which is used by both his ClockProApproximation and by Peter Zijlstra's CART and Clock-pro implementations.
Peter Zijlstra's CART PeterZCart
Peter Zijlstra's Clock-Pro PeterZClockPro2
NetBSD
NetBSD folks are also discussing better page replacement policies.
Advanced Replacement in other systems
Operating systems are not the only place where advanced cache replacement algorithms have been studied and implemented. Databases and web proxies also tend to have fancy replacement algorithms.
Recently ARC was implemented in the postgresql DB. However, after it was discovered that ARC is patented (by IBM) it was removed again. You can see a patch that was sent to the pgsql-patches mail-list proposing that ARC be reverted back to LRU here.
More details about ARC removal from PostgreSQL.
It looks like ARC has finally been replaced by the 2Q algorithm, which is a cache replacement algorithm designed for databases.
Benchmarking
Testing is an essential part of implementing one of the above page replacement algorithms on Linux.
The PageReplacementTesting page points out problems with LRU worst cases and is used to collect benchmarks to demonstrate LRU deficiencies.
For other pages in this category, see CategoryAdvancedPageReplacement