History

mm, vmscan: enhance mm_vmscan_lru_shrink_inactive tracepoint

mm_vmscan_lru_shrink_inactive will currently report the number of scanned and reclaimed pages. This doesn't give us an idea how the reclaim went except for the overall effectiveness though. Export and show other counters which will tell us why we couldn't reclaim some pages. - nr_dirty, nr_writeback, nr_congested and nr_immediate tells us how many pages are blocked due to IO - nr_activate tells us how many pages were moved to the active list - nr_ref_keep reports how many pages are kept on the LRU due to references (mostly for the file pages which are about to go for another round through the inactive list) - nr_unmap_fail - how many pages failed to unmap All these are rather low level so they might change in future but the tracepoint is already implementation specific so no tools should be depending on its stability.

Michal Hocko committed 9 years ago

Commit 5bccd161 parent 3c710c12 files · +40 −3Browse files

Unified · Split

2 files
  1. include/trace/events/vmscan.h +26 −3
  2. mm/vmscan.c +14 −0
include/trace/events/vmscan.h+26−3
@@ -340,14 +340,27 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive, · 339 unmodified lines
340340
341341 TP_PROTO(int nid,
342342 unsigned long nr_scanned, unsigned long nr_reclaimed,
343+ unsigned long nr_dirty, unsigned long nr_writeback,
344+ unsigned long nr_congested, unsigned long nr_immediate,
345+ unsigned long nr_activate, unsigned long nr_ref_keep,
346+ unsigned long nr_unmap_fail,
343347 int priority, int file),
344348
345− TP_ARGS(nid, nr_scanned, nr_reclaimed, priority, file),
349+ TP_ARGS(nid, nr_scanned, nr_reclaimed, nr_dirty, nr_writeback,
350+ nr_congested, nr_immediate, nr_activate, nr_ref_keep,
351+ nr_unmap_fail, priority, file),
346352
347353 TP_STRUCT__entry(
348354 __field(int, nid)
349355 __field(unsigned long, nr_scanned)
350356 __field(unsigned long, nr_reclaimed)
357+ __field(unsigned long, nr_dirty)
358+ __field(unsigned long, nr_writeback)
359+ __field(unsigned long, nr_congested)
360+ __field(unsigned long, nr_immediate)
361+ __field(unsigned long, nr_activate)
362+ __field(unsigned long, nr_ref_keep)
363+ __field(unsigned long, nr_unmap_fail)
351364 __field(int, priority)
352365 __field(int, reclaim_flags)
353366 ),
@@ -356,14 +369,24 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive, · 2 unmodified lines
356369 __entry->nid = nid;
357370 __entry->nr_scanned = nr_scanned;
358371 __entry->nr_reclaimed = nr_reclaimed;
372+ __entry->nr_dirty = nr_dirty;
373+ __entry->nr_writeback = nr_writeback;
374+ __entry->nr_congested = nr_congested;
375+ __entry->nr_immediate = nr_immediate;
376+ __entry->nr_activate = nr_activate;
377+ __entry->nr_ref_keep = nr_ref_keep;
378+ __entry->nr_unmap_fail = nr_unmap_fail;
359379 __entry->priority = priority;
360380 __entry->reclaim_flags = trace_shrink_flags(file);
361381 ),
362382
363− TP_printk("nid=%d nr_scanned=%ld nr_reclaimed=%ld priority=%d flags=%s",
383+ TP_printk("nid=%d nr_scanned=%ld nr_reclaimed=%ld nr_dirty=%ld nr_writeback=%ld nr_congested=%ld nr_immediate=%ld nr_activate=%ld nr_ref_keep=%ld nr_unmap_fail=%ld priority=%d flags=%s",
364384 __entry->nid,
365385 __entry->nr_scanned, __entry->nr_reclaimed,
366− __entry->priority,
386+ __entry->nr_dirty, __entry->nr_writeback,
387+ __entry->nr_congested, __entry->nr_immediate,
388+ __entry->nr_activate, __entry->nr_ref_keep,
389+ __entry->nr_unmap_fail, __entry->priority,
367390 show_reclaim_flags(__entry->reclaim_flags))
368391 );
369392
mm/vmscan.c+14−0
@@ -918,6 +918,9 @@ struct reclaim_stat { · 917 unmodified lines
918918 unsigned nr_congested;
919919 unsigned nr_writeback;
920920 unsigned nr_immediate;
921+ unsigned nr_activate;
922+ unsigned nr_ref_keep;
923+ unsigned nr_unmap_fail;
921924 };
922925
923926 /*
@@ -939,6 +942,8 @@ static unsigned long shrink_page_list(struct list_head *page_list, · 15 unmodified lines
939942 unsigned nr_reclaimed = 0;
940943 unsigned nr_writeback = 0;
941944 unsigned nr_immediate = 0;
945+ unsigned nr_ref_keep = 0;
946+ unsigned nr_unmap_fail = 0;
942947
943948 cond_resched();
944949
@@ -1077,6 +1082,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, · 132 unmodified lines
10771082 case PAGEREF_ACTIVATE:
10781083 goto activate_locked;
10791084 case PAGEREF_KEEP:
1085+ nr_ref_keep++;
10801086 goto keep_locked;
10811087 case PAGEREF_RECLAIM:
10821088 case PAGEREF_RECLAIM_CLEAN:
@@ -1114,6 +1120,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, · 31 unmodified lines
11141120 (ttu_flags | TTU_BATCH_FLUSH | TTU_LZFREE) :
11151121 (ttu_flags | TTU_BATCH_FLUSH))) {
11161122 case SWAP_FAIL:
1123+ nr_unmap_fail++;
11171124 goto activate_locked;
11181125 case SWAP_AGAIN:
11191126 goto keep_locked;
@@ -1286,6 +1293,9 @@ keep: · 166 unmodified lines
12861293 stat->nr_unqueued_dirty = nr_unqueued_dirty;
12871294 stat->nr_writeback = nr_writeback;
12881295 stat->nr_immediate = nr_immediate;
1296+ stat->nr_activate = pgactivate;
1297+ stat->nr_ref_keep = nr_ref_keep;
1298+ stat->nr_unmap_fail = nr_unmap_fail;
12891299 }
12901300 return nr_reclaimed;
12911301 }
@@ -1834,6 +1844,10 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, · 542 unmodified lines
18341844
18351845 trace_mm_vmscan_lru_shrink_inactive(pgdat->node_id,
18361846 nr_scanned, nr_reclaimed,
1847+ stat.nr_dirty, stat.nr_writeback,
1848+ stat.nr_congested, stat.nr_immediate,
1849+ stat.nr_activate, stat.nr_ref_keep,
1850+ stat.nr_unmap_fail,
18371851 sc->priority, file);
18381852 return nr_reclaimed;
18391853 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t