1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#!/usr/bin/perl -w 2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# (c) 2009, Tom Zanussi <tzanussi@gmail.com> 3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Licensed under the terms of the GNU GPL License version 2 4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Display r/w activity for all processes 6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# The common_* event handler fields are the most useful fields common to 8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# all events. They don't necessarily correspond to the 'common_*' fields 9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# in the status files. Those fields not available as handler params can 10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# be retrieved via script functions of the form get_common_*(). 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 %reads; 22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengmy %writes; 23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub syscalls::sys_exit_read 25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $common_pid, $common_comm, 28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $nr, $ret) = @_; 29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if ($ret > 0) { 31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $reads{$common_pid}{bytes_read} += $ret; 32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } else { 33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!defined ($reads{$common_pid}{bytes_read})) { 34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $reads{$common_pid}{bytes_read} = 0; 35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $reads{$common_pid}{errors}{$ret}++; 37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub syscalls::sys_enter_read 41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $common_pid, $common_comm, 44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $nr, $fd, $buf, $count) = @_; 45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $reads{$common_pid}{bytes_requested} += $count; 47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $reads{$common_pid}{total_reads}++; 48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $reads{$common_pid}{comm} = $common_comm; 49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub syscalls::sys_exit_write 52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $common_pid, $common_comm, 55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $nr, $ret) = @_; 56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if ($ret <= 0) { 58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $writes{$common_pid}{errors}{$ret}++; 59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub syscalls::sys_enter_write 63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $common_pid, $common_comm, 66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $nr, $fd, $buf, $count) = @_; 67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $writes{$common_pid}{bytes_written} += $count; 69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $writes{$common_pid}{total_writes}++; 70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $writes{$common_pid}{comm} = $common_comm; 71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub trace_end 74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("read counts by pid:\n\n"); 76e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 77e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %20s %10s %10s %10s\n", "pid", "comm", 78e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng "# reads", "bytes_requested", "bytes_read"); 79e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %-20s %10s %10s %10s\n", "------", "--------------------", 80e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng "-----------", "----------", "----------"); 81e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 82e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng foreach my $pid (sort { ($reads{$b}{bytes_read} || 0) <=> 83e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ($reads{$a}{bytes_read} || 0) } keys %reads) { 84e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $comm = $reads{$pid}{comm} || ""; 85e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $total_reads = $reads{$pid}{total_reads} || 0; 86e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $bytes_requested = $reads{$pid}{bytes_requested} || 0; 87e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $bytes_read = $reads{$pid}{bytes_read} || 0; 88e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 89e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %-20s %10s %10s %10s\n", $pid, $comm, 90e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $total_reads, $bytes_requested, $bytes_read); 91e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 92e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 93e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("\nfailed reads by pid:\n\n"); 94e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 95e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %20s %6s %10s\n", "pid", "comm", "error #", "# errors"); 96e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %20s %6s %10s\n", "------", "--------------------", 97e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng "------", "----------"); 98e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 99e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my @errcounts = (); 100e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 101e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng foreach my $pid (keys %reads) { 102e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng foreach my $error (keys %{$reads{$pid}{errors}}) { 103e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $comm = $reads{$pid}{comm} || ""; 104e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $errcount = $reads{$pid}{errors}{$error} || 0; 105e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng push @errcounts, [$pid, $comm, $error, $errcount]; 106e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 107e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 108e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 109e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng @errcounts = sort { $b->[3] <=> $a->[3] } @errcounts; 110e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 111e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for my $i (0 .. $#errcounts) { 112e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6d %-20s %6d %10s\n", $errcounts[$i][0], 113e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $errcounts[$i][1], $errcounts[$i][2], $errcounts[$i][3]); 114e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 115e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 116e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("\nwrite counts by pid:\n\n"); 117e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 118e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %20s %10s %10s\n", "pid", "comm", 119e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng "# writes", "bytes_written"); 120e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %-20s %10s %10s\n", "------", "--------------------", 121e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng "-----------", "----------"); 122e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 123e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng foreach my $pid (sort { ($writes{$b}{bytes_written} || 0) <=> 124e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ($writes{$a}{bytes_written} || 0)} keys %writes) { 125e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $comm = $writes{$pid}{comm} || ""; 126e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $total_writes = $writes{$pid}{total_writes} || 0; 127e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $bytes_written = $writes{$pid}{bytes_written} || 0; 128e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 129e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %-20s %10s %10s\n", $pid, $comm, 130e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $total_writes, $bytes_written); 131e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 132e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 133e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("\nfailed writes by pid:\n\n"); 134e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 135e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %20s %6s %10s\n", "pid", "comm", "error #", "# errors"); 136e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6s %20s %6s %10s\n", "------", "--------------------", 137e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng "------", "----------"); 138e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 139e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng @errcounts = (); 140e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 141e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng foreach my $pid (keys %writes) { 142e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng foreach my $error (keys %{$writes{$pid}{errors}}) { 143e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $comm = $writes{$pid}{comm} || ""; 144e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my $errcount = $writes{$pid}{errors}{$error} || 0; 145e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng push @errcounts, [$pid, $comm, $error, $errcount]; 146e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 147e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 148e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 149e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng @errcounts = sort { $b->[3] <=> $a->[3] } @errcounts; 150e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 151e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for my $i (0 .. $#errcounts) { 152e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%6d %-20s %6d %10s\n", $errcounts[$i][0], 153e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $errcounts[$i][1], $errcounts[$i][2], $errcounts[$i][3]); 154e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 155e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 156e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print_unhandled(); 157e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 158e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 159e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengmy %unhandled; 160e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 161e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub print_unhandled 162e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 163e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if ((scalar keys %unhandled) == 0) { 164e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return; 165e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 166e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 167e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print "\nunhandled events:\n\n"; 168e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 169e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%-40s %10s\n", "event", "count"); 170e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%-40s %10s\n", "----------------------------------------", 171e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng "-----------"); 172e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 173e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng foreach my $event_name (keys %unhandled) { 174e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng printf("%-40s %10d\n", $event_name, $unhandled{$event_name}); 175e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 176e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 177e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 178e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsub trace_unhandled 179e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 180e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 181e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $common_pid, $common_comm) = @_; 182e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 183e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng $unhandled{$event_name}++; 184e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 185