~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/trace/postprocess/trace-vmscan-postprocess.pl

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /Documentation/trace/postprocess/trace-vmscan-postprocess.pl (Version linux-6.12-rc7) and /Documentation/trace/postprocess/trace-vmscan-postprocess.pl (Version linux-3.10.108)


  1 #!/usr/bin/env perl                            !!   1 #!/usr/bin/perl
  2 # This is a POC for reading the text represent      2 # This is a POC for reading the text representation of trace output related to
  3 # page reclaim. It makes an attempt to extract      3 # page reclaim. It makes an attempt to extract some high-level information on
  4 # what is going on. The accuracy of the parser      4 # what is going on. The accuracy of the parser may vary
  5 #                                                   5 #
  6 # Example usage: trace-vmscan-postprocess.pl < !!   6 # Example usage: trace-vmscan-postprocess.pl < /sys/kernel/debug/tracing/trace_pipe
  7 # other options                                     7 # other options
  8 #   --read-procstat     If the trace lacks pro      8 #   --read-procstat     If the trace lacks process info, get it from /proc
  9 #   --ignore-pid        Aggregate processes of      9 #   --ignore-pid        Aggregate processes of the same name together
 10 #                                                  10 #
 11 # Copyright (c) IBM Corporation 2009               11 # Copyright (c) IBM Corporation 2009
 12 # Author: Mel Gorman <mel@csn.ul.ie>                12 # Author: Mel Gorman <mel@csn.ul.ie>
 13 use strict;                                        13 use strict;
 14 use Getopt::Long;                                  14 use Getopt::Long;
 15                                                    15 
 16 # Tracepoint events                                16 # Tracepoint events
 17 use constant MM_VMSCAN_DIRECT_RECLAIM_BEGIN        17 use constant MM_VMSCAN_DIRECT_RECLAIM_BEGIN     => 1;
 18 use constant MM_VMSCAN_DIRECT_RECLAIM_END          18 use constant MM_VMSCAN_DIRECT_RECLAIM_END       => 2;
 19 use constant MM_VMSCAN_KSWAPD_WAKE                 19 use constant MM_VMSCAN_KSWAPD_WAKE              => 3;
 20 use constant MM_VMSCAN_KSWAPD_SLEEP                20 use constant MM_VMSCAN_KSWAPD_SLEEP             => 4;
 21 use constant MM_VMSCAN_LRU_SHRINK_ACTIVE           21 use constant MM_VMSCAN_LRU_SHRINK_ACTIVE        => 5;
 22 use constant MM_VMSCAN_LRU_SHRINK_INACTIVE         22 use constant MM_VMSCAN_LRU_SHRINK_INACTIVE      => 6;
 23 use constant MM_VMSCAN_LRU_ISOLATE                 23 use constant MM_VMSCAN_LRU_ISOLATE              => 7;
 24 use constant MM_VMSCAN_WRITEPAGE_FILE_SYNC         24 use constant MM_VMSCAN_WRITEPAGE_FILE_SYNC      => 8;
 25 use constant MM_VMSCAN_WRITEPAGE_ANON_SYNC         25 use constant MM_VMSCAN_WRITEPAGE_ANON_SYNC      => 9;
 26 use constant MM_VMSCAN_WRITEPAGE_FILE_ASYNC        26 use constant MM_VMSCAN_WRITEPAGE_FILE_ASYNC     => 10;
 27 use constant MM_VMSCAN_WRITEPAGE_ANON_ASYNC        27 use constant MM_VMSCAN_WRITEPAGE_ANON_ASYNC     => 11;
 28 use constant MM_VMSCAN_WRITEPAGE_ASYNC             28 use constant MM_VMSCAN_WRITEPAGE_ASYNC          => 12;
 29 use constant EVENT_UNKNOWN                         29 use constant EVENT_UNKNOWN                      => 13;
 30                                                    30 
 31 # Per-order events                                 31 # Per-order events
 32 use constant MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PE     32 use constant MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER => 11;
 33 use constant MM_VMSCAN_WAKEUP_KSWAPD_PERORDER      33 use constant MM_VMSCAN_WAKEUP_KSWAPD_PERORDER   => 12;
 34 use constant MM_VMSCAN_KSWAPD_WAKE_PERORDER        34 use constant MM_VMSCAN_KSWAPD_WAKE_PERORDER     => 13;
 35 use constant HIGH_KSWAPD_REWAKEUP_PERORDER         35 use constant HIGH_KSWAPD_REWAKEUP_PERORDER      => 14;
 36                                                    36 
 37 # Constants used to track state                    37 # Constants used to track state
 38 use constant STATE_DIRECT_BEGIN                    38 use constant STATE_DIRECT_BEGIN                 => 15;
 39 use constant STATE_DIRECT_ORDER                    39 use constant STATE_DIRECT_ORDER                 => 16;
 40 use constant STATE_KSWAPD_BEGIN                    40 use constant STATE_KSWAPD_BEGIN                 => 17;
 41 use constant STATE_KSWAPD_ORDER                    41 use constant STATE_KSWAPD_ORDER                 => 18;
 42                                                    42 
 43 # High-level events extrapolated from tracepoi     43 # High-level events extrapolated from tracepoints
 44 use constant HIGH_DIRECT_RECLAIM_LATENCY           44 use constant HIGH_DIRECT_RECLAIM_LATENCY        => 19;
 45 use constant HIGH_KSWAPD_LATENCY                   45 use constant HIGH_KSWAPD_LATENCY                => 20;
 46 use constant HIGH_KSWAPD_REWAKEUP                  46 use constant HIGH_KSWAPD_REWAKEUP               => 21;
 47 use constant HIGH_NR_SCANNED                       47 use constant HIGH_NR_SCANNED                    => 22;
 48 use constant HIGH_NR_TAKEN                         48 use constant HIGH_NR_TAKEN                      => 23;
 49 use constant HIGH_NR_RECLAIMED                     49 use constant HIGH_NR_RECLAIMED                  => 24;
 50 use constant HIGH_NR_FILE_SCANNED              !!  50 use constant HIGH_NR_CONTIG_DIRTY               => 25;
 51 use constant HIGH_NR_ANON_SCANNED              << 
 52 use constant HIGH_NR_FILE_RECLAIMED            << 
 53 use constant HIGH_NR_ANON_RECLAIMED            << 
 54                                                    51 
 55 my %perprocesspid;                                 52 my %perprocesspid;
 56 my %perprocess;                                    53 my %perprocess;
 57 my %last_procmap;                                  54 my %last_procmap;
 58 my $opt_ignorepid;                                 55 my $opt_ignorepid;
 59 my $opt_read_procstat;                             56 my $opt_read_procstat;
 60                                                    57 
 61 my $total_wakeup_kswapd;                           58 my $total_wakeup_kswapd;
 62 my ($total_direct_reclaim, $total_direct_nr_sc     59 my ($total_direct_reclaim, $total_direct_nr_scanned);
 63 my ($total_direct_nr_file_scanned, $total_dire << 
 64 my ($total_direct_latency, $total_kswapd_laten     60 my ($total_direct_latency, $total_kswapd_latency);
 65 my ($total_direct_nr_reclaimed);                   61 my ($total_direct_nr_reclaimed);
 66 my ($total_direct_nr_file_reclaimed, $total_di << 
 67 my ($total_direct_writepage_file_sync, $total_     62 my ($total_direct_writepage_file_sync, $total_direct_writepage_file_async);
 68 my ($total_direct_writepage_anon_sync, $total_     63 my ($total_direct_writepage_anon_sync, $total_direct_writepage_anon_async);
 69 my ($total_kswapd_nr_scanned, $total_kswapd_wa     64 my ($total_kswapd_nr_scanned, $total_kswapd_wake);
 70 my ($total_kswapd_nr_file_scanned, $total_kswa << 
 71 my ($total_kswapd_writepage_file_sync, $total_     65 my ($total_kswapd_writepage_file_sync, $total_kswapd_writepage_file_async);
 72 my ($total_kswapd_writepage_anon_sync, $total_     66 my ($total_kswapd_writepage_anon_sync, $total_kswapd_writepage_anon_async);
 73 my ($total_kswapd_nr_reclaimed);                   67 my ($total_kswapd_nr_reclaimed);
 74 my ($total_kswapd_nr_file_reclaimed, $total_ks << 
 75                                                    68 
 76 # Catch sigint and exit on request                 69 # Catch sigint and exit on request
 77 my $sigint_report = 0;                             70 my $sigint_report = 0;
 78 my $sigint_exit = 0;                               71 my $sigint_exit = 0;
 79 my $sigint_pending = 0;                            72 my $sigint_pending = 0;
 80 my $sigint_received = 0;                           73 my $sigint_received = 0;
 81 sub sigint_handler {                               74 sub sigint_handler {
 82         my $current_time = time;                   75         my $current_time = time;
 83         if ($current_time - 2 > $sigint_receiv     76         if ($current_time - 2 > $sigint_received) {
 84                 print "SIGINT received, report     77                 print "SIGINT received, report pending. Hit ctrl-c again to exit\n";
 85                 $sigint_report = 1;                78                 $sigint_report = 1;
 86         } else {                                   79         } else {
 87                 if (!$sigint_exit) {               80                 if (!$sigint_exit) {
 88                         print "Second SIGINT r     81                         print "Second SIGINT received quickly, exiting\n";
 89                 }                                  82                 }
 90                 $sigint_exit++;                    83                 $sigint_exit++;
 91         }                                          84         }
 92                                                    85 
 93         if ($sigint_exit > 3) {                    86         if ($sigint_exit > 3) {
 94                 print "Many SIGINTs received,      87                 print "Many SIGINTs received, exiting now without report\n";
 95                 exit;                              88                 exit;
 96         }                                          89         }
 97                                                    90 
 98         $sigint_received = $current_time;          91         $sigint_received = $current_time;
 99         $sigint_pending = 1;                       92         $sigint_pending = 1;
100 }                                                  93 }
101 $SIG{INT} = "sigint_handler";                      94 $SIG{INT} = "sigint_handler";
102                                                    95 
103 # Parse command line options                       96 # Parse command line options
104 GetOptions(                                        97 GetOptions(
105         'ignore-pid'     =>     \$opt_ignorepi     98         'ignore-pid'     =>     \$opt_ignorepid,
106         'read-procstat'  =>     \$opt_read_pro     99         'read-procstat'  =>     \$opt_read_procstat,
107 );                                                100 );
108                                                   101 
109 # Defaults for dynamically discovered regex's     102 # Defaults for dynamically discovered regex's
110 my $regex_direct_begin_default = 'order=([0-9] !! 103 my $regex_direct_begin_default = 'order=([0-9]*) may_writepage=([0-9]*) gfp_flags=([A-Z_|]*)';
111 my $regex_direct_end_default = 'nr_reclaimed=(    104 my $regex_direct_end_default = 'nr_reclaimed=([0-9]*)';
112 my $regex_kswapd_wake_default = 'nid=([0-9]*)     105 my $regex_kswapd_wake_default = 'nid=([0-9]*) order=([0-9]*)';
113 my $regex_kswapd_sleep_default = 'nid=([0-9]*)    106 my $regex_kswapd_sleep_default = 'nid=([0-9]*)';
114 my $regex_wakeup_kswapd_default = 'nid=([0-9]* !! 107 my $regex_wakeup_kswapd_default = 'nid=([0-9]*) zid=([0-9]*) order=([0-9]*)';
115 my $regex_lru_isolate_default = 'classzone=([0 !! 108 my $regex_lru_isolate_default = 'isolate_mode=([0-9]*) order=([0-9]*) nr_requested=([0-9]*) nr_scanned=([0-9]*) nr_taken=([0-9]*) contig_taken=([0-9]*) contig_dirty=([0-9]*) contig_failed=([0-9]*)';
116 my $regex_lru_shrink_inactive_default = 'nid=( !! 109 my $regex_lru_shrink_inactive_default = 'nid=([0-9]*) zid=([0-9]*) nr_scanned=([0-9]*) nr_reclaimed=([0-9]*) priority=([0-9]*) flags=([A-Z_|]*)';
117 my $regex_lru_shrink_active_default = 'lru=([A !! 110 my $regex_lru_shrink_active_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_rotated=([0-9]*) priority=([0-9]*)';
118 my $regex_writepage_default = 'page=([0-9a-f]*    111 my $regex_writepage_default = 'page=([0-9a-f]*) pfn=([0-9]*) flags=([A-Z_|]*)';
119                                                   112 
120 # Dyanically discovered regex                     113 # Dyanically discovered regex
121 my $regex_direct_begin;                           114 my $regex_direct_begin;
122 my $regex_direct_end;                             115 my $regex_direct_end;
123 my $regex_kswapd_wake;                            116 my $regex_kswapd_wake;
124 my $regex_kswapd_sleep;                           117 my $regex_kswapd_sleep;
125 my $regex_wakeup_kswapd;                          118 my $regex_wakeup_kswapd;
126 my $regex_lru_isolate;                            119 my $regex_lru_isolate;
127 my $regex_lru_shrink_inactive;                    120 my $regex_lru_shrink_inactive;
128 my $regex_lru_shrink_active;                      121 my $regex_lru_shrink_active;
129 my $regex_writepage;                              122 my $regex_writepage;
130                                                   123 
131 # Static regex used. Specified like this for r    124 # Static regex used. Specified like this for readability and for use with /o
132 #                      (process_pid)     (cpus    125 #                      (process_pid)     (cpus      )   ( time  )   (tpoint    ) (details)
133 my $regex_traceevent = '\s*([a-zA-Z0-9-]*)\s*( !! 126 my $regex_traceevent = '\s*([a-zA-Z0-9-]*)\s*(\[[0-9]*\])\s*([0-9.]*):\s*([a-zA-Z_]*):\s*(.*)';
134 my $regex_statname = '[-0-9]*\s\((.*)\).*';       127 my $regex_statname = '[-0-9]*\s\((.*)\).*';
135 my $regex_statppid = '[-0-9]*\s\(.*\)\s[A-Za-z    128 my $regex_statppid = '[-0-9]*\s\(.*\)\s[A-Za-z]\s([0-9]*).*';
136                                                   129 
137 sub generate_traceevent_regex {                   130 sub generate_traceevent_regex {
138         my $event = shift;                        131         my $event = shift;
139         my $default = shift;                      132         my $default = shift;
140         my $regex;                                133         my $regex;
141                                                   134 
142         # Read the event format or use the def    135         # Read the event format or use the default
143         if (!open (FORMAT, "/sys/kernel/tracin !! 136         if (!open (FORMAT, "/sys/kernel/debug/tracing/events/$event/format")) {
144                 print("WARNING: Event $event f    137                 print("WARNING: Event $event format string not found\n");
145                 return $default;                  138                 return $default;
146         } else {                                  139         } else {
147                 my $line;                         140                 my $line;
148                 while (!eof(FORMAT)) {            141                 while (!eof(FORMAT)) {
149                         $line = <FORMAT>;         142                         $line = <FORMAT>;
150                         $line =~ s/, REC->.*//    143                         $line =~ s/, REC->.*//;
151                         if ($line =~ /^print f    144                         if ($line =~ /^print fmt:\s"(.*)".*/) {
152                                 $regex = $1;      145                                 $regex = $1;
153                                 $regex =~ s/%s    146                                 $regex =~ s/%s/\([0-9a-zA-Z|_]*\)/g;
154                                 $regex =~ s/%p    147                                 $regex =~ s/%p/\([0-9a-f]*\)/g;
155                                 $regex =~ s/%d    148                                 $regex =~ s/%d/\([-0-9]*\)/g;
156                                 $regex =~ s/%l    149                                 $regex =~ s/%ld/\([-0-9]*\)/g;
157                                 $regex =~ s/%l    150                                 $regex =~ s/%lu/\([0-9]*\)/g;
158                         }                         151                         }
159                 }                                 152                 }
160         }                                         153         }
161                                                   154 
162         # Can't handle the print_flags stuff b    155         # Can't handle the print_flags stuff but in the context of this
163         # script, it really doesn't matter        156         # script, it really doesn't matter
164         $regex =~ s/\(REC.*\) \? __print_flags    157         $regex =~ s/\(REC.*\) \? __print_flags.*//;
165                                                   158 
166         # Verify fields are in the right order    159         # Verify fields are in the right order
167         my $tuple;                                160         my $tuple;
168         foreach $tuple (split /\s/, $regex) {     161         foreach $tuple (split /\s/, $regex) {
169                 my ($key, $value) = split(/=/,    162                 my ($key, $value) = split(/=/, $tuple);
170                 my $expected = shift;             163                 my $expected = shift;
171                 if ($key ne $expected) {          164                 if ($key ne $expected) {
172                         print("WARNING: Format    165                         print("WARNING: Format not as expected for event $event '$key' != '$expected'\n");
173                         $regex =~ s/$key=\((.*    166                         $regex =~ s/$key=\((.*)\)/$key=$1/;
174                 }                                 167                 }
175         }                                         168         }
176                                                   169 
177         if (defined shift) {                      170         if (defined shift) {
178                 die("Fewer fields than expecte    171                 die("Fewer fields than expected in format");
179         }                                         172         }
180                                                   173 
181         return $regex;                            174         return $regex;
182 }                                                 175 }
183                                                   176 
184 $regex_direct_begin = generate_traceevent_rege    177 $regex_direct_begin = generate_traceevent_regex(
185                         "vmscan/mm_vmscan_dire    178                         "vmscan/mm_vmscan_direct_reclaim_begin",
186                         $regex_direct_begin_de    179                         $regex_direct_begin_default,
187                         "order", "gfp_flags"); !! 180                         "order", "may_writepage",
                                                   >> 181                         "gfp_flags");
188 $regex_direct_end = generate_traceevent_regex(    182 $regex_direct_end = generate_traceevent_regex(
189                         "vmscan/mm_vmscan_dire    183                         "vmscan/mm_vmscan_direct_reclaim_end",
190                         $regex_direct_end_defa    184                         $regex_direct_end_default,
191                         "nr_reclaimed");          185                         "nr_reclaimed");
192 $regex_kswapd_wake = generate_traceevent_regex    186 $regex_kswapd_wake = generate_traceevent_regex(
193                         "vmscan/mm_vmscan_kswa    187                         "vmscan/mm_vmscan_kswapd_wake",
194                         $regex_kswapd_wake_def    188                         $regex_kswapd_wake_default,
195                         "nid", "order");          189                         "nid", "order");
196 $regex_kswapd_sleep = generate_traceevent_rege    190 $regex_kswapd_sleep = generate_traceevent_regex(
197                         "vmscan/mm_vmscan_kswa    191                         "vmscan/mm_vmscan_kswapd_sleep",
198                         $regex_kswapd_sleep_de    192                         $regex_kswapd_sleep_default,
199                         "nid");                   193                         "nid");
200 $regex_wakeup_kswapd = generate_traceevent_reg    194 $regex_wakeup_kswapd = generate_traceevent_regex(
201                         "vmscan/mm_vmscan_wake    195                         "vmscan/mm_vmscan_wakeup_kswapd",
202                         $regex_wakeup_kswapd_d    196                         $regex_wakeup_kswapd_default,
203                         "nid", "order", "gfp_f !! 197                         "nid", "zid", "order");
204 $regex_lru_isolate = generate_traceevent_regex    198 $regex_lru_isolate = generate_traceevent_regex(
205                         "vmscan/mm_vmscan_lru_    199                         "vmscan/mm_vmscan_lru_isolate",
206                         $regex_lru_isolate_def    200                         $regex_lru_isolate_default,
207                         "classzone", "order",  !! 201                         "isolate_mode", "order",
208                         "nr_requested", "nr_sc !! 202                         "nr_requested", "nr_scanned", "nr_taken",
209                         "lru");                !! 203                         "contig_taken", "contig_dirty", "contig_failed");
210 $regex_lru_shrink_inactive = generate_traceeve    204 $regex_lru_shrink_inactive = generate_traceevent_regex(
211                         "vmscan/mm_vmscan_lru_    205                         "vmscan/mm_vmscan_lru_shrink_inactive",
212                         $regex_lru_shrink_inac    206                         $regex_lru_shrink_inactive_default,
213                         "nid", "nr_scanned", " !! 207                         "nid", "zid",
214                         "nr_congested", "nr_im !! 208                         "nr_scanned", "nr_reclaimed", "priority",
215                         "nr_activate_file", "n !! 209                         "flags");
216                         "nr_unmap_fail", "prio << 
217 $regex_lru_shrink_active = generate_traceevent    210 $regex_lru_shrink_active = generate_traceevent_regex(
218                         "vmscan/mm_vmscan_lru_    211                         "vmscan/mm_vmscan_lru_shrink_active",
219                         $regex_lru_shrink_acti    212                         $regex_lru_shrink_active_default,
220                         "nid", "nr_taken", "nr !! 213                         "nid", "zid",
221                         "priority", "flags");  !! 214                         "lru",
                                                   >> 215                         "nr_scanned", "nr_rotated", "priority");
222 $regex_writepage = generate_traceevent_regex(     216 $regex_writepage = generate_traceevent_regex(
223                         "vmscan/mm_vmscan_writ !! 217                         "vmscan/mm_vmscan_writepage",
224                         $regex_writepage_defau    218                         $regex_writepage_default,
225                         "page", "pfn", "flags"    219                         "page", "pfn", "flags");
226                                                   220 
227 sub read_statline($) {                            221 sub read_statline($) {
228         my $pid = $_[0];                          222         my $pid = $_[0];
229         my $statline;                             223         my $statline;
230                                                   224 
231         if (open(STAT, "/proc/$pid/stat")) {      225         if (open(STAT, "/proc/$pid/stat")) {
232                 $statline = <STAT>;               226                 $statline = <STAT>;
233                 close(STAT);                      227                 close(STAT);
234         }                                         228         }
235                                                   229 
236         if ($statline eq '') {                    230         if ($statline eq '') {
237                 $statline = "-1 (UNKNOWN_PROCE    231                 $statline = "-1 (UNKNOWN_PROCESS_NAME) R 0";
238         }                                         232         }
239                                                   233 
240         return $statline;                         234         return $statline;
241 }                                                 235 }
242                                                   236 
243 sub guess_process_pid($$) {                       237 sub guess_process_pid($$) {
244         my $pid = $_[0];                          238         my $pid = $_[0];
245         my $statline = $_[1];                     239         my $statline = $_[1];
246                                                   240 
247         if ($pid == 0) {                          241         if ($pid == 0) {
248                 return "swapper-0";               242                 return "swapper-0";
249         }                                         243         }
250                                                   244 
251         if ($statline !~ /$regex_statname/o) {    245         if ($statline !~ /$regex_statname/o) {
252                 die("Failed to math stat line     246                 die("Failed to math stat line for process name :: $statline");
253         }                                         247         }
254         return "$1-$pid";                         248         return "$1-$pid";
255 }                                                 249 }
256                                                   250 
257 # Convert sec.usec timestamp format               251 # Convert sec.usec timestamp format
258 sub timestamp_to_ms($) {                          252 sub timestamp_to_ms($) {
259         my $timestamp = $_[0];                    253         my $timestamp = $_[0];
260                                                   254 
261         my ($sec, $usec) = split (/\./, $times    255         my ($sec, $usec) = split (/\./, $timestamp);
262         return ($sec * 1000) + ($usec / 1000);    256         return ($sec * 1000) + ($usec / 1000);
263 }                                                 257 }
264                                                   258 
265 sub process_events {                              259 sub process_events {
266         my $traceevent;                           260         my $traceevent;
267         my $process_pid;                          261         my $process_pid;
268         my $cpus;                                 262         my $cpus;
269         my $timestamp;                            263         my $timestamp;
270         my $tracepoint;                           264         my $tracepoint;
271         my $details;                              265         my $details;
272         my $statline;                             266         my $statline;
273                                                   267 
274         # Read each line of the event log         268         # Read each line of the event log
275 EVENT_PROCESS:                                    269 EVENT_PROCESS:
276         while ($traceevent = <STDIN>) {           270         while ($traceevent = <STDIN>) {
277                 if ($traceevent =~ /$regex_tra    271                 if ($traceevent =~ /$regex_traceevent/o) {
278                         $process_pid = $1;        272                         $process_pid = $1;
279                         $timestamp = $4;       !! 273                         $timestamp = $3;
280                         $tracepoint = $5;      !! 274                         $tracepoint = $4;
281                                                   275 
282                         $process_pid =~ /(.*)-    276                         $process_pid =~ /(.*)-([0-9]*)$/;
283                         my $process = $1;         277                         my $process = $1;
284                         my $pid = $2;             278                         my $pid = $2;
285                                                   279 
286                         if ($process eq "") {     280                         if ($process eq "") {
287                                 $process = $la    281                                 $process = $last_procmap{$pid};
288                                 $process_pid =    282                                 $process_pid = "$process-$pid";
289                         }                         283                         }
290                         $last_procmap{$pid} =     284                         $last_procmap{$pid} = $process;
291                                                   285 
292                         if ($opt_read_procstat    286                         if ($opt_read_procstat) {
293                                 $statline = re    287                                 $statline = read_statline($pid);
294                                 if ($opt_read_    288                                 if ($opt_read_procstat && $process eq '') {
295                                         $proce    289                                         $process_pid = guess_process_pid($pid, $statline);
296                                 }                 290                                 }
297                         }                         291                         }
298                 } else {                          292                 } else {
299                         next;                     293                         next;
300                 }                                 294                 }
301                                                   295 
302                 # Perl Switch() sucks majorly     296                 # Perl Switch() sucks majorly
303                 if ($tracepoint eq "mm_vmscan_    297                 if ($tracepoint eq "mm_vmscan_direct_reclaim_begin") {
304                         $timestamp = timestamp    298                         $timestamp = timestamp_to_ms($timestamp);
305                         $perprocesspid{$proces    299                         $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN}++;
306                         $perprocesspid{$proces    300                         $perprocesspid{$process_pid}->{STATE_DIRECT_BEGIN} = $timestamp;
307                                                   301 
308                         $details = $6;         !! 302                         $details = $5;
309                         if ($details !~ /$rege    303                         if ($details !~ /$regex_direct_begin/o) {
310                                 print "WARNING    304                                 print "WARNING: Failed to parse mm_vmscan_direct_reclaim_begin as expected\n";
311                                 print "           305                                 print "         $details\n";
312                                 print "           306                                 print "         $regex_direct_begin\n";
313                                 next;             307                                 next;
314                         }                         308                         }
315                         my $order = $1;           309                         my $order = $1;
316                         $perprocesspid{$proces    310                         $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER}[$order]++;
317                         $perprocesspid{$proces    311                         $perprocesspid{$process_pid}->{STATE_DIRECT_ORDER} = $order;
318                 } elsif ($tracepoint eq "mm_vm    312                 } elsif ($tracepoint eq "mm_vmscan_direct_reclaim_end") {
319                         # Count the event itse    313                         # Count the event itself
320                         my $index = $perproces    314                         my $index = $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_END};
321                         $perprocesspid{$proces    315                         $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_END}++;
322                                                   316 
323                         # Record how long dire    317                         # Record how long direct reclaim took this time
324                         if (defined $perproces    318                         if (defined $perprocesspid{$process_pid}->{STATE_DIRECT_BEGIN}) {
325                                 $timestamp = t    319                                 $timestamp = timestamp_to_ms($timestamp);
326                                 my $order = $p    320                                 my $order = $perprocesspid{$process_pid}->{STATE_DIRECT_ORDER};
327                                 my $latency =     321                                 my $latency = ($timestamp - $perprocesspid{$process_pid}->{STATE_DIRECT_BEGIN});
328                                 $perprocesspid    322                                 $perprocesspid{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index] = "$order-$latency";
329                         }                         323                         }
330                 } elsif ($tracepoint eq "mm_vm    324                 } elsif ($tracepoint eq "mm_vmscan_kswapd_wake") {
331                         $details = $6;         !! 325                         $details = $5;
332                         if ($details !~ /$rege    326                         if ($details !~ /$regex_kswapd_wake/o) {
333                                 print "WARNING    327                                 print "WARNING: Failed to parse mm_vmscan_kswapd_wake as expected\n";
334                                 print "           328                                 print "         $details\n";
335                                 print "           329                                 print "         $regex_kswapd_wake\n";
336                                 next;             330                                 next;
337                         }                         331                         }
338                                                   332 
339                         my $order = $2;           333                         my $order = $2;
340                         $perprocesspid{$proces    334                         $perprocesspid{$process_pid}->{STATE_KSWAPD_ORDER} = $order;
341                         if (!$perprocesspid{$p    335                         if (!$perprocesspid{$process_pid}->{STATE_KSWAPD_BEGIN}) {
342                                 $timestamp = t    336                                 $timestamp = timestamp_to_ms($timestamp);
343                                 $perprocesspid    337                                 $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE}++;
344                                 $perprocesspid    338                                 $perprocesspid{$process_pid}->{STATE_KSWAPD_BEGIN} = $timestamp;
345                                 $perprocesspid    339                                 $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE_PERORDER}[$order]++;
346                         } else {                  340                         } else {
347                                 $perprocesspid    341                                 $perprocesspid{$process_pid}->{HIGH_KSWAPD_REWAKEUP}++;
348                                 $perprocesspid    342                                 $perprocesspid{$process_pid}->{HIGH_KSWAPD_REWAKEUP_PERORDER}[$order]++;
349                         }                         343                         }
350                 } elsif ($tracepoint eq "mm_vm    344                 } elsif ($tracepoint eq "mm_vmscan_kswapd_sleep") {
351                                                   345 
352                         # Count the event itse    346                         # Count the event itself
353                         my $index = $perproces    347                         my $index = $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_SLEEP};
354                         $perprocesspid{$proces    348                         $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_SLEEP}++;
355                                                   349 
356                         # Record how long kswa    350                         # Record how long kswapd was awake
357                         $timestamp = timestamp    351                         $timestamp = timestamp_to_ms($timestamp);
358                         my $order = $perproces    352                         my $order = $perprocesspid{$process_pid}->{STATE_KSWAPD_ORDER};
359                         my $latency = ($timest    353                         my $latency = ($timestamp - $perprocesspid{$process_pid}->{STATE_KSWAPD_BEGIN});
360                         $perprocesspid{$proces    354                         $perprocesspid{$process_pid}->{HIGH_KSWAPD_LATENCY}[$index] = "$order-$latency";
361                         $perprocesspid{$proces    355                         $perprocesspid{$process_pid}->{STATE_KSWAPD_BEGIN} = 0;
362                 } elsif ($tracepoint eq "mm_vm    356                 } elsif ($tracepoint eq "mm_vmscan_wakeup_kswapd") {
363                         $perprocesspid{$proces    357                         $perprocesspid{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD}++;
364                                                   358 
365                         $details = $6;         !! 359                         $details = $5;
366                         if ($details !~ /$rege    360                         if ($details !~ /$regex_wakeup_kswapd/o) {
367                                 print "WARNING    361                                 print "WARNING: Failed to parse mm_vmscan_wakeup_kswapd as expected\n";
368                                 print "           362                                 print "         $details\n";
369                                 print "           363                                 print "         $regex_wakeup_kswapd\n";
370                                 next;             364                                 next;
371                         }                         365                         }
372                         my $order = $2;        !! 366                         my $order = $3;
373                         $perprocesspid{$proces    367                         $perprocesspid{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD_PERORDER}[$order]++;
374                 } elsif ($tracepoint eq "mm_vm    368                 } elsif ($tracepoint eq "mm_vmscan_lru_isolate") {
375                         $details = $6;         !! 369                         $details = $5;
376                         if ($details !~ /$rege    370                         if ($details !~ /$regex_lru_isolate/o) {
377                                 print "WARNING    371                                 print "WARNING: Failed to parse mm_vmscan_lru_isolate as expected\n";
378                                 print "           372                                 print "         $details\n";
379                                 print "           373                                 print "         $regex_lru_isolate/o\n";
380                                 next;             374                                 next;
381                         }                         375                         }
                                                   >> 376                         my $isolate_mode = $1;
382                         my $nr_scanned = $4;      377                         my $nr_scanned = $4;
383                         my $lru = $7;          !! 378                         my $nr_contig_dirty = $7;
384                                                   379 
385                         # To closer match vmst !! 380                         # To closer match vmstat scanning statistics, only count isolate_both
386                         # inactive lru as scan !! 381                         # and isolate_inactive as scanning. isolate_active is rotation
387                         if ($lru =~ /inactive_ !! 382                         # isolate_inactive == 1
                                                   >> 383                         # isolate_active   == 2
                                                   >> 384                         # isolate_both     == 3
                                                   >> 385                         if ($isolate_mode != 2) {
388                                 $perprocesspid    386                                 $perprocesspid{$process_pid}->{HIGH_NR_SCANNED} += $nr_scanned;
389                                 if ($lru =~ /_ << 
390                                         $perpr << 
391                                 } else {       << 
392                                         $perpr << 
393                                 }              << 
394                         }                         387                         }
                                                   >> 388                         $perprocesspid{$process_pid}->{HIGH_NR_CONTIG_DIRTY} += $nr_contig_dirty;
395                 } elsif ($tracepoint eq "mm_vm    389                 } elsif ($tracepoint eq "mm_vmscan_lru_shrink_inactive") {
396                         $details = $6;         !! 390                         $details = $5;
397                         if ($details !~ /$rege    391                         if ($details !~ /$regex_lru_shrink_inactive/o) {
398                                 print "WARNING    392                                 print "WARNING: Failed to parse mm_vmscan_lru_shrink_inactive as expected\n";
399                                 print "           393                                 print "         $details\n";
400                                 print "           394                                 print "         $regex_lru_shrink_inactive/o\n";
401                                 next;             395                                 next;
402                         }                         396                         }
403                                                !! 397                         my $nr_reclaimed = $4;
404                         my $nr_reclaimed = $3; << 
405                         my $flags = $13;       << 
406                         my $file = 0;          << 
407                         if ($flags =~ /RECLAIM << 
408                                 $file = 1;     << 
409                         }                      << 
410                         $perprocesspid{$proces    398                         $perprocesspid{$process_pid}->{HIGH_NR_RECLAIMED} += $nr_reclaimed;
411                         if ($file) {           << 
412                                 $perprocesspid << 
413                         } else {               << 
414                                 $perprocesspid << 
415                         }                      << 
416                 } elsif ($tracepoint eq "mm_vm    399                 } elsif ($tracepoint eq "mm_vmscan_writepage") {
417                         $details = $6;         !! 400                         $details = $5;
418                         if ($details !~ /$rege    401                         if ($details !~ /$regex_writepage/o) {
419                                 print "WARNING    402                                 print "WARNING: Failed to parse mm_vmscan_writepage as expected\n";
420                                 print "           403                                 print "         $details\n";
421                                 print "           404                                 print "         $regex_writepage\n";
422                                 next;             405                                 next;
423                         }                         406                         }
424                                                   407 
425                         my $flags = $3;           408                         my $flags = $3;
426                         my $file = 0;             409                         my $file = 0;
427                         my $sync_io = 0;          410                         my $sync_io = 0;
428                         if ($flags =~ /RECLAIM    411                         if ($flags =~ /RECLAIM_WB_FILE/) {
429                                 $file = 1;        412                                 $file = 1;
430                         }                         413                         }
431                         if ($flags =~ /RECLAIM    414                         if ($flags =~ /RECLAIM_WB_SYNC/) {
432                                 $sync_io = 1;     415                                 $sync_io = 1;
433                         }                         416                         }
434                         if ($sync_io) {           417                         if ($sync_io) {
435                                 if ($file) {      418                                 if ($file) {
436                                         $perpr    419                                         $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC}++;
437                                 } else {          420                                 } else {
438                                         $perpr    421                                         $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC}++;
439                                 }                 422                                 }
440                         } else {                  423                         } else {
441                                 if ($file) {      424                                 if ($file) {
442                                         $perpr    425                                         $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC}++;
443                                 } else {          426                                 } else {
444                                         $perpr    427                                         $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC}++;
445                                 }                 428                                 }
446                         }                         429                         }
447                 } else {                          430                 } else {
448                         $perprocesspid{$proces    431                         $perprocesspid{$process_pid}->{EVENT_UNKNOWN}++;
449                 }                                 432                 }
450                                                   433 
451                 if ($sigint_pending) {            434                 if ($sigint_pending) {
452                         last EVENT_PROCESS;       435                         last EVENT_PROCESS;
453                 }                                 436                 }
454         }                                         437         }
455 }                                                 438 }
456                                                   439 
457 sub dump_stats {                                  440 sub dump_stats {
458         my $hashref = shift;                      441         my $hashref = shift;
459         my %stats = %$hashref;                    442         my %stats = %$hashref;
460                                                   443 
461         # Dump per-process stats                  444         # Dump per-process stats
462         my $process_pid;                          445         my $process_pid;
463         my $max_strlen = 0;                       446         my $max_strlen = 0;
464                                                   447 
465         # Get the maximum process name            448         # Get the maximum process name
466         foreach $process_pid (keys %perprocess    449         foreach $process_pid (keys %perprocesspid) {
467                 my $len = length($process_pid)    450                 my $len = length($process_pid);
468                 if ($len > $max_strlen) {         451                 if ($len > $max_strlen) {
469                         $max_strlen = $len;       452                         $max_strlen = $len;
470                 }                                 453                 }
471         }                                         454         }
472         $max_strlen += 2;                         455         $max_strlen += 2;
473                                                   456 
474         # Work out latencies                      457         # Work out latencies
475         printf("\n") if !$opt_ignorepid;          458         printf("\n") if !$opt_ignorepid;
476         printf("Reclaim latencies expressed as    459         printf("Reclaim latencies expressed as order-latency_in_ms\n") if !$opt_ignorepid;
477         foreach $process_pid (keys %stats) {      460         foreach $process_pid (keys %stats) {
478                                                   461 
479                 if (!$stats{$process_pid}->{HI    462                 if (!$stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[0] &&
480                                 !$stats{$proce    463                                 !$stats{$process_pid}->{HIGH_KSWAPD_LATENCY}[0]) {
481                         next;                     464                         next;
482                 }                                 465                 }
483                                                   466 
484                 printf "%-" . $max_strlen . "s    467                 printf "%-" . $max_strlen . "s ", $process_pid if !$opt_ignorepid;
485                 my $index = 0;                    468                 my $index = 0;
486                 while (defined $stats{$process    469                 while (defined $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index] ||
487                         defined $stats{$proces    470                         defined $stats{$process_pid}->{HIGH_KSWAPD_LATENCY}[$index]) {
488                                                   471 
489                         if ($stats{$process_pi    472                         if ($stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]) {
490                                 printf("%s ",     473                                 printf("%s ", $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]) if !$opt_ignorepid;
491                                 my ($dummy, $l    474                                 my ($dummy, $latency) = split(/-/, $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]);
492                                 $total_direct_    475                                 $total_direct_latency += $latency;
493                         } else {                  476                         } else {
494                                 printf("%s ",     477                                 printf("%s ", $stats{$process_pid}->{HIGH_KSWAPD_LATENCY}[$index]) if !$opt_ignorepid;
495                                 my ($dummy, $l    478                                 my ($dummy, $latency) = split(/-/, $stats{$process_pid}->{HIGH_KSWAPD_LATENCY}[$index]);
496                                 $total_kswapd_    479                                 $total_kswapd_latency += $latency;
497                         }                         480                         }
498                         $index++;                 481                         $index++;
499                 }                                 482                 }
500                 print "\n" if !$opt_ignorepid;    483                 print "\n" if !$opt_ignorepid;
501         }                                         484         }
502                                                   485 
503         # Print out process activity              486         # Print out process activity
504         printf("\n");                             487         printf("\n");
505         printf("%-" . $max_strlen . "s %8s %10    488         printf("%-" . $max_strlen . "s %8s %10s   %8s %8s  %8s %8s %8s %8s\n", "Process", "Direct",  "Wokeup", "Pages",   "Pages",   "Pages",   "Pages",     "Time");
506         printf("%-" . $max_strlen . "s %8s %10    489         printf("%-" . $max_strlen . "s %8s %10s   %8s %8s  %8s %8s %8s %8s\n", "details", "Rclms",   "Kswapd", "Scanned", "Rclmed",  "Sync-IO", "ASync-IO",  "Stalled");
507         foreach $process_pid (keys %stats) {      490         foreach $process_pid (keys %stats) {
508                                                   491 
509                 if (!$stats{$process_pid}->{MM    492                 if (!$stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN}) {
510                         next;                     493                         next;
511                 }                                 494                 }
512                                                   495 
513                 $total_direct_reclaim += $stat    496                 $total_direct_reclaim += $stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN};
514                 $total_wakeup_kswapd += $stats    497                 $total_wakeup_kswapd += $stats{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD};
515                 $total_direct_nr_scanned += $s    498                 $total_direct_nr_scanned += $stats{$process_pid}->{HIGH_NR_SCANNED};
516                 $total_direct_nr_file_scanned  << 
517                 $total_direct_nr_anon_scanned  << 
518                 $total_direct_nr_reclaimed +=     499                 $total_direct_nr_reclaimed += $stats{$process_pid}->{HIGH_NR_RECLAIMED};
519                 $total_direct_nr_file_reclaime << 
520                 $total_direct_nr_anon_reclaime << 
521                 $total_direct_writepage_file_s    500                 $total_direct_writepage_file_sync += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC};
522                 $total_direct_writepage_anon_s    501                 $total_direct_writepage_anon_sync += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC};
523                 $total_direct_writepage_file_a    502                 $total_direct_writepage_file_async += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC};
524                                                   503 
525                 $total_direct_writepage_anon_a    504                 $total_direct_writepage_anon_async += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC};
526                                                   505 
527                 my $index = 0;                    506                 my $index = 0;
528                 my $this_reclaim_delay = 0;       507                 my $this_reclaim_delay = 0;
529                 while (defined $stats{$process    508                 while (defined $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]) {
530                          my ($dummy, $latency)    509                          my ($dummy, $latency) = split(/-/, $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]);
531                         $this_reclaim_delay +=    510                         $this_reclaim_delay += $latency;
532                         $index++;                 511                         $index++;
533                 }                                 512                 }
534                                                   513 
535                 printf("%-" . $max_strlen . "s    514                 printf("%-" . $max_strlen . "s %8d %10d   %8u %8u  %8u %8u %8.3f",
536                         $process_pid,             515                         $process_pid,
537                         $stats{$process_pid}->    516                         $stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN},
538                         $stats{$process_pid}->    517                         $stats{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD},
539                         $stats{$process_pid}->    518                         $stats{$process_pid}->{HIGH_NR_SCANNED},
540                         $stats{$process_pid}-> << 
541                         $stats{$process_pid}-> << 
542                         $stats{$process_pid}->    519                         $stats{$process_pid}->{HIGH_NR_RECLAIMED},
543                         $stats{$process_pid}-> << 
544                         $stats{$process_pid}-> << 
545                         $stats{$process_pid}->    520                         $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC} + $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC},
546                         $stats{$process_pid}->    521                         $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC} + $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC},
547                         $this_reclaim_delay /     522                         $this_reclaim_delay / 1000);
548                                                   523 
549                 if ($stats{$process_pid}->{MM_    524                 if ($stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN}) {
550                         print "      ";           525                         print "      ";
551                         for (my $order = 0; $o    526                         for (my $order = 0; $order < 20; $order++) {
552                                 my $count = $s    527                                 my $count = $stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER}[$order];
553                                 if ($count !=     528                                 if ($count != 0) {
554                                         print     529                                         print "direct-$order=$count ";
555                                 }                 530                                 }
556                         }                         531                         }
557                 }                                 532                 }
558                 if ($stats{$process_pid}->{MM_    533                 if ($stats{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD}) {
559                         print "      ";           534                         print "      ";
560                         for (my $order = 0; $o    535                         for (my $order = 0; $order < 20; $order++) {
561                                 my $count = $s    536                                 my $count = $stats{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD_PERORDER}[$order];
562                                 if ($count !=     537                                 if ($count != 0) {
563                                         print     538                                         print "wakeup-$order=$count ";
564                                 }                 539                                 }
565                         }                         540                         }
566                 }                                 541                 }
                                                   >> 542                 if ($stats{$process_pid}->{HIGH_NR_CONTIG_DIRTY}) {
                                                   >> 543                         print "      ";
                                                   >> 544                         my $count = $stats{$process_pid}->{HIGH_NR_CONTIG_DIRTY};
                                                   >> 545                         if ($count != 0) {
                                                   >> 546                                 print "contig-dirty=$count ";
                                                   >> 547                         }
                                                   >> 548                 }
567                                                   549 
568                 print "\n";                       550                 print "\n";
569         }                                         551         }
570                                                   552 
571         # Print out kswapd activity               553         # Print out kswapd activity
572         printf("\n");                             554         printf("\n");
573         printf("%-" . $max_strlen . "s %8s %10    555         printf("%-" . $max_strlen . "s %8s %10s   %8s   %8s %8s %8s\n", "Kswapd",   "Kswapd",  "Order",     "Pages",   "Pages",   "Pages",  "Pages");
574         printf("%-" . $max_strlen . "s %8s %10    556         printf("%-" . $max_strlen . "s %8s %10s   %8s   %8s %8s %8s\n", "Instance", "Wakeups", "Re-wakeup", "Scanned", "Rclmed",  "Sync-IO", "ASync-IO");
575         foreach $process_pid (keys %stats) {      557         foreach $process_pid (keys %stats) {
576                                                   558 
577                 if (!$stats{$process_pid}->{MM    559                 if (!$stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE}) {
578                         next;                     560                         next;
579                 }                                 561                 }
580                                                   562 
581                 $total_kswapd_wake += $stats{$    563                 $total_kswapd_wake += $stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE};
582                 $total_kswapd_nr_scanned += $s    564                 $total_kswapd_nr_scanned += $stats{$process_pid}->{HIGH_NR_SCANNED};
583                 $total_kswapd_nr_file_scanned  << 
584                 $total_kswapd_nr_anon_scanned  << 
585                 $total_kswapd_nr_reclaimed +=     565                 $total_kswapd_nr_reclaimed += $stats{$process_pid}->{HIGH_NR_RECLAIMED};
586                 $total_kswapd_nr_file_reclaime << 
587                 $total_kswapd_nr_anon_reclaime << 
588                 $total_kswapd_writepage_file_s    566                 $total_kswapd_writepage_file_sync += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC};
589                 $total_kswapd_writepage_anon_s    567                 $total_kswapd_writepage_anon_sync += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC};
590                 $total_kswapd_writepage_file_a    568                 $total_kswapd_writepage_file_async += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC};
591                 $total_kswapd_writepage_anon_a    569                 $total_kswapd_writepage_anon_async += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC};
592                                                   570 
593                 printf("%-" . $max_strlen . "s    571                 printf("%-" . $max_strlen . "s %8d %10d   %8u %8u  %8i %8u",
594                         $process_pid,             572                         $process_pid,
595                         $stats{$process_pid}->    573                         $stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE},
596                         $stats{$process_pid}->    574                         $stats{$process_pid}->{HIGH_KSWAPD_REWAKEUP},
597                         $stats{$process_pid}->    575                         $stats{$process_pid}->{HIGH_NR_SCANNED},
598                         $stats{$process_pid}-> << 
599                         $stats{$process_pid}-> << 
600                         $stats{$process_pid}->    576                         $stats{$process_pid}->{HIGH_NR_RECLAIMED},
601                         $stats{$process_pid}-> << 
602                         $stats{$process_pid}-> << 
603                         $stats{$process_pid}->    577                         $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC} + $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC},
604                         $stats{$process_pid}->    578                         $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC} + $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC});
605                                                   579 
606                 if ($stats{$process_pid}->{MM_    580                 if ($stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE}) {
607                         print "      ";           581                         print "      ";
608                         for (my $order = 0; $o    582                         for (my $order = 0; $order < 20; $order++) {
609                                 my $count = $s    583                                 my $count = $stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE_PERORDER}[$order];
610                                 if ($count !=     584                                 if ($count != 0) {
611                                         print     585                                         print "wake-$order=$count ";
612                                 }                 586                                 }
613                         }                         587                         }
614                 }                                 588                 }
615                 if ($stats{$process_pid}->{HIG    589                 if ($stats{$process_pid}->{HIGH_KSWAPD_REWAKEUP}) {
616                         print "      ";           590                         print "      ";
617                         for (my $order = 0; $o    591                         for (my $order = 0; $order < 20; $order++) {
618                                 my $count = $s    592                                 my $count = $stats{$process_pid}->{HIGH_KSWAPD_REWAKEUP_PERORDER}[$order];
619                                 if ($count !=     593                                 if ($count != 0) {
620                                         print     594                                         print "rewake-$order=$count ";
621                                 }                 595                                 }
622                         }                         596                         }
623                 }                                 597                 }
624                 printf("\n");                     598                 printf("\n");
625         }                                         599         }
626                                                   600 
627         # Print out summaries                     601         # Print out summaries
628         $total_direct_latency /= 1000;            602         $total_direct_latency /= 1000;
629         $total_kswapd_latency /= 1000;            603         $total_kswapd_latency /= 1000;
630         print "\nSummary\n";                      604         print "\nSummary\n";
631         print "Direct reclaims:                   605         print "Direct reclaims:                         $total_direct_reclaim\n";
632         print "Direct reclaim pages scanned:      606         print "Direct reclaim pages scanned:            $total_direct_nr_scanned\n";
633         print "Direct reclaim file pages scann << 
634         print "Direct reclaim anon pages scann << 
635         print "Direct reclaim pages reclaimed:    607         print "Direct reclaim pages reclaimed:          $total_direct_nr_reclaimed\n";
636         print "Direct reclaim file pages recla << 
637         print "Direct reclaim anon pages recla << 
638         print "Direct reclaim write file sync     608         print "Direct reclaim write file sync I/O:      $total_direct_writepage_file_sync\n";
639         print "Direct reclaim write anon sync     609         print "Direct reclaim write anon sync I/O:      $total_direct_writepage_anon_sync\n";
640         print "Direct reclaim write file async    610         print "Direct reclaim write file async I/O:     $total_direct_writepage_file_async\n";
641         print "Direct reclaim write anon async    611         print "Direct reclaim write anon async I/O:     $total_direct_writepage_anon_async\n";
642         print "Wake kswapd requests:              612         print "Wake kswapd requests:                    $total_wakeup_kswapd\n";
643         printf "Time stalled direct reclaim:      613         printf "Time stalled direct reclaim:            %-1.2f seconds\n", $total_direct_latency;
644         print "\n";                               614         print "\n";
645         print "Kswapd wakeups:                    615         print "Kswapd wakeups:                          $total_kswapd_wake\n";
646         print "Kswapd pages scanned:              616         print "Kswapd pages scanned:                    $total_kswapd_nr_scanned\n";
647         print "Kswapd file pages scanned:      << 
648         print "Kswapd anon pages scanned:      << 
649         print "Kswapd pages reclaimed:            617         print "Kswapd pages reclaimed:                  $total_kswapd_nr_reclaimed\n";
650         print "Kswapd file pages reclaimed:    << 
651         print "Kswapd anon pages reclaimed:    << 
652         print "Kswapd reclaim write file sync     618         print "Kswapd reclaim write file sync I/O:      $total_kswapd_writepage_file_sync\n";
653         print "Kswapd reclaim write anon sync     619         print "Kswapd reclaim write anon sync I/O:      $total_kswapd_writepage_anon_sync\n";
654         print "Kswapd reclaim write file async    620         print "Kswapd reclaim write file async I/O:     $total_kswapd_writepage_file_async\n";
655         print "Kswapd reclaim write anon async    621         print "Kswapd reclaim write anon async I/O:     $total_kswapd_writepage_anon_async\n";
656         printf "Time kswapd awake:                622         printf "Time kswapd awake:                      %-1.2f seconds\n", $total_kswapd_latency;
657 }                                                 623 }
658                                                   624 
659 sub aggregate_perprocesspid() {                   625 sub aggregate_perprocesspid() {
660         my $process_pid;                          626         my $process_pid;
661         my $process;                              627         my $process;
662         undef %perprocess;                        628         undef %perprocess;
663                                                   629 
664         foreach $process_pid (keys %perprocess    630         foreach $process_pid (keys %perprocesspid) {
665                 $process = $process_pid;          631                 $process = $process_pid;
666                 $process =~ s/-([0-9])*$//;       632                 $process =~ s/-([0-9])*$//;
667                 if ($process eq '') {             633                 if ($process eq '') {
668                         $process = "NO_PROCESS    634                         $process = "NO_PROCESS_NAME";
669                 }                                 635                 }
670                                                   636 
671                 $perprocess{$process}->{MM_VMS    637                 $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN} += $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN};
672                 $perprocess{$process}->{MM_VMS    638                 $perprocess{$process}->{MM_VMSCAN_KSWAPD_WAKE} += $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE};
673                 $perprocess{$process}->{MM_VMS    639                 $perprocess{$process}->{MM_VMSCAN_WAKEUP_KSWAPD} += $perprocesspid{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD};
674                 $perprocess{$process}->{HIGH_K    640                 $perprocess{$process}->{HIGH_KSWAPD_REWAKEUP} += $perprocesspid{$process_pid}->{HIGH_KSWAPD_REWAKEUP};
675                 $perprocess{$process}->{HIGH_N    641                 $perprocess{$process}->{HIGH_NR_SCANNED} += $perprocesspid{$process_pid}->{HIGH_NR_SCANNED};
676                 $perprocess{$process}->{HIGH_N << 
677                 $perprocess{$process}->{HIGH_N << 
678                 $perprocess{$process}->{HIGH_N    642                 $perprocess{$process}->{HIGH_NR_RECLAIMED} += $perprocesspid{$process_pid}->{HIGH_NR_RECLAIMED};
679                 $perprocess{$process}->{HIGH_N << 
680                 $perprocess{$process}->{HIGH_N << 
681                 $perprocess{$process}->{MM_VMS    643                 $perprocess{$process}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC} += $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC};
682                 $perprocess{$process}->{MM_VMS    644                 $perprocess{$process}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC} += $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC};
683                 $perprocess{$process}->{MM_VMS    645                 $perprocess{$process}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC} += $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC};
684                 $perprocess{$process}->{MM_VMS    646                 $perprocess{$process}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC} += $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC};
685                                                   647 
686                 for (my $order = 0; $order < 2    648                 for (my $order = 0; $order < 20; $order++) {
687                         $perprocess{$process}-    649                         $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER}[$order] += $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER}[$order];
688                         $perprocess{$process}-    650                         $perprocess{$process}->{MM_VMSCAN_WAKEUP_KSWAPD_PERORDER}[$order] += $perprocesspid{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD_PERORDER}[$order];
689                         $perprocess{$process}-    651                         $perprocess{$process}->{MM_VMSCAN_KSWAPD_WAKE_PERORDER}[$order] += $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE_PERORDER}[$order];
690                                                   652 
691                 }                                 653                 }
692                                                   654 
693                 # Aggregate direct reclaim lat    655                 # Aggregate direct reclaim latencies
694                 my $wr_index = $perprocess{$pr    656                 my $wr_index = $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_END};
695                 my $rd_index = 0;                 657                 my $rd_index = 0;
696                 while (defined $perprocesspid{    658                 while (defined $perprocesspid{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$rd_index]) {
697                         $perprocess{$process}-    659                         $perprocess{$process}->{HIGH_DIRECT_RECLAIM_LATENCY}[$wr_index] = $perprocesspid{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$rd_index];
698                         $rd_index++;              660                         $rd_index++;
699                         $wr_index++;              661                         $wr_index++;
700                 }                                 662                 }
701                 $perprocess{$process}->{MM_VMS    663                 $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_END} = $wr_index;
702                                                   664 
703                 # Aggregate kswapd latencies      665                 # Aggregate kswapd latencies
704                 my $wr_index = $perprocess{$pr    666                 my $wr_index = $perprocess{$process}->{MM_VMSCAN_KSWAPD_SLEEP};
705                 my $rd_index = 0;                 667                 my $rd_index = 0;
706                 while (defined $perprocesspid{    668                 while (defined $perprocesspid{$process_pid}->{HIGH_KSWAPD_LATENCY}[$rd_index]) {
707                         $perprocess{$process}-    669                         $perprocess{$process}->{HIGH_KSWAPD_LATENCY}[$wr_index] = $perprocesspid{$process_pid}->{HIGH_KSWAPD_LATENCY}[$rd_index];
708                         $rd_index++;              670                         $rd_index++;
709                         $wr_index++;              671                         $wr_index++;
710                 }                                 672                 }
711                 $perprocess{$process}->{MM_VMS    673                 $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_END} = $wr_index;
712         }                                         674         }
713 }                                                 675 }
714                                                   676 
715 sub report() {                                    677 sub report() {
716         if (!$opt_ignorepid) {                    678         if (!$opt_ignorepid) {
717                 dump_stats(\%perprocesspid);      679                 dump_stats(\%perprocesspid);
718         } else {                                  680         } else {
719                 aggregate_perprocesspid();        681                 aggregate_perprocesspid();
720                 dump_stats(\%perprocess);         682                 dump_stats(\%perprocess);
721         }                                         683         }
722 }                                                 684 }
723                                                   685 
724 # Process events or signals until neither is a    686 # Process events or signals until neither is available
725 sub signal_loop() {                               687 sub signal_loop() {
726         my $sigint_processed;                     688         my $sigint_processed;
727         do {                                      689         do {
728                 $sigint_processed = 0;            690                 $sigint_processed = 0;
729                 process_events();                 691                 process_events();
730                                                   692 
731                 # Handle pending signals if an    693                 # Handle pending signals if any
732                 if ($sigint_pending) {            694                 if ($sigint_pending) {
733                         my $current_time = tim    695                         my $current_time = time;
734                                                   696 
735                         if ($sigint_exit) {       697                         if ($sigint_exit) {
736                                 print "Receive    698                                 print "Received exit signal\n";
737                                 $sigint_pendin    699                                 $sigint_pending = 0;
738                         }                         700                         }
739                         if ($sigint_report) {     701                         if ($sigint_report) {
740                                 if ($current_t    702                                 if ($current_time >= $sigint_received + 2) {
741                                         report    703                                         report();
742                                         $sigin    704                                         $sigint_report = 0;
743                                         $sigin    705                                         $sigint_pending = 0;
744                                         $sigin    706                                         $sigint_processed = 1;
745                                 }                 707                                 }
746                         }                         708                         }
747                 }                                 709                 }
748         } while ($sigint_pending || $sigint_pr    710         } while ($sigint_pending || $sigint_processed);
749 }                                                 711 }
750                                                   712 
751 signal_loop();                                    713 signal_loop();
752 report();                                         714 report();
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php