aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMel Gorman <mgorman@techsingularity.net>2016-07-28 18:46:59 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-07-28 19:07:41 -0400
commit7cc30fcfd2a894589d832a192cac3dc5cd302bb8 (patch)
tree5f32cf9ee52f5bd6e003853507fdb031b1d1124c
parent16709d1de1954475356a65848f80a01581b4903c (diff)
mm: vmstat: account per-zone stalls and pages skipped during reclaim
The vmstat allocstall was fairly useful in the general sense but node-based LRUs change that. It's important to know if a stall was for an address-limited allocation request as this will require skipping pages from other zones. This patch adds pgstall_* counters to replace allocstall. The sum of the counters will equal the old allocstall so it can be trivially recalculated. A high number of address-limited allocation requests may result in a lot of useless LRU scanning for suitable pages. As address-limited allocations require pages to be skipped, it's important to know how much useless LRU scanning took place so this patch adds pgskip* counters. This yields the following model 1. The number of address-space limited stalls can be accounted for (pgstall) 2. The amount of useless work required to reclaim the data is accounted (pgskip) 3. The total number of scans is available from pgscan_kswapd and pgscan_direct so from that the ratio of useful to useless scans can be calculated. [mgorman@techsingularity.net: s/pgstall/allocstall/] Link: http://lkml.kernel.org/r/1468404004-5085-3-git-send-email-mgorman@techsingularity.netLink: http://lkml.kernel.org/r/1467970510-21195-33-git-send-email-mgorman@techsingularity.net Signed-off-by: Mel Gorman <mgorman@techsingularity.net> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Hillf Danton <hillf.zj@alibaba-inc.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Michal Hocko <mhocko@kernel.org> Cc: Minchan Kim <minchan@kernel.org> Cc: Rik van Riel <riel@surriel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/linux/vm_event_item.h4
-rw-r--r--mm/vmscan.c15
-rw-r--r--mm/vmstat.c3
3 files changed, 18 insertions, 4 deletions
diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.h
index 1798ff542517..4d6ec58a8d45 100644
--- a/include/linux/vm_event_item.h
+++ b/include/linux/vm_event_item.h
@@ -23,6 +23,8 @@
23 23
24enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT, 24enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
25 FOR_ALL_ZONES(PGALLOC), 25 FOR_ALL_ZONES(PGALLOC),
26 FOR_ALL_ZONES(ALLOCSTALL),
27 FOR_ALL_ZONES(PGSCAN_SKIP),
26 PGFREE, PGACTIVATE, PGDEACTIVATE, 28 PGFREE, PGACTIVATE, PGDEACTIVATE,
27 PGFAULT, PGMAJFAULT, 29 PGFAULT, PGMAJFAULT,
28 PGLAZYFREED, 30 PGLAZYFREED,
@@ -37,7 +39,7 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
37#endif 39#endif
38 PGINODESTEAL, SLABS_SCANNED, KSWAPD_INODESTEAL, 40 PGINODESTEAL, SLABS_SCANNED, KSWAPD_INODESTEAL,
39 KSWAPD_LOW_WMARK_HIT_QUICKLY, KSWAPD_HIGH_WMARK_HIT_QUICKLY, 41 KSWAPD_LOW_WMARK_HIT_QUICKLY, KSWAPD_HIGH_WMARK_HIT_QUICKLY,
40 PAGEOUTRUN, ALLOCSTALL, PGROTATED, 42 PAGEOUTRUN, PGROTATED,
41 DROP_PAGECACHE, DROP_SLAB, 43 DROP_PAGECACHE, DROP_SLAB,
42#ifdef CONFIG_NUMA_BALANCING 44#ifdef CONFIG_NUMA_BALANCING
43 NUMA_PTE_UPDATES, 45 NUMA_PTE_UPDATES,
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 5eaf83bf11d1..d5ee6d998b5e 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1394,6 +1394,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
1394 struct list_head *src = &lruvec->lists[lru]; 1394 struct list_head *src = &lruvec->lists[lru];
1395 unsigned long nr_taken = 0; 1395 unsigned long nr_taken = 0;
1396 unsigned long nr_zone_taken[MAX_NR_ZONES] = { 0 }; 1396 unsigned long nr_zone_taken[MAX_NR_ZONES] = { 0 };
1397 unsigned long nr_skipped[MAX_NR_ZONES] = { 0, };
1397 unsigned long scan, nr_pages; 1398 unsigned long scan, nr_pages;
1398 LIST_HEAD(pages_skipped); 1399 LIST_HEAD(pages_skipped);
1399 1400
@@ -1408,6 +1409,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
1408 1409
1409 if (page_zonenum(page) > sc->reclaim_idx) { 1410 if (page_zonenum(page) > sc->reclaim_idx) {
1410 list_move(&page->lru, &pages_skipped); 1411 list_move(&page->lru, &pages_skipped);
1412 nr_skipped[page_zonenum(page)]++;
1411 continue; 1413 continue;
1412 } 1414 }
1413 1415
@@ -1436,8 +1438,17 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
1436 * scanning would soon rescan the same pages to skip and put the 1438 * scanning would soon rescan the same pages to skip and put the
1437 * system at risk of premature OOM. 1439 * system at risk of premature OOM.
1438 */ 1440 */
1439 if (!list_empty(&pages_skipped)) 1441 if (!list_empty(&pages_skipped)) {
1442 int zid;
1443
1440 list_splice(&pages_skipped, src); 1444 list_splice(&pages_skipped, src);
1445 for (zid = 0; zid < MAX_NR_ZONES; zid++) {
1446 if (!nr_skipped[zid])
1447 continue;
1448
1449 __count_zid_vm_events(PGSCAN_SKIP, zid, nr_skipped[zid]);
1450 }
1451 }
1441 *nr_scanned = scan; 1452 *nr_scanned = scan;
1442 trace_mm_vmscan_lru_isolate(sc->reclaim_idx, sc->order, nr_to_scan, scan, 1453 trace_mm_vmscan_lru_isolate(sc->reclaim_idx, sc->order, nr_to_scan, scan,
1443 nr_taken, mode, is_file_lru(lru)); 1454 nr_taken, mode, is_file_lru(lru));
@@ -2680,7 +2691,7 @@ retry:
2680 delayacct_freepages_start(); 2691 delayacct_freepages_start();
2681 2692
2682 if (global_reclaim(sc)) 2693 if (global_reclaim(sc))
2683 count_vm_event(ALLOCSTALL); 2694 __count_zid_vm_events(ALLOCSTALL, sc->reclaim_idx, 1);
2684 2695
2685 do { 2696 do {
2686 vmpressure_prio(sc->gfp_mask, sc->target_mem_cgroup, 2697 vmpressure_prio(sc->gfp_mask, sc->target_mem_cgroup,
diff --git a/mm/vmstat.c b/mm/vmstat.c
index ab7f78995c89..5caaf3f7b8ab 100644
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -983,6 +983,8 @@ const char * const vmstat_text[] = {
983 "pswpout", 983 "pswpout",
984 984
985 TEXTS_FOR_ZONES("pgalloc") 985 TEXTS_FOR_ZONES("pgalloc")
986 TEXTS_FOR_ZONES("allocstall")
987 TEXTS_FOR_ZONES("pgskip")
986 988
987 "pgfree", 989 "pgfree",
988 "pgactivate", 990 "pgactivate",
@@ -1008,7 +1010,6 @@ const char * const vmstat_text[] = {
1008 "kswapd_low_wmark_hit_quickly", 1010 "kswapd_low_wmark_hit_quickly",
1009 "kswapd_high_wmark_hit_quickly", 1011 "kswapd_high_wmark_hit_quickly",
1010 "pageoutrun", 1012 "pageoutrun",
1011 "allocstall",
1012 1013
1013 "pgrotated", 1014 "pgrotated",
1014 1015