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
340 340
341 TP_PROTO(int nid,341 TP_PROTO(int nid,
342 unsigned long nr_scanned, unsigned long nr_reclaimed,342 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,
343 int priority, int file),347 int priority, int file),
344 348
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),
346 352
347 TP_STRUCT__entry(353 TP_STRUCT__entry(
348 __field(int, nid)354 __field(int, nid)
349 __field(unsigned long, nr_scanned)355 __field(unsigned long, nr_scanned)
350 __field(unsigned long, nr_reclaimed)356 __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)
351 __field(int, priority)364 __field(int, priority)
352 __field(int, reclaim_flags)365 __field(int, reclaim_flags)
353 ),366 ),
@@ -356,14 +369,24 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive, · 2 unmodified lines
356 __entry->nid = nid;369 __entry->nid = nid;
357 __entry->nr_scanned = nr_scanned;370 __entry->nr_scanned = nr_scanned;
358 __entry->nr_reclaimed = nr_reclaimed;371 __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;
359 __entry->priority = priority;379 __entry->priority = priority;
360 __entry->reclaim_flags = trace_shrink_flags(file);380 __entry->reclaim_flags = trace_shrink_flags(file);
361 ),381 ),
362 382
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",
364 __entry->nid,384 __entry->nid,
365 __entry->nr_scanned, __entry->nr_reclaimed,385 __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,
367 show_reclaim_flags(__entry->reclaim_flags))390 show_reclaim_flags(__entry->reclaim_flags))
368);391);
369 392
mm/vmscan.c+14−0
@@ -918,6 +918,9 @@ struct reclaim_stat { · 917 unmodified lines
918 unsigned nr_congested;918 unsigned nr_congested;
919 unsigned nr_writeback;919 unsigned nr_writeback;
920 unsigned nr_immediate;920 unsigned nr_immediate;
921 unsigned nr_activate;
922 unsigned nr_ref_keep;
923 unsigned nr_unmap_fail;
921};924};
922 925
923/*926/*
@@ -939,6 +942,8 @@ static unsigned long shrink_page_list(struct list_head *page_list, · 15 unmodified lines
939 unsigned nr_reclaimed = 0;942 unsigned nr_reclaimed = 0;
940 unsigned nr_writeback = 0;943 unsigned nr_writeback = 0;
941 unsigned nr_immediate = 0;944 unsigned nr_immediate = 0;
945 unsigned nr_ref_keep = 0;
946 unsigned nr_unmap_fail = 0;
942 947
943 cond_resched();948 cond_resched();
944 949
@@ -1077,6 +1082,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, · 132 unmodified lines
1077 case PAGEREF_ACTIVATE:1082 case PAGEREF_ACTIVATE:
1078 goto activate_locked;1083 goto activate_locked;
1079 case PAGEREF_KEEP:1084 case PAGEREF_KEEP:
1085 nr_ref_keep++;
1080 goto keep_locked;1086 goto keep_locked;
1081 case PAGEREF_RECLAIM:1087 case PAGEREF_RECLAIM:
1082 case PAGEREF_RECLAIM_CLEAN:1088 case PAGEREF_RECLAIM_CLEAN:
@@ -1114,6 +1120,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, · 31 unmodified lines
1114 (ttu_flags | TTU_BATCH_FLUSH | TTU_LZFREE) :1120 (ttu_flags | TTU_BATCH_FLUSH | TTU_LZFREE) :
1115 (ttu_flags | TTU_BATCH_FLUSH))) {1121 (ttu_flags | TTU_BATCH_FLUSH))) {
1116 case SWAP_FAIL:1122 case SWAP_FAIL:
1123 nr_unmap_fail++;
1117 goto activate_locked;1124 goto activate_locked;
1118 case SWAP_AGAIN:1125 case SWAP_AGAIN:
1119 goto keep_locked;1126 goto keep_locked;
@@ -1286,6 +1293,9 @@ keep: · 166 unmodified lines
1286 stat->nr_unqueued_dirty = nr_unqueued_dirty;1293 stat->nr_unqueued_dirty = nr_unqueued_dirty;
1287 stat->nr_writeback = nr_writeback;1294 stat->nr_writeback = nr_writeback;
1288 stat->nr_immediate = nr_immediate;1295 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;
1289 }1299 }
1290 return nr_reclaimed;1300 return nr_reclaimed;
1291}1301}
@@ -1834,6 +1844,10 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, · 542 unmodified lines
1834 1844
1835 trace_mm_vmscan_lru_shrink_inactive(pgdat->node_id,1845 trace_mm_vmscan_lru_shrink_inactive(pgdat->node_id,
1836 nr_scanned, nr_reclaimed,1846 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,
1837 sc->priority, file);1851 sc->priority, file);
1838 return nr_reclaimed;1852 return nr_reclaimed;
1839}1853}

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