162306a36Sopenharmony_ci#!/usr/bin/env perl 262306a36Sopenharmony_ci# This is a POC for reading the text representation of trace output related to 362306a36Sopenharmony_ci# page reclaim. It makes an attempt to extract some high-level information on 462306a36Sopenharmony_ci# what is going on. The accuracy of the parser may vary 562306a36Sopenharmony_ci# 662306a36Sopenharmony_ci# Example usage: trace-vmscan-postprocess.pl < /sys/kernel/tracing/trace_pipe 762306a36Sopenharmony_ci# other options 862306a36Sopenharmony_ci# --read-procstat If the trace lacks process info, get it from /proc 962306a36Sopenharmony_ci# --ignore-pid Aggregate processes of the same name together 1062306a36Sopenharmony_ci# 1162306a36Sopenharmony_ci# Copyright (c) IBM Corporation 2009 1262306a36Sopenharmony_ci# Author: Mel Gorman <mel@csn.ul.ie> 1362306a36Sopenharmony_ciuse strict; 1462306a36Sopenharmony_ciuse Getopt::Long; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci# Tracepoint events 1762306a36Sopenharmony_ciuse constant MM_VMSCAN_DIRECT_RECLAIM_BEGIN => 1; 1862306a36Sopenharmony_ciuse constant MM_VMSCAN_DIRECT_RECLAIM_END => 2; 1962306a36Sopenharmony_ciuse constant MM_VMSCAN_KSWAPD_WAKE => 3; 2062306a36Sopenharmony_ciuse constant MM_VMSCAN_KSWAPD_SLEEP => 4; 2162306a36Sopenharmony_ciuse constant MM_VMSCAN_LRU_SHRINK_ACTIVE => 5; 2262306a36Sopenharmony_ciuse constant MM_VMSCAN_LRU_SHRINK_INACTIVE => 6; 2362306a36Sopenharmony_ciuse constant MM_VMSCAN_LRU_ISOLATE => 7; 2462306a36Sopenharmony_ciuse constant MM_VMSCAN_WRITEPAGE_FILE_SYNC => 8; 2562306a36Sopenharmony_ciuse constant MM_VMSCAN_WRITEPAGE_ANON_SYNC => 9; 2662306a36Sopenharmony_ciuse constant MM_VMSCAN_WRITEPAGE_FILE_ASYNC => 10; 2762306a36Sopenharmony_ciuse constant MM_VMSCAN_WRITEPAGE_ANON_ASYNC => 11; 2862306a36Sopenharmony_ciuse constant MM_VMSCAN_WRITEPAGE_ASYNC => 12; 2962306a36Sopenharmony_ciuse constant EVENT_UNKNOWN => 13; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci# Per-order events 3262306a36Sopenharmony_ciuse constant MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER => 11; 3362306a36Sopenharmony_ciuse constant MM_VMSCAN_WAKEUP_KSWAPD_PERORDER => 12; 3462306a36Sopenharmony_ciuse constant MM_VMSCAN_KSWAPD_WAKE_PERORDER => 13; 3562306a36Sopenharmony_ciuse constant HIGH_KSWAPD_REWAKEUP_PERORDER => 14; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci# Constants used to track state 3862306a36Sopenharmony_ciuse constant STATE_DIRECT_BEGIN => 15; 3962306a36Sopenharmony_ciuse constant STATE_DIRECT_ORDER => 16; 4062306a36Sopenharmony_ciuse constant STATE_KSWAPD_BEGIN => 17; 4162306a36Sopenharmony_ciuse constant STATE_KSWAPD_ORDER => 18; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci# High-level events extrapolated from tracepoints 4462306a36Sopenharmony_ciuse constant HIGH_DIRECT_RECLAIM_LATENCY => 19; 4562306a36Sopenharmony_ciuse constant HIGH_KSWAPD_LATENCY => 20; 4662306a36Sopenharmony_ciuse constant HIGH_KSWAPD_REWAKEUP => 21; 4762306a36Sopenharmony_ciuse constant HIGH_NR_SCANNED => 22; 4862306a36Sopenharmony_ciuse constant HIGH_NR_TAKEN => 23; 4962306a36Sopenharmony_ciuse constant HIGH_NR_RECLAIMED => 24; 5062306a36Sopenharmony_ciuse constant HIGH_NR_FILE_SCANNED => 25; 5162306a36Sopenharmony_ciuse constant HIGH_NR_ANON_SCANNED => 26; 5262306a36Sopenharmony_ciuse constant HIGH_NR_FILE_RECLAIMED => 27; 5362306a36Sopenharmony_ciuse constant HIGH_NR_ANON_RECLAIMED => 28; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cimy %perprocesspid; 5662306a36Sopenharmony_cimy %perprocess; 5762306a36Sopenharmony_cimy %last_procmap; 5862306a36Sopenharmony_cimy $opt_ignorepid; 5962306a36Sopenharmony_cimy $opt_read_procstat; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cimy $total_wakeup_kswapd; 6262306a36Sopenharmony_cimy ($total_direct_reclaim, $total_direct_nr_scanned); 6362306a36Sopenharmony_cimy ($total_direct_nr_file_scanned, $total_direct_nr_anon_scanned); 6462306a36Sopenharmony_cimy ($total_direct_latency, $total_kswapd_latency); 6562306a36Sopenharmony_cimy ($total_direct_nr_reclaimed); 6662306a36Sopenharmony_cimy ($total_direct_nr_file_reclaimed, $total_direct_nr_anon_reclaimed); 6762306a36Sopenharmony_cimy ($total_direct_writepage_file_sync, $total_direct_writepage_file_async); 6862306a36Sopenharmony_cimy ($total_direct_writepage_anon_sync, $total_direct_writepage_anon_async); 6962306a36Sopenharmony_cimy ($total_kswapd_nr_scanned, $total_kswapd_wake); 7062306a36Sopenharmony_cimy ($total_kswapd_nr_file_scanned, $total_kswapd_nr_anon_scanned); 7162306a36Sopenharmony_cimy ($total_kswapd_writepage_file_sync, $total_kswapd_writepage_file_async); 7262306a36Sopenharmony_cimy ($total_kswapd_writepage_anon_sync, $total_kswapd_writepage_anon_async); 7362306a36Sopenharmony_cimy ($total_kswapd_nr_reclaimed); 7462306a36Sopenharmony_cimy ($total_kswapd_nr_file_reclaimed, $total_kswapd_nr_anon_reclaimed); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci# Catch sigint and exit on request 7762306a36Sopenharmony_cimy $sigint_report = 0; 7862306a36Sopenharmony_cimy $sigint_exit = 0; 7962306a36Sopenharmony_cimy $sigint_pending = 0; 8062306a36Sopenharmony_cimy $sigint_received = 0; 8162306a36Sopenharmony_cisub sigint_handler { 8262306a36Sopenharmony_ci my $current_time = time; 8362306a36Sopenharmony_ci if ($current_time - 2 > $sigint_received) { 8462306a36Sopenharmony_ci print "SIGINT received, report pending. Hit ctrl-c again to exit\n"; 8562306a36Sopenharmony_ci $sigint_report = 1; 8662306a36Sopenharmony_ci } else { 8762306a36Sopenharmony_ci if (!$sigint_exit) { 8862306a36Sopenharmony_ci print "Second SIGINT received quickly, exiting\n"; 8962306a36Sopenharmony_ci } 9062306a36Sopenharmony_ci $sigint_exit++; 9162306a36Sopenharmony_ci } 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci if ($sigint_exit > 3) { 9462306a36Sopenharmony_ci print "Many SIGINTs received, exiting now without report\n"; 9562306a36Sopenharmony_ci exit; 9662306a36Sopenharmony_ci } 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci $sigint_received = $current_time; 9962306a36Sopenharmony_ci $sigint_pending = 1; 10062306a36Sopenharmony_ci} 10162306a36Sopenharmony_ci$SIG{INT} = "sigint_handler"; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci# Parse command line options 10462306a36Sopenharmony_ciGetOptions( 10562306a36Sopenharmony_ci 'ignore-pid' => \$opt_ignorepid, 10662306a36Sopenharmony_ci 'read-procstat' => \$opt_read_procstat, 10762306a36Sopenharmony_ci); 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci# Defaults for dynamically discovered regex's 11062306a36Sopenharmony_cimy $regex_direct_begin_default = 'order=([0-9]*) may_writepage=([0-9]*) gfp_flags=([A-Z_|]*)'; 11162306a36Sopenharmony_cimy $regex_direct_end_default = 'nr_reclaimed=([0-9]*)'; 11262306a36Sopenharmony_cimy $regex_kswapd_wake_default = 'nid=([0-9]*) order=([0-9]*)'; 11362306a36Sopenharmony_cimy $regex_kswapd_sleep_default = 'nid=([0-9]*)'; 11462306a36Sopenharmony_cimy $regex_wakeup_kswapd_default = 'nid=([0-9]*) zid=([0-9]*) order=([0-9]*) gfp_flags=([A-Z_|]*)'; 11562306a36Sopenharmony_cimy $regex_lru_isolate_default = 'isolate_mode=([0-9]*) classzone_idx=([0-9]*) order=([0-9]*) nr_requested=([0-9]*) nr_scanned=([0-9]*) nr_skipped=([0-9]*) nr_taken=([0-9]*) lru=([a-z_]*)'; 11662306a36Sopenharmony_cimy $regex_lru_shrink_inactive_default = 'nid=([0-9]*) nr_scanned=([0-9]*) nr_reclaimed=([0-9]*) nr_dirty=([0-9]*) nr_writeback=([0-9]*) nr_congested=([0-9]*) nr_immediate=([0-9]*) nr_activate_anon=([0-9]*) nr_activate_file=([0-9]*) nr_ref_keep=([0-9]*) nr_unmap_fail=([0-9]*) priority=([0-9]*) flags=([A-Z_|]*)'; 11762306a36Sopenharmony_cimy $regex_lru_shrink_active_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_rotated=([0-9]*) priority=([0-9]*)'; 11862306a36Sopenharmony_cimy $regex_writepage_default = 'page=([0-9a-f]*) pfn=([0-9]*) flags=([A-Z_|]*)'; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci# Dyanically discovered regex 12162306a36Sopenharmony_cimy $regex_direct_begin; 12262306a36Sopenharmony_cimy $regex_direct_end; 12362306a36Sopenharmony_cimy $regex_kswapd_wake; 12462306a36Sopenharmony_cimy $regex_kswapd_sleep; 12562306a36Sopenharmony_cimy $regex_wakeup_kswapd; 12662306a36Sopenharmony_cimy $regex_lru_isolate; 12762306a36Sopenharmony_cimy $regex_lru_shrink_inactive; 12862306a36Sopenharmony_cimy $regex_lru_shrink_active; 12962306a36Sopenharmony_cimy $regex_writepage; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci# Static regex used. Specified like this for readability and for use with /o 13262306a36Sopenharmony_ci# (process_pid) (cpus ) ( time ) (tpoint ) (details) 13362306a36Sopenharmony_cimy $regex_traceevent = '\s*([a-zA-Z0-9-]*)\s*(\[[0-9]*\])(\s*[dX.][Nnp.][Hhs.][0-9a-fA-F.]*|)\s*([0-9.]*):\s*([a-zA-Z_]*):\s*(.*)'; 13462306a36Sopenharmony_cimy $regex_statname = '[-0-9]*\s\((.*)\).*'; 13562306a36Sopenharmony_cimy $regex_statppid = '[-0-9]*\s\(.*\)\s[A-Za-z]\s([0-9]*).*'; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cisub generate_traceevent_regex { 13862306a36Sopenharmony_ci my $event = shift; 13962306a36Sopenharmony_ci my $default = shift; 14062306a36Sopenharmony_ci my $regex; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci # Read the event format or use the default 14362306a36Sopenharmony_ci if (!open (FORMAT, "/sys/kernel/tracing/events/$event/format")) { 14462306a36Sopenharmony_ci print("WARNING: Event $event format string not found\n"); 14562306a36Sopenharmony_ci return $default; 14662306a36Sopenharmony_ci } else { 14762306a36Sopenharmony_ci my $line; 14862306a36Sopenharmony_ci while (!eof(FORMAT)) { 14962306a36Sopenharmony_ci $line = <FORMAT>; 15062306a36Sopenharmony_ci $line =~ s/, REC->.*//; 15162306a36Sopenharmony_ci if ($line =~ /^print fmt:\s"(.*)".*/) { 15262306a36Sopenharmony_ci $regex = $1; 15362306a36Sopenharmony_ci $regex =~ s/%s/\([0-9a-zA-Z|_]*\)/g; 15462306a36Sopenharmony_ci $regex =~ s/%p/\([0-9a-f]*\)/g; 15562306a36Sopenharmony_ci $regex =~ s/%d/\([-0-9]*\)/g; 15662306a36Sopenharmony_ci $regex =~ s/%ld/\([-0-9]*\)/g; 15762306a36Sopenharmony_ci $regex =~ s/%lu/\([0-9]*\)/g; 15862306a36Sopenharmony_ci } 15962306a36Sopenharmony_ci } 16062306a36Sopenharmony_ci } 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci # Can't handle the print_flags stuff but in the context of this 16362306a36Sopenharmony_ci # script, it really doesn't matter 16462306a36Sopenharmony_ci $regex =~ s/\(REC.*\) \? __print_flags.*//; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci # Verify fields are in the right order 16762306a36Sopenharmony_ci my $tuple; 16862306a36Sopenharmony_ci foreach $tuple (split /\s/, $regex) { 16962306a36Sopenharmony_ci my ($key, $value) = split(/=/, $tuple); 17062306a36Sopenharmony_ci my $expected = shift; 17162306a36Sopenharmony_ci if ($key ne $expected) { 17262306a36Sopenharmony_ci print("WARNING: Format not as expected for event $event '$key' != '$expected'\n"); 17362306a36Sopenharmony_ci $regex =~ s/$key=\((.*)\)/$key=$1/; 17462306a36Sopenharmony_ci } 17562306a36Sopenharmony_ci } 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci if (defined shift) { 17862306a36Sopenharmony_ci die("Fewer fields than expected in format"); 17962306a36Sopenharmony_ci } 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci return $regex; 18262306a36Sopenharmony_ci} 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci$regex_direct_begin = generate_traceevent_regex( 18562306a36Sopenharmony_ci "vmscan/mm_vmscan_direct_reclaim_begin", 18662306a36Sopenharmony_ci $regex_direct_begin_default, 18762306a36Sopenharmony_ci "order", "may_writepage", 18862306a36Sopenharmony_ci "gfp_flags"); 18962306a36Sopenharmony_ci$regex_direct_end = generate_traceevent_regex( 19062306a36Sopenharmony_ci "vmscan/mm_vmscan_direct_reclaim_end", 19162306a36Sopenharmony_ci $regex_direct_end_default, 19262306a36Sopenharmony_ci "nr_reclaimed"); 19362306a36Sopenharmony_ci$regex_kswapd_wake = generate_traceevent_regex( 19462306a36Sopenharmony_ci "vmscan/mm_vmscan_kswapd_wake", 19562306a36Sopenharmony_ci $regex_kswapd_wake_default, 19662306a36Sopenharmony_ci "nid", "order"); 19762306a36Sopenharmony_ci$regex_kswapd_sleep = generate_traceevent_regex( 19862306a36Sopenharmony_ci "vmscan/mm_vmscan_kswapd_sleep", 19962306a36Sopenharmony_ci $regex_kswapd_sleep_default, 20062306a36Sopenharmony_ci "nid"); 20162306a36Sopenharmony_ci$regex_wakeup_kswapd = generate_traceevent_regex( 20262306a36Sopenharmony_ci "vmscan/mm_vmscan_wakeup_kswapd", 20362306a36Sopenharmony_ci $regex_wakeup_kswapd_default, 20462306a36Sopenharmony_ci "nid", "zid", "order", "gfp_flags"); 20562306a36Sopenharmony_ci$regex_lru_isolate = generate_traceevent_regex( 20662306a36Sopenharmony_ci "vmscan/mm_vmscan_lru_isolate", 20762306a36Sopenharmony_ci $regex_lru_isolate_default, 20862306a36Sopenharmony_ci "isolate_mode", "classzone_idx", "order", 20962306a36Sopenharmony_ci "nr_requested", "nr_scanned", "nr_skipped", "nr_taken", 21062306a36Sopenharmony_ci "lru"); 21162306a36Sopenharmony_ci$regex_lru_shrink_inactive = generate_traceevent_regex( 21262306a36Sopenharmony_ci "vmscan/mm_vmscan_lru_shrink_inactive", 21362306a36Sopenharmony_ci $regex_lru_shrink_inactive_default, 21462306a36Sopenharmony_ci "nid", "nr_scanned", "nr_reclaimed", "nr_dirty", "nr_writeback", 21562306a36Sopenharmony_ci "nr_congested", "nr_immediate", "nr_activate_anon", 21662306a36Sopenharmony_ci "nr_activate_file", "nr_ref_keep", 21762306a36Sopenharmony_ci "nr_unmap_fail", "priority", "flags"); 21862306a36Sopenharmony_ci$regex_lru_shrink_active = generate_traceevent_regex( 21962306a36Sopenharmony_ci "vmscan/mm_vmscan_lru_shrink_active", 22062306a36Sopenharmony_ci $regex_lru_shrink_active_default, 22162306a36Sopenharmony_ci "nid", "zid", 22262306a36Sopenharmony_ci "lru", 22362306a36Sopenharmony_ci "nr_scanned", "nr_rotated", "priority"); 22462306a36Sopenharmony_ci$regex_writepage = generate_traceevent_regex( 22562306a36Sopenharmony_ci "vmscan/mm_vmscan_writepage", 22662306a36Sopenharmony_ci $regex_writepage_default, 22762306a36Sopenharmony_ci "page", "pfn", "flags"); 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_cisub read_statline($) { 23062306a36Sopenharmony_ci my $pid = $_[0]; 23162306a36Sopenharmony_ci my $statline; 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci if (open(STAT, "/proc/$pid/stat")) { 23462306a36Sopenharmony_ci $statline = <STAT>; 23562306a36Sopenharmony_ci close(STAT); 23662306a36Sopenharmony_ci } 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci if ($statline eq '') { 23962306a36Sopenharmony_ci $statline = "-1 (UNKNOWN_PROCESS_NAME) R 0"; 24062306a36Sopenharmony_ci } 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci return $statline; 24362306a36Sopenharmony_ci} 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_cisub guess_process_pid($$) { 24662306a36Sopenharmony_ci my $pid = $_[0]; 24762306a36Sopenharmony_ci my $statline = $_[1]; 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci if ($pid == 0) { 25062306a36Sopenharmony_ci return "swapper-0"; 25162306a36Sopenharmony_ci } 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci if ($statline !~ /$regex_statname/o) { 25462306a36Sopenharmony_ci die("Failed to math stat line for process name :: $statline"); 25562306a36Sopenharmony_ci } 25662306a36Sopenharmony_ci return "$1-$pid"; 25762306a36Sopenharmony_ci} 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci# Convert sec.usec timestamp format 26062306a36Sopenharmony_cisub timestamp_to_ms($) { 26162306a36Sopenharmony_ci my $timestamp = $_[0]; 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci my ($sec, $usec) = split (/\./, $timestamp); 26462306a36Sopenharmony_ci return ($sec * 1000) + ($usec / 1000); 26562306a36Sopenharmony_ci} 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cisub process_events { 26862306a36Sopenharmony_ci my $traceevent; 26962306a36Sopenharmony_ci my $process_pid; 27062306a36Sopenharmony_ci my $cpus; 27162306a36Sopenharmony_ci my $timestamp; 27262306a36Sopenharmony_ci my $tracepoint; 27362306a36Sopenharmony_ci my $details; 27462306a36Sopenharmony_ci my $statline; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci # Read each line of the event log 27762306a36Sopenharmony_ciEVENT_PROCESS: 27862306a36Sopenharmony_ci while ($traceevent = <STDIN>) { 27962306a36Sopenharmony_ci if ($traceevent =~ /$regex_traceevent/o) { 28062306a36Sopenharmony_ci $process_pid = $1; 28162306a36Sopenharmony_ci $timestamp = $4; 28262306a36Sopenharmony_ci $tracepoint = $5; 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci $process_pid =~ /(.*)-([0-9]*)$/; 28562306a36Sopenharmony_ci my $process = $1; 28662306a36Sopenharmony_ci my $pid = $2; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci if ($process eq "") { 28962306a36Sopenharmony_ci $process = $last_procmap{$pid}; 29062306a36Sopenharmony_ci $process_pid = "$process-$pid"; 29162306a36Sopenharmony_ci } 29262306a36Sopenharmony_ci $last_procmap{$pid} = $process; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci if ($opt_read_procstat) { 29562306a36Sopenharmony_ci $statline = read_statline($pid); 29662306a36Sopenharmony_ci if ($opt_read_procstat && $process eq '') { 29762306a36Sopenharmony_ci $process_pid = guess_process_pid($pid, $statline); 29862306a36Sopenharmony_ci } 29962306a36Sopenharmony_ci } 30062306a36Sopenharmony_ci } else { 30162306a36Sopenharmony_ci next; 30262306a36Sopenharmony_ci } 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci # Perl Switch() sucks majorly 30562306a36Sopenharmony_ci if ($tracepoint eq "mm_vmscan_direct_reclaim_begin") { 30662306a36Sopenharmony_ci $timestamp = timestamp_to_ms($timestamp); 30762306a36Sopenharmony_ci $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN}++; 30862306a36Sopenharmony_ci $perprocesspid{$process_pid}->{STATE_DIRECT_BEGIN} = $timestamp; 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci $details = $6; 31162306a36Sopenharmony_ci if ($details !~ /$regex_direct_begin/o) { 31262306a36Sopenharmony_ci print "WARNING: Failed to parse mm_vmscan_direct_reclaim_begin as expected\n"; 31362306a36Sopenharmony_ci print " $details\n"; 31462306a36Sopenharmony_ci print " $regex_direct_begin\n"; 31562306a36Sopenharmony_ci next; 31662306a36Sopenharmony_ci } 31762306a36Sopenharmony_ci my $order = $1; 31862306a36Sopenharmony_ci $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER}[$order]++; 31962306a36Sopenharmony_ci $perprocesspid{$process_pid}->{STATE_DIRECT_ORDER} = $order; 32062306a36Sopenharmony_ci } elsif ($tracepoint eq "mm_vmscan_direct_reclaim_end") { 32162306a36Sopenharmony_ci # Count the event itself 32262306a36Sopenharmony_ci my $index = $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_END}; 32362306a36Sopenharmony_ci $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_END}++; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci # Record how long direct reclaim took this time 32662306a36Sopenharmony_ci if (defined $perprocesspid{$process_pid}->{STATE_DIRECT_BEGIN}) { 32762306a36Sopenharmony_ci $timestamp = timestamp_to_ms($timestamp); 32862306a36Sopenharmony_ci my $order = $perprocesspid{$process_pid}->{STATE_DIRECT_ORDER}; 32962306a36Sopenharmony_ci my $latency = ($timestamp - $perprocesspid{$process_pid}->{STATE_DIRECT_BEGIN}); 33062306a36Sopenharmony_ci $perprocesspid{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index] = "$order-$latency"; 33162306a36Sopenharmony_ci } 33262306a36Sopenharmony_ci } elsif ($tracepoint eq "mm_vmscan_kswapd_wake") { 33362306a36Sopenharmony_ci $details = $6; 33462306a36Sopenharmony_ci if ($details !~ /$regex_kswapd_wake/o) { 33562306a36Sopenharmony_ci print "WARNING: Failed to parse mm_vmscan_kswapd_wake as expected\n"; 33662306a36Sopenharmony_ci print " $details\n"; 33762306a36Sopenharmony_ci print " $regex_kswapd_wake\n"; 33862306a36Sopenharmony_ci next; 33962306a36Sopenharmony_ci } 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci my $order = $2; 34262306a36Sopenharmony_ci $perprocesspid{$process_pid}->{STATE_KSWAPD_ORDER} = $order; 34362306a36Sopenharmony_ci if (!$perprocesspid{$process_pid}->{STATE_KSWAPD_BEGIN}) { 34462306a36Sopenharmony_ci $timestamp = timestamp_to_ms($timestamp); 34562306a36Sopenharmony_ci $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE}++; 34662306a36Sopenharmony_ci $perprocesspid{$process_pid}->{STATE_KSWAPD_BEGIN} = $timestamp; 34762306a36Sopenharmony_ci $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE_PERORDER}[$order]++; 34862306a36Sopenharmony_ci } else { 34962306a36Sopenharmony_ci $perprocesspid{$process_pid}->{HIGH_KSWAPD_REWAKEUP}++; 35062306a36Sopenharmony_ci $perprocesspid{$process_pid}->{HIGH_KSWAPD_REWAKEUP_PERORDER}[$order]++; 35162306a36Sopenharmony_ci } 35262306a36Sopenharmony_ci } elsif ($tracepoint eq "mm_vmscan_kswapd_sleep") { 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci # Count the event itself 35562306a36Sopenharmony_ci my $index = $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_SLEEP}; 35662306a36Sopenharmony_ci $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_SLEEP}++; 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci # Record how long kswapd was awake 35962306a36Sopenharmony_ci $timestamp = timestamp_to_ms($timestamp); 36062306a36Sopenharmony_ci my $order = $perprocesspid{$process_pid}->{STATE_KSWAPD_ORDER}; 36162306a36Sopenharmony_ci my $latency = ($timestamp - $perprocesspid{$process_pid}->{STATE_KSWAPD_BEGIN}); 36262306a36Sopenharmony_ci $perprocesspid{$process_pid}->{HIGH_KSWAPD_LATENCY}[$index] = "$order-$latency"; 36362306a36Sopenharmony_ci $perprocesspid{$process_pid}->{STATE_KSWAPD_BEGIN} = 0; 36462306a36Sopenharmony_ci } elsif ($tracepoint eq "mm_vmscan_wakeup_kswapd") { 36562306a36Sopenharmony_ci $perprocesspid{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD}++; 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci $details = $6; 36862306a36Sopenharmony_ci if ($details !~ /$regex_wakeup_kswapd/o) { 36962306a36Sopenharmony_ci print "WARNING: Failed to parse mm_vmscan_wakeup_kswapd as expected\n"; 37062306a36Sopenharmony_ci print " $details\n"; 37162306a36Sopenharmony_ci print " $regex_wakeup_kswapd\n"; 37262306a36Sopenharmony_ci next; 37362306a36Sopenharmony_ci } 37462306a36Sopenharmony_ci my $order = $3; 37562306a36Sopenharmony_ci $perprocesspid{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD_PERORDER}[$order]++; 37662306a36Sopenharmony_ci } elsif ($tracepoint eq "mm_vmscan_lru_isolate") { 37762306a36Sopenharmony_ci $details = $6; 37862306a36Sopenharmony_ci if ($details !~ /$regex_lru_isolate/o) { 37962306a36Sopenharmony_ci print "WARNING: Failed to parse mm_vmscan_lru_isolate as expected\n"; 38062306a36Sopenharmony_ci print " $details\n"; 38162306a36Sopenharmony_ci print " $regex_lru_isolate/o\n"; 38262306a36Sopenharmony_ci next; 38362306a36Sopenharmony_ci } 38462306a36Sopenharmony_ci my $isolate_mode = $1; 38562306a36Sopenharmony_ci my $nr_scanned = $5; 38662306a36Sopenharmony_ci my $file = $8; 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci # To closer match vmstat scanning statistics, only count isolate_both 38962306a36Sopenharmony_ci # and isolate_inactive as scanning. isolate_active is rotation 39062306a36Sopenharmony_ci # isolate_inactive == 1 39162306a36Sopenharmony_ci # isolate_active == 2 39262306a36Sopenharmony_ci # isolate_both == 3 39362306a36Sopenharmony_ci if ($isolate_mode != 2) { 39462306a36Sopenharmony_ci $perprocesspid{$process_pid}->{HIGH_NR_SCANNED} += $nr_scanned; 39562306a36Sopenharmony_ci if ($file =~ /_file/) { 39662306a36Sopenharmony_ci $perprocesspid{$process_pid}->{HIGH_NR_FILE_SCANNED} += $nr_scanned; 39762306a36Sopenharmony_ci } else { 39862306a36Sopenharmony_ci $perprocesspid{$process_pid}->{HIGH_NR_ANON_SCANNED} += $nr_scanned; 39962306a36Sopenharmony_ci } 40062306a36Sopenharmony_ci } 40162306a36Sopenharmony_ci } elsif ($tracepoint eq "mm_vmscan_lru_shrink_inactive") { 40262306a36Sopenharmony_ci $details = $6; 40362306a36Sopenharmony_ci if ($details !~ /$regex_lru_shrink_inactive/o) { 40462306a36Sopenharmony_ci print "WARNING: Failed to parse mm_vmscan_lru_shrink_inactive as expected\n"; 40562306a36Sopenharmony_ci print " $details\n"; 40662306a36Sopenharmony_ci print " $regex_lru_shrink_inactive/o\n"; 40762306a36Sopenharmony_ci next; 40862306a36Sopenharmony_ci } 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci my $nr_reclaimed = $3; 41162306a36Sopenharmony_ci my $flags = $13; 41262306a36Sopenharmony_ci my $file = 0; 41362306a36Sopenharmony_ci if ($flags =~ /RECLAIM_WB_FILE/) { 41462306a36Sopenharmony_ci $file = 1; 41562306a36Sopenharmony_ci } 41662306a36Sopenharmony_ci $perprocesspid{$process_pid}->{HIGH_NR_RECLAIMED} += $nr_reclaimed; 41762306a36Sopenharmony_ci if ($file) { 41862306a36Sopenharmony_ci $perprocesspid{$process_pid}->{HIGH_NR_FILE_RECLAIMED} += $nr_reclaimed; 41962306a36Sopenharmony_ci } else { 42062306a36Sopenharmony_ci $perprocesspid{$process_pid}->{HIGH_NR_ANON_RECLAIMED} += $nr_reclaimed; 42162306a36Sopenharmony_ci } 42262306a36Sopenharmony_ci } elsif ($tracepoint eq "mm_vmscan_writepage") { 42362306a36Sopenharmony_ci $details = $6; 42462306a36Sopenharmony_ci if ($details !~ /$regex_writepage/o) { 42562306a36Sopenharmony_ci print "WARNING: Failed to parse mm_vmscan_writepage as expected\n"; 42662306a36Sopenharmony_ci print " $details\n"; 42762306a36Sopenharmony_ci print " $regex_writepage\n"; 42862306a36Sopenharmony_ci next; 42962306a36Sopenharmony_ci } 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci my $flags = $3; 43262306a36Sopenharmony_ci my $file = 0; 43362306a36Sopenharmony_ci my $sync_io = 0; 43462306a36Sopenharmony_ci if ($flags =~ /RECLAIM_WB_FILE/) { 43562306a36Sopenharmony_ci $file = 1; 43662306a36Sopenharmony_ci } 43762306a36Sopenharmony_ci if ($flags =~ /RECLAIM_WB_SYNC/) { 43862306a36Sopenharmony_ci $sync_io = 1; 43962306a36Sopenharmony_ci } 44062306a36Sopenharmony_ci if ($sync_io) { 44162306a36Sopenharmony_ci if ($file) { 44262306a36Sopenharmony_ci $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC}++; 44362306a36Sopenharmony_ci } else { 44462306a36Sopenharmony_ci $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC}++; 44562306a36Sopenharmony_ci } 44662306a36Sopenharmony_ci } else { 44762306a36Sopenharmony_ci if ($file) { 44862306a36Sopenharmony_ci $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC}++; 44962306a36Sopenharmony_ci } else { 45062306a36Sopenharmony_ci $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC}++; 45162306a36Sopenharmony_ci } 45262306a36Sopenharmony_ci } 45362306a36Sopenharmony_ci } else { 45462306a36Sopenharmony_ci $perprocesspid{$process_pid}->{EVENT_UNKNOWN}++; 45562306a36Sopenharmony_ci } 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci if ($sigint_pending) { 45862306a36Sopenharmony_ci last EVENT_PROCESS; 45962306a36Sopenharmony_ci } 46062306a36Sopenharmony_ci } 46162306a36Sopenharmony_ci} 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_cisub dump_stats { 46462306a36Sopenharmony_ci my $hashref = shift; 46562306a36Sopenharmony_ci my %stats = %$hashref; 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci # Dump per-process stats 46862306a36Sopenharmony_ci my $process_pid; 46962306a36Sopenharmony_ci my $max_strlen = 0; 47062306a36Sopenharmony_ci 47162306a36Sopenharmony_ci # Get the maximum process name 47262306a36Sopenharmony_ci foreach $process_pid (keys %perprocesspid) { 47362306a36Sopenharmony_ci my $len = length($process_pid); 47462306a36Sopenharmony_ci if ($len > $max_strlen) { 47562306a36Sopenharmony_ci $max_strlen = $len; 47662306a36Sopenharmony_ci } 47762306a36Sopenharmony_ci } 47862306a36Sopenharmony_ci $max_strlen += 2; 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci # Work out latencies 48162306a36Sopenharmony_ci printf("\n") if !$opt_ignorepid; 48262306a36Sopenharmony_ci printf("Reclaim latencies expressed as order-latency_in_ms\n") if !$opt_ignorepid; 48362306a36Sopenharmony_ci foreach $process_pid (keys %stats) { 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci if (!$stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[0] && 48662306a36Sopenharmony_ci !$stats{$process_pid}->{HIGH_KSWAPD_LATENCY}[0]) { 48762306a36Sopenharmony_ci next; 48862306a36Sopenharmony_ci } 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci printf "%-" . $max_strlen . "s ", $process_pid if !$opt_ignorepid; 49162306a36Sopenharmony_ci my $index = 0; 49262306a36Sopenharmony_ci while (defined $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index] || 49362306a36Sopenharmony_ci defined $stats{$process_pid}->{HIGH_KSWAPD_LATENCY}[$index]) { 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_ci if ($stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]) { 49662306a36Sopenharmony_ci printf("%s ", $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]) if !$opt_ignorepid; 49762306a36Sopenharmony_ci my ($dummy, $latency) = split(/-/, $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]); 49862306a36Sopenharmony_ci $total_direct_latency += $latency; 49962306a36Sopenharmony_ci } else { 50062306a36Sopenharmony_ci printf("%s ", $stats{$process_pid}->{HIGH_KSWAPD_LATENCY}[$index]) if !$opt_ignorepid; 50162306a36Sopenharmony_ci my ($dummy, $latency) = split(/-/, $stats{$process_pid}->{HIGH_KSWAPD_LATENCY}[$index]); 50262306a36Sopenharmony_ci $total_kswapd_latency += $latency; 50362306a36Sopenharmony_ci } 50462306a36Sopenharmony_ci $index++; 50562306a36Sopenharmony_ci } 50662306a36Sopenharmony_ci print "\n" if !$opt_ignorepid; 50762306a36Sopenharmony_ci } 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_ci # Print out process activity 51062306a36Sopenharmony_ci printf("\n"); 51162306a36Sopenharmony_ci printf("%-" . $max_strlen . "s %8s %10s %8s %8s %8s %8s %8s %8s\n", "Process", "Direct", "Wokeup", "Pages", "Pages", "Pages", "Pages", "Time"); 51262306a36Sopenharmony_ci printf("%-" . $max_strlen . "s %8s %10s %8s %8s %8s %8s %8s %8s\n", "details", "Rclms", "Kswapd", "Scanned", "Rclmed", "Sync-IO", "ASync-IO", "Stalled"); 51362306a36Sopenharmony_ci foreach $process_pid (keys %stats) { 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci if (!$stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN}) { 51662306a36Sopenharmony_ci next; 51762306a36Sopenharmony_ci } 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci $total_direct_reclaim += $stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN}; 52062306a36Sopenharmony_ci $total_wakeup_kswapd += $stats{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD}; 52162306a36Sopenharmony_ci $total_direct_nr_scanned += $stats{$process_pid}->{HIGH_NR_SCANNED}; 52262306a36Sopenharmony_ci $total_direct_nr_file_scanned += $stats{$process_pid}->{HIGH_NR_FILE_SCANNED}; 52362306a36Sopenharmony_ci $total_direct_nr_anon_scanned += $stats{$process_pid}->{HIGH_NR_ANON_SCANNED}; 52462306a36Sopenharmony_ci $total_direct_nr_reclaimed += $stats{$process_pid}->{HIGH_NR_RECLAIMED}; 52562306a36Sopenharmony_ci $total_direct_nr_file_reclaimed += $stats{$process_pid}->{HIGH_NR_FILE_RECLAIMED}; 52662306a36Sopenharmony_ci $total_direct_nr_anon_reclaimed += $stats{$process_pid}->{HIGH_NR_ANON_RECLAIMED}; 52762306a36Sopenharmony_ci $total_direct_writepage_file_sync += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC}; 52862306a36Sopenharmony_ci $total_direct_writepage_anon_sync += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC}; 52962306a36Sopenharmony_ci $total_direct_writepage_file_async += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC}; 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_ci $total_direct_writepage_anon_async += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC}; 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_ci my $index = 0; 53462306a36Sopenharmony_ci my $this_reclaim_delay = 0; 53562306a36Sopenharmony_ci while (defined $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]) { 53662306a36Sopenharmony_ci my ($dummy, $latency) = split(/-/, $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]); 53762306a36Sopenharmony_ci $this_reclaim_delay += $latency; 53862306a36Sopenharmony_ci $index++; 53962306a36Sopenharmony_ci } 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci printf("%-" . $max_strlen . "s %8d %10d %8u %8u %8u %8u %8.3f", 54262306a36Sopenharmony_ci $process_pid, 54362306a36Sopenharmony_ci $stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN}, 54462306a36Sopenharmony_ci $stats{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD}, 54562306a36Sopenharmony_ci $stats{$process_pid}->{HIGH_NR_SCANNED}, 54662306a36Sopenharmony_ci $stats{$process_pid}->{HIGH_NR_FILE_SCANNED}, 54762306a36Sopenharmony_ci $stats{$process_pid}->{HIGH_NR_ANON_SCANNED}, 54862306a36Sopenharmony_ci $stats{$process_pid}->{HIGH_NR_RECLAIMED}, 54962306a36Sopenharmony_ci $stats{$process_pid}->{HIGH_NR_FILE_RECLAIMED}, 55062306a36Sopenharmony_ci $stats{$process_pid}->{HIGH_NR_ANON_RECLAIMED}, 55162306a36Sopenharmony_ci $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC} + $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC}, 55262306a36Sopenharmony_ci $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC} + $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC}, 55362306a36Sopenharmony_ci $this_reclaim_delay / 1000); 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_ci if ($stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN}) { 55662306a36Sopenharmony_ci print " "; 55762306a36Sopenharmony_ci for (my $order = 0; $order < 20; $order++) { 55862306a36Sopenharmony_ci my $count = $stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER}[$order]; 55962306a36Sopenharmony_ci if ($count != 0) { 56062306a36Sopenharmony_ci print "direct-$order=$count "; 56162306a36Sopenharmony_ci } 56262306a36Sopenharmony_ci } 56362306a36Sopenharmony_ci } 56462306a36Sopenharmony_ci if ($stats{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD}) { 56562306a36Sopenharmony_ci print " "; 56662306a36Sopenharmony_ci for (my $order = 0; $order < 20; $order++) { 56762306a36Sopenharmony_ci my $count = $stats{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD_PERORDER}[$order]; 56862306a36Sopenharmony_ci if ($count != 0) { 56962306a36Sopenharmony_ci print "wakeup-$order=$count "; 57062306a36Sopenharmony_ci } 57162306a36Sopenharmony_ci } 57262306a36Sopenharmony_ci } 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ci print "\n"; 57562306a36Sopenharmony_ci } 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_ci # Print out kswapd activity 57862306a36Sopenharmony_ci printf("\n"); 57962306a36Sopenharmony_ci printf("%-" . $max_strlen . "s %8s %10s %8s %8s %8s %8s\n", "Kswapd", "Kswapd", "Order", "Pages", "Pages", "Pages", "Pages"); 58062306a36Sopenharmony_ci printf("%-" . $max_strlen . "s %8s %10s %8s %8s %8s %8s\n", "Instance", "Wakeups", "Re-wakeup", "Scanned", "Rclmed", "Sync-IO", "ASync-IO"); 58162306a36Sopenharmony_ci foreach $process_pid (keys %stats) { 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_ci if (!$stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE}) { 58462306a36Sopenharmony_ci next; 58562306a36Sopenharmony_ci } 58662306a36Sopenharmony_ci 58762306a36Sopenharmony_ci $total_kswapd_wake += $stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE}; 58862306a36Sopenharmony_ci $total_kswapd_nr_scanned += $stats{$process_pid}->{HIGH_NR_SCANNED}; 58962306a36Sopenharmony_ci $total_kswapd_nr_file_scanned += $stats{$process_pid}->{HIGH_NR_FILE_SCANNED}; 59062306a36Sopenharmony_ci $total_kswapd_nr_anon_scanned += $stats{$process_pid}->{HIGH_NR_ANON_SCANNED}; 59162306a36Sopenharmony_ci $total_kswapd_nr_reclaimed += $stats{$process_pid}->{HIGH_NR_RECLAIMED}; 59262306a36Sopenharmony_ci $total_kswapd_nr_file_reclaimed += $stats{$process_pid}->{HIGH_NR_FILE_RECLAIMED}; 59362306a36Sopenharmony_ci $total_kswapd_nr_anon_reclaimed += $stats{$process_pid}->{HIGH_NR_ANON_RECLAIMED}; 59462306a36Sopenharmony_ci $total_kswapd_writepage_file_sync += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC}; 59562306a36Sopenharmony_ci $total_kswapd_writepage_anon_sync += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC}; 59662306a36Sopenharmony_ci $total_kswapd_writepage_file_async += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC}; 59762306a36Sopenharmony_ci $total_kswapd_writepage_anon_async += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC}; 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_ci printf("%-" . $max_strlen . "s %8d %10d %8u %8u %8i %8u", 60062306a36Sopenharmony_ci $process_pid, 60162306a36Sopenharmony_ci $stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE}, 60262306a36Sopenharmony_ci $stats{$process_pid}->{HIGH_KSWAPD_REWAKEUP}, 60362306a36Sopenharmony_ci $stats{$process_pid}->{HIGH_NR_SCANNED}, 60462306a36Sopenharmony_ci $stats{$process_pid}->{HIGH_NR_FILE_SCANNED}, 60562306a36Sopenharmony_ci $stats{$process_pid}->{HIGH_NR_ANON_SCANNED}, 60662306a36Sopenharmony_ci $stats{$process_pid}->{HIGH_NR_RECLAIMED}, 60762306a36Sopenharmony_ci $stats{$process_pid}->{HIGH_NR_FILE_RECLAIMED}, 60862306a36Sopenharmony_ci $stats{$process_pid}->{HIGH_NR_ANON_RECLAIMED}, 60962306a36Sopenharmony_ci $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC} + $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC}, 61062306a36Sopenharmony_ci $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC} + $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC}); 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_ci if ($stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE}) { 61362306a36Sopenharmony_ci print " "; 61462306a36Sopenharmony_ci for (my $order = 0; $order < 20; $order++) { 61562306a36Sopenharmony_ci my $count = $stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE_PERORDER}[$order]; 61662306a36Sopenharmony_ci if ($count != 0) { 61762306a36Sopenharmony_ci print "wake-$order=$count "; 61862306a36Sopenharmony_ci } 61962306a36Sopenharmony_ci } 62062306a36Sopenharmony_ci } 62162306a36Sopenharmony_ci if ($stats{$process_pid}->{HIGH_KSWAPD_REWAKEUP}) { 62262306a36Sopenharmony_ci print " "; 62362306a36Sopenharmony_ci for (my $order = 0; $order < 20; $order++) { 62462306a36Sopenharmony_ci my $count = $stats{$process_pid}->{HIGH_KSWAPD_REWAKEUP_PERORDER}[$order]; 62562306a36Sopenharmony_ci if ($count != 0) { 62662306a36Sopenharmony_ci print "rewake-$order=$count "; 62762306a36Sopenharmony_ci } 62862306a36Sopenharmony_ci } 62962306a36Sopenharmony_ci } 63062306a36Sopenharmony_ci printf("\n"); 63162306a36Sopenharmony_ci } 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_ci # Print out summaries 63462306a36Sopenharmony_ci $total_direct_latency /= 1000; 63562306a36Sopenharmony_ci $total_kswapd_latency /= 1000; 63662306a36Sopenharmony_ci print "\nSummary\n"; 63762306a36Sopenharmony_ci print "Direct reclaims: $total_direct_reclaim\n"; 63862306a36Sopenharmony_ci print "Direct reclaim pages scanned: $total_direct_nr_scanned\n"; 63962306a36Sopenharmony_ci print "Direct reclaim file pages scanned: $total_direct_nr_file_scanned\n"; 64062306a36Sopenharmony_ci print "Direct reclaim anon pages scanned: $total_direct_nr_anon_scanned\n"; 64162306a36Sopenharmony_ci print "Direct reclaim pages reclaimed: $total_direct_nr_reclaimed\n"; 64262306a36Sopenharmony_ci print "Direct reclaim file pages reclaimed: $total_direct_nr_file_reclaimed\n"; 64362306a36Sopenharmony_ci print "Direct reclaim anon pages reclaimed: $total_direct_nr_anon_reclaimed\n"; 64462306a36Sopenharmony_ci print "Direct reclaim write file sync I/O: $total_direct_writepage_file_sync\n"; 64562306a36Sopenharmony_ci print "Direct reclaim write anon sync I/O: $total_direct_writepage_anon_sync\n"; 64662306a36Sopenharmony_ci print "Direct reclaim write file async I/O: $total_direct_writepage_file_async\n"; 64762306a36Sopenharmony_ci print "Direct reclaim write anon async I/O: $total_direct_writepage_anon_async\n"; 64862306a36Sopenharmony_ci print "Wake kswapd requests: $total_wakeup_kswapd\n"; 64962306a36Sopenharmony_ci printf "Time stalled direct reclaim: %-1.2f seconds\n", $total_direct_latency; 65062306a36Sopenharmony_ci print "\n"; 65162306a36Sopenharmony_ci print "Kswapd wakeups: $total_kswapd_wake\n"; 65262306a36Sopenharmony_ci print "Kswapd pages scanned: $total_kswapd_nr_scanned\n"; 65362306a36Sopenharmony_ci print "Kswapd file pages scanned: $total_kswapd_nr_file_scanned\n"; 65462306a36Sopenharmony_ci print "Kswapd anon pages scanned: $total_kswapd_nr_anon_scanned\n"; 65562306a36Sopenharmony_ci print "Kswapd pages reclaimed: $total_kswapd_nr_reclaimed\n"; 65662306a36Sopenharmony_ci print "Kswapd file pages reclaimed: $total_kswapd_nr_file_reclaimed\n"; 65762306a36Sopenharmony_ci print "Kswapd anon pages reclaimed: $total_kswapd_nr_anon_reclaimed\n"; 65862306a36Sopenharmony_ci print "Kswapd reclaim write file sync I/O: $total_kswapd_writepage_file_sync\n"; 65962306a36Sopenharmony_ci print "Kswapd reclaim write anon sync I/O: $total_kswapd_writepage_anon_sync\n"; 66062306a36Sopenharmony_ci print "Kswapd reclaim write file async I/O: $total_kswapd_writepage_file_async\n"; 66162306a36Sopenharmony_ci print "Kswapd reclaim write anon async I/O: $total_kswapd_writepage_anon_async\n"; 66262306a36Sopenharmony_ci printf "Time kswapd awake: %-1.2f seconds\n", $total_kswapd_latency; 66362306a36Sopenharmony_ci} 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_cisub aggregate_perprocesspid() { 66662306a36Sopenharmony_ci my $process_pid; 66762306a36Sopenharmony_ci my $process; 66862306a36Sopenharmony_ci undef %perprocess; 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_ci foreach $process_pid (keys %perprocesspid) { 67162306a36Sopenharmony_ci $process = $process_pid; 67262306a36Sopenharmony_ci $process =~ s/-([0-9])*$//; 67362306a36Sopenharmony_ci if ($process eq '') { 67462306a36Sopenharmony_ci $process = "NO_PROCESS_NAME"; 67562306a36Sopenharmony_ci } 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN} += $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN}; 67862306a36Sopenharmony_ci $perprocess{$process}->{MM_VMSCAN_KSWAPD_WAKE} += $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE}; 67962306a36Sopenharmony_ci $perprocess{$process}->{MM_VMSCAN_WAKEUP_KSWAPD} += $perprocesspid{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD}; 68062306a36Sopenharmony_ci $perprocess{$process}->{HIGH_KSWAPD_REWAKEUP} += $perprocesspid{$process_pid}->{HIGH_KSWAPD_REWAKEUP}; 68162306a36Sopenharmony_ci $perprocess{$process}->{HIGH_NR_SCANNED} += $perprocesspid{$process_pid}->{HIGH_NR_SCANNED}; 68262306a36Sopenharmony_ci $perprocess{$process}->{HIGH_NR_FILE_SCANNED} += $perprocesspid{$process_pid}->{HIGH_NR_FILE_SCANNED}; 68362306a36Sopenharmony_ci $perprocess{$process}->{HIGH_NR_ANON_SCANNED} += $perprocesspid{$process_pid}->{HIGH_NR_ANON_SCANNED}; 68462306a36Sopenharmony_ci $perprocess{$process}->{HIGH_NR_RECLAIMED} += $perprocesspid{$process_pid}->{HIGH_NR_RECLAIMED}; 68562306a36Sopenharmony_ci $perprocess{$process}->{HIGH_NR_FILE_RECLAIMED} += $perprocesspid{$process_pid}->{HIGH_NR_FILE_RECLAIMED}; 68662306a36Sopenharmony_ci $perprocess{$process}->{HIGH_NR_ANON_RECLAIMED} += $perprocesspid{$process_pid}->{HIGH_NR_ANON_RECLAIMED}; 68762306a36Sopenharmony_ci $perprocess{$process}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC} += $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC}; 68862306a36Sopenharmony_ci $perprocess{$process}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC} += $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC}; 68962306a36Sopenharmony_ci $perprocess{$process}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC} += $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC}; 69062306a36Sopenharmony_ci $perprocess{$process}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC} += $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC}; 69162306a36Sopenharmony_ci 69262306a36Sopenharmony_ci for (my $order = 0; $order < 20; $order++) { 69362306a36Sopenharmony_ci $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER}[$order] += $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER}[$order]; 69462306a36Sopenharmony_ci $perprocess{$process}->{MM_VMSCAN_WAKEUP_KSWAPD_PERORDER}[$order] += $perprocesspid{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD_PERORDER}[$order]; 69562306a36Sopenharmony_ci $perprocess{$process}->{MM_VMSCAN_KSWAPD_WAKE_PERORDER}[$order] += $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE_PERORDER}[$order]; 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ci } 69862306a36Sopenharmony_ci 69962306a36Sopenharmony_ci # Aggregate direct reclaim latencies 70062306a36Sopenharmony_ci my $wr_index = $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_END}; 70162306a36Sopenharmony_ci my $rd_index = 0; 70262306a36Sopenharmony_ci while (defined $perprocesspid{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$rd_index]) { 70362306a36Sopenharmony_ci $perprocess{$process}->{HIGH_DIRECT_RECLAIM_LATENCY}[$wr_index] = $perprocesspid{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$rd_index]; 70462306a36Sopenharmony_ci $rd_index++; 70562306a36Sopenharmony_ci $wr_index++; 70662306a36Sopenharmony_ci } 70762306a36Sopenharmony_ci $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_END} = $wr_index; 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_ci # Aggregate kswapd latencies 71062306a36Sopenharmony_ci my $wr_index = $perprocess{$process}->{MM_VMSCAN_KSWAPD_SLEEP}; 71162306a36Sopenharmony_ci my $rd_index = 0; 71262306a36Sopenharmony_ci while (defined $perprocesspid{$process_pid}->{HIGH_KSWAPD_LATENCY}[$rd_index]) { 71362306a36Sopenharmony_ci $perprocess{$process}->{HIGH_KSWAPD_LATENCY}[$wr_index] = $perprocesspid{$process_pid}->{HIGH_KSWAPD_LATENCY}[$rd_index]; 71462306a36Sopenharmony_ci $rd_index++; 71562306a36Sopenharmony_ci $wr_index++; 71662306a36Sopenharmony_ci } 71762306a36Sopenharmony_ci $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_END} = $wr_index; 71862306a36Sopenharmony_ci } 71962306a36Sopenharmony_ci} 72062306a36Sopenharmony_ci 72162306a36Sopenharmony_cisub report() { 72262306a36Sopenharmony_ci if (!$opt_ignorepid) { 72362306a36Sopenharmony_ci dump_stats(\%perprocesspid); 72462306a36Sopenharmony_ci } else { 72562306a36Sopenharmony_ci aggregate_perprocesspid(); 72662306a36Sopenharmony_ci dump_stats(\%perprocess); 72762306a36Sopenharmony_ci } 72862306a36Sopenharmony_ci} 72962306a36Sopenharmony_ci 73062306a36Sopenharmony_ci# Process events or signals until neither is available 73162306a36Sopenharmony_cisub signal_loop() { 73262306a36Sopenharmony_ci my $sigint_processed; 73362306a36Sopenharmony_ci do { 73462306a36Sopenharmony_ci $sigint_processed = 0; 73562306a36Sopenharmony_ci process_events(); 73662306a36Sopenharmony_ci 73762306a36Sopenharmony_ci # Handle pending signals if any 73862306a36Sopenharmony_ci if ($sigint_pending) { 73962306a36Sopenharmony_ci my $current_time = time; 74062306a36Sopenharmony_ci 74162306a36Sopenharmony_ci if ($sigint_exit) { 74262306a36Sopenharmony_ci print "Received exit signal\n"; 74362306a36Sopenharmony_ci $sigint_pending = 0; 74462306a36Sopenharmony_ci } 74562306a36Sopenharmony_ci if ($sigint_report) { 74662306a36Sopenharmony_ci if ($current_time >= $sigint_received + 2) { 74762306a36Sopenharmony_ci report(); 74862306a36Sopenharmony_ci $sigint_report = 0; 74962306a36Sopenharmony_ci $sigint_pending = 0; 75062306a36Sopenharmony_ci $sigint_processed = 1; 75162306a36Sopenharmony_ci } 75262306a36Sopenharmony_ci } 75362306a36Sopenharmony_ci } 75462306a36Sopenharmony_ci } while ($sigint_pending || $sigint_processed); 75562306a36Sopenharmony_ci} 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_cisignal_loop(); 75862306a36Sopenharmony_cireport(); 759