1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#!/usr/bin/perl -w 2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# (c) 2010, Tom Zanussi <tzanussi@gmail.com> 3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Licensed under the terms of the GNU GPL License version 2 4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# read/write top 6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# 7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Periodically displays system-wide r/w call activity, broken down by 8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# pid. If an [interval] arg is specified, the display will be 9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# refreshed every [interval] seconds. The default interval is 3 10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# seconds. 11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chenguse 5.010000; 13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chenguse strict; 14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chenguse warnings; 15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chenguse lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib"; 17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chenguse lib "./Perf-Trace-Util/lib"; 18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chenguse Perf::Trace::Core; 19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chenguse Perf::Trace::Util; 20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengmy $default_interval = 3; 22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengmy $nlines = 20; 23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengmy $print_thread; 24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengmy $print_pending = 0; 25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengmy %reads; 27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengmy %writes; 28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengmy $interval = shift; 30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengif (!$interval) { 31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $interval = $default_interval; 32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub syscalls::sys_exit_read 35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $common_pid, $common_comm, 38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $nr, $ret) = @_; 39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print_check(); 41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if ($ret > 0) { 43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $reads{$common_pid}{bytes_read} += $ret; 44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } else { 45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!defined ($reads{$common_pid}{bytes_read})) { 46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $reads{$common_pid}{bytes_read} = 0; 47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $reads{$common_pid}{errors}{$ret}++; 49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub syscalls::sys_enter_read 53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $common_pid, $common_comm, 56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $nr, $fd, $buf, $count) = @_; 57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print_check(); 59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $reads{$common_pid}{bytes_requested} += $count; 61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $reads{$common_pid}{total_reads}++; 62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $reads{$common_pid}{comm} = $common_comm; 63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub syscalls::sys_exit_write 66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $common_pid, $common_comm, 69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $nr, $ret) = @_; 70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print_check(); 72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if ($ret <= 0) { 74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $writes{$common_pid}{errors}{$ret}++; 75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 76e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 77e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 78e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub syscalls::sys_enter_write 79e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 80e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 81e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $common_pid, $common_comm, 82e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $nr, $fd, $buf, $count) = @_; 83e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 84e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print_check(); 85e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 86e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $writes{$common_pid}{bytes_written} += $count; 87e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $writes{$common_pid}{total_writes}++; 88e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $writes{$common_pid}{comm} = $common_comm; 89e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 90e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 91e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub trace_begin 92e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 93e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $SIG{ALRM} = \&set_print_pending; 94e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng alarm 1; 95e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 96e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 97e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub trace_end 98e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 99e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print_unhandled(); 100e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print_totals(); 101e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 102e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 103e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub print_check() 104e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 105e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if ($print_pending == 1) { 106e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $print_pending = 0; 107e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print_totals(); 108e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 109e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 110e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 111e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub set_print_pending() 112e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 113e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $print_pending = 1; 114e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng alarm $interval; 115e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 116e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 117e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub print_totals 118e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 119e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $count; 120e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 121e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $count = 0; 122e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 123e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng clear_term(); 124e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 125e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("\nread counts by pid:\n\n"); 126e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 127e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %20s %10s %10s %10s\n", "pid", "comm", 128e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng "# reads", "bytes_req", "bytes_read"); 129e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %-20s %10s %10s %10s\n", "------", "--------------------", 130e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng "----------", "----------", "----------"); 131e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 132e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng foreach my $pid (sort { ($reads{$b}{bytes_read} || 0) <=> 133e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ($reads{$a}{bytes_read} || 0) } keys %reads) { 134e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $comm = $reads{$pid}{comm} || ""; 135e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $total_reads = $reads{$pid}{total_reads} || 0; 136e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $bytes_requested = $reads{$pid}{bytes_requested} || 0; 137e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $bytes_read = $reads{$pid}{bytes_read} || 0; 138e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 139e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %-20s %10s %10s %10s\n", $pid, $comm, 140e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $total_reads, $bytes_requested, $bytes_read); 141e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 142e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (++$count == $nlines) { 143e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng last; 144e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 145e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 146e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 147e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $count = 0; 148e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 149e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("\nwrite counts by pid:\n\n"); 150e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 151e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %20s %10s %13s\n", "pid", "comm", 152e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng "# writes", "bytes_written"); 153e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %-20s %10s %13s\n", "------", "--------------------", 154e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng "----------", "-------------"); 155e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 156e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng foreach my $pid (sort { ($writes{$b}{bytes_written} || 0) <=> 157e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ($writes{$a}{bytes_written} || 0)} keys %writes) { 158e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $comm = $writes{$pid}{comm} || ""; 159e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $total_writes = $writes{$pid}{total_writes} || 0; 160e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $bytes_written = $writes{$pid}{bytes_written} || 0; 161e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 162e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %-20s %10s %13s\n", $pid, $comm, 163e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $total_writes, $bytes_written); 164e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 165e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (++$count == $nlines) { 166e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng last; 167e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 168e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 169e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 170e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng %reads = (); 171e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng %writes = (); 172e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 173e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 174e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengmy %unhandled; 175e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 176e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub print_unhandled 177e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 178e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if ((scalar keys %unhandled) == 0) { 179e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return; 180e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 181e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 182e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print "\nunhandled events:\n\n"; 183e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 184e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%-40s %10s\n", "event", "count"); 185e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%-40s %10s\n", "----------------------------------------", 186e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng "-----------"); 187e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 188e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng foreach my $event_name (keys %unhandled) { 189e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%-40s %10d\n", $event_name, $unhandled{$event_name}); 190e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 191e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 192e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 193e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub trace_unhandled 194e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 195e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 196e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $common_pid, $common_comm) = @_; 197e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 198e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $unhandled{$event_name}++; 199e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 200