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