aboutsummaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2006-09-26 02:31:52 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-09-26 11:48:51 -0400
commit0ff38490c836dc379ff7ec45b10a15a662f4e5f6 (patch)
treecb42d5d3cace3c8d12f0b304879039c503807981 /mm/page_alloc.c
parent972d1a7b140569084439a81265a0f15b74e924e0 (diff)
[PATCH] zone_reclaim: dynamic slab reclaim
Currently one can enable slab reclaim by setting an explicit option in /proc/sys/vm/zone_reclaim_mode. Slab reclaim is then used as a final option if the freeing of unmapped file backed pages is not enough to free enough pages to allow a local allocation. However, that means that the slab can grow excessively and that most memory of a node may be used by slabs. We have had a case where a machine with 46GB of memory was using 40-42GB for slab. Zone reclaim was effective in dealing with pagecache pages. However, slab reclaim was only done during global reclaim (which is a bit rare on NUMA systems). This patch implements slab reclaim during zone reclaim. Zone reclaim occurs if there is a danger of an off node allocation. At that point we 1. Shrink the per node page cache if the number of pagecache pages is more than min_unmapped_ratio percent of pages in a zone. 2. Shrink the slab cache if the number of the nodes reclaimable slab pages (patch depends on earlier one that implements that counter) are more than min_slab_ratio (a new /proc/sys/vm tunable). The shrinking of the slab cache is a bit problematic since it is not node specific. So we simply calculate what point in the slab we want to reach (current per node slab use minus the number of pages that neeed to be allocated) and then repeately run the global reclaim until that is unsuccessful or we have reached the limit. I hope we will have zone based slab reclaim at some point which will make that easier. The default for the min_slab_ratio is 5% Also remove the slab option from /proc/sys/vm/zone_reclaim_mode. [akpm@osdl.org: cleanups] Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 47e98423b30d..cf913bdd433e 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2005,6 +2005,7 @@ static void __meminit free_area_init_core(struct pglist_data *pgdat,
2005#ifdef CONFIG_NUMA 2005#ifdef CONFIG_NUMA
2006 zone->min_unmapped_pages = (realsize*sysctl_min_unmapped_ratio) 2006 zone->min_unmapped_pages = (realsize*sysctl_min_unmapped_ratio)
2007 / 100; 2007 / 100;
2008 zone->min_slab_pages = (realsize * sysctl_min_slab_ratio) / 100;
2008#endif 2009#endif
2009 zone->name = zone_names[j]; 2010 zone->name = zone_names[j];
2010 spin_lock_init(&zone->lock); 2011 spin_lock_init(&zone->lock);
@@ -2318,6 +2319,22 @@ int sysctl_min_unmapped_ratio_sysctl_handler(ctl_table *table, int write,
2318 sysctl_min_unmapped_ratio) / 100; 2319 sysctl_min_unmapped_ratio) / 100;
2319 return 0; 2320 return 0;
2320} 2321}
2322
2323int sysctl_min_slab_ratio_sysctl_handler(ctl_table *table, int write,
2324 struct file *file, void __user *buffer, size_t *length, loff_t *ppos)
2325{
2326 struct zone *zone;
2327 int rc;
2328
2329 rc = proc_dointvec_minmax(table, write, file, buffer, length, ppos);
2330 if (rc)
2331 return rc;
2332
2333 for_each_zone(zone)
2334 zone->min_slab_pages = (zone->present_pages *
2335 sysctl_min_slab_ratio) / 100;
2336 return 0;
2337}
2321#endif 2338#endif
2322 2339
2323/* 2340/*