aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorMel Gorman <mel@csn.ul.ie>2009-06-16 18:33:23 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-06-16 22:47:46 -0400
commit24cf72518c79cdcda486ed26074ff8151291cf65 (patch)
tree0db04965fb57135e68edf62c332c3a3825c1e3b5 /mm
parentfa5e084e43eb14c14942027e1e2e894aeed96097 (diff)
vmscan: count the number of times zone_reclaim() scans and fails
On NUMA machines, the administrator can configure zone_reclaim_mode that is a more targetted form of direct reclaim. On machines with large NUMA distances for example, a zone_reclaim_mode defaults to 1 meaning that clean unmapped pages will be reclaimed if the zone watermarks are not being met. There is a heuristic that determines if the scan is worthwhile but it is possible that the heuristic will fail and the CPU gets tied up scanning uselessly. Detecting the situation requires some guesswork and experimentation so this patch adds a counter "zreclaim_failed" to /proc/vmstat. If during high CPU utilisation this counter is increasing rapidly, then the resolution to the problem may be to set /proc/sys/vm/zone_reclaim_mode to 0. [akpm@linux-foundation.org: name things consistently] Signed-off-by: Mel Gorman <mel@csn.ul.ie> Reviewed-by: Rik van Riel <riel@redhat.com> Cc: Christoph Lameter <cl@linux-foundation.org> Reviewed-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Wu Fengguang <fengguang.wu@intel.com> Cc: <stable@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/vmscan.c3
-rw-r--r--mm/vmstat.c3
2 files changed, 6 insertions, 0 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 16c82a868e2b..3018ad756133 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2519,6 +2519,9 @@ int zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order)
2519 ret = __zone_reclaim(zone, gfp_mask, order); 2519 ret = __zone_reclaim(zone, gfp_mask, order);
2520 zone_clear_flag(zone, ZONE_RECLAIM_LOCKED); 2520 zone_clear_flag(zone, ZONE_RECLAIM_LOCKED);
2521 2521
2522 if (!ret)
2523 count_vm_event(PGSCAN_ZONE_RECLAIM_FAILED);
2524
2522 return ret; 2525 return ret;
2523} 2526}
2524#endif 2527#endif
diff --git a/mm/vmstat.c b/mm/vmstat.c
index 1e3aa8139f22..138bed53706e 100644
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -673,6 +673,9 @@ static const char * const vmstat_text[] = {
673 TEXTS_FOR_ZONES("pgscan_kswapd") 673 TEXTS_FOR_ZONES("pgscan_kswapd")
674 TEXTS_FOR_ZONES("pgscan_direct") 674 TEXTS_FOR_ZONES("pgscan_direct")
675 675
676#ifdef CONFIG_NUMA
677 "zone_reclaim_failed",
678#endif
676 "pginodesteal", 679 "pginodesteal",
677 "slabs_scanned", 680 "slabs_scanned",
678 "kswapd_steal", 681 "kswapd_steal",