From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Cc: linux-mm@kvack.org
Subject: [PATCH 0/7] CART - an advanced page replacement policy
Date: Thu, 29 Sep 2005 20:08:45 +0200 [thread overview]
Message-ID: <20050929180845.910895444@twins> (raw)
Multiple memory zone CART implementation for Linux.
An advanced page replacement policy.
http://www.almaden.ibm.com/cs/people/dmodha/clockfast.pdf
(IBM does hold patent rights to the base algorithm ARC)
My ideas are based on the initial cart patch by Rahul Iyer and the
non-resident code of Rik van Riel.
For a zoned page replacement algorithm we have per zone resident list(s)
and global non-resident list(s). CART specific we would have a T1_i and
T2_i, where 0 <= i <= nr_zones, and global B1 and B2 lists.
Because B1 and B2 are variable size and the B1_i target size q_i is zone
specific we need some tricks. However since |B1| + |B2| = c we could get
away with a single hash_table of c entries if we can manage to balance
the entries within.
Let us denote the buckets with the subscript j: |B1_j| + |B2_j| = c_j.
We need to balance the per zone values:
T1_i, T2_i, |T1_i|, |T2_i|
p_i, Ns_i, Nl_i
|B1_i|, |B2_i|, q_i
against the per bucket values:
B1_j, B2_j.
and global values:
|B1|, |B2|
This can be done with two simple modifications to the algorithm:
- explicitly keep |B1_i| and |B2_i| - needed for the p,q targets;
rebalance with the global |B1|, |B2| before a batch replace.
- merge the history replacement (lines 6-10) in the replace (lines
36-40) code so that: adding the new MRU page and removing the old LRU
page becomes one action.
This will keep:
|B1_j| |B1| |B1_i|
-------- ~ ------ ~ --------
|B2_j| |B2| |B2_i|
I implemented my ideas in the following 4 patches:
[1/7] cart-nonresident.patch
[3/7] cart-cart.patch
[6/7] cart-use-once.patch
[7/7] cart-use-cart.patch
1. contains the hashed nonresident page management
3. contains the CART implementation proper
6. removes the current use-once logic
7. replace the current page replacement logic with cart
I also improved upon CART in the following patch:
[5/7] cart-cart-r.patch
And some debugging /proc stats for both the nonresident and cart code:
[2/7] cart-nonresident-stats.patch
[4/7] cart-cart-stats.patch
The code seems stable on my SMP box (thanks to the wonderfull lock debugging
found in the -rt tree) hence this first post outside of linux-mm.
All feedback, comments and test results are welcome. I hope for inclusion in
-mm and if blessed in -linus one day.
Kind regards,
Peter Zijlstra
WARNING: multiple messages have this Message-ID (diff)
From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Cc: linux-mm@kvack.org
Subject: [PATCH 0/7] CART - an advanced page replacement policy
Date: Thu, 29 Sep 2005 20:08:45 +0200 [thread overview]
Message-ID: <20050929180845.910895444@twins> (raw)
Multiple memory zone CART implementation for Linux.
An advanced page replacement policy.
http://www.almaden.ibm.com/cs/people/dmodha/clockfast.pdf
(IBM does hold patent rights to the base algorithm ARC)
My ideas are based on the initial cart patch by Rahul Iyer and the
non-resident code of Rik van Riel.
For a zoned page replacement algorithm we have per zone resident list(s)
and global non-resident list(s). CART specific we would have a T1_i and
T2_i, where 0 <= i <= nr_zones, and global B1 and B2 lists.
Because B1 and B2 are variable size and the B1_i target size q_i is zone
specific we need some tricks. However since |B1| + |B2| = c we could get
away with a single hash_table of c entries if we can manage to balance
the entries within.
Let us denote the buckets with the subscript j: |B1_j| + |B2_j| = c_j.
We need to balance the per zone values:
T1_i, T2_i, |T1_i|, |T2_i|
p_i, Ns_i, Nl_i
|B1_i|, |B2_i|, q_i
against the per bucket values:
B1_j, B2_j.
and global values:
|B1|, |B2|
This can be done with two simple modifications to the algorithm:
- explicitly keep |B1_i| and |B2_i| - needed for the p,q targets;
rebalance with the global |B1|, |B2| before a batch replace.
- merge the history replacement (lines 6-10) in the replace (lines
36-40) code so that: adding the new MRU page and removing the old LRU
page becomes one action.
This will keep:
|B1_j| |B1| |B1_i|
-------- ~ ------ ~ --------
|B2_j| |B2| |B2_i|
I implemented my ideas in the following 4 patches:
[1/7] cart-nonresident.patch
[3/7] cart-cart.patch
[6/7] cart-use-once.patch
[7/7] cart-use-cart.patch
1. contains the hashed nonresident page management
3. contains the CART implementation proper
6. removes the current use-once logic
7. replace the current page replacement logic with cart
I also improved upon CART in the following patch:
[5/7] cart-cart-r.patch
And some debugging /proc stats for both the nonresident and cart code:
[2/7] cart-nonresident-stats.patch
[4/7] cart-cart-stats.patch
The code seems stable on my SMP box (thanks to the wonderfull lock debugging
found in the -rt tree) hence this first post outside of linux-mm.
All feedback, comments and test results are welcome. I hope for inclusion in
-mm and if blessed in -linus one day.
Kind regards,
Peter Zijlstra
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next reply other threads:[~2005-09-29 18:16 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-09-29 18:08 Peter Zijlstra [this message]
2005-09-29 18:08 ` [PATCH 0/7] CART - an advanced page replacement policy Peter Zijlstra
2005-09-29 18:08 ` [PATCH 1/7] " Peter Zijlstra
2005-09-29 18:08 ` Peter Zijlstra
2005-09-29 18:08 ` [PATCH 2/7] " Peter Zijlstra
2005-09-29 18:08 ` Peter Zijlstra
2005-09-29 18:08 ` [PATCH 3/7] " Peter Zijlstra
2005-09-29 18:08 ` Peter Zijlstra
2005-09-30 18:44 ` Marcelo
2005-09-30 18:44 ` Marcelo
2005-09-30 19:16 ` Peter Zijlstra
2005-09-30 19:16 ` Peter Zijlstra
2005-09-30 19:27 ` Peter Zijlstra
2005-09-30 19:27 ` Peter Zijlstra
2005-09-29 18:08 ` [PATCH 4/7] " Peter Zijlstra
2005-09-29 18:08 ` Peter Zijlstra
2005-09-29 18:08 ` [PATCH 5/7] " Peter Zijlstra
2005-09-29 18:08 ` Peter Zijlstra
2005-09-29 18:08 ` [PATCH 6/7] " Peter Zijlstra
2005-09-29 18:08 ` Peter Zijlstra
2005-09-29 18:08 ` [PATCH 7/7] " Peter Zijlstra
2005-09-29 18:08 ` Peter Zijlstra
2005-09-29 19:40 ` [PATCH 0/7] " Bill Davidsen
2005-09-29 19:40 ` Bill Davidsen
2005-09-30 15:26 ` Peter Zijlstra
2005-09-30 15:26 ` Peter Zijlstra
2005-10-01 2:41 ` Bill Davidsen
2005-10-01 2:41 ` Bill Davidsen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050929180845.910895444@twins \
--to=a.p.zijlstra@chello.nl \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.