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