summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.examples/io/disktop.stp
blob: 238195bfb7c098c33fad32d3294e3fd3f76946c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/env stap 
#
# Copyright (C) 2007 Oracle Corp.
#
# Get the status of reading/writing disk every 5 seconds,
# output top ten entries 
#
# This is free software,GNU General Public License (GPL);
# either version 2, or (at your option) any later version.
#
# Usage:
#  ./disktop.stp
#

global io_stat,device
global read_bytes,write_bytes

probe vfs.read.return {
	if ($return>0) {
		if (devname!="N/A") {/*skip read from cache*/
			io_stat[pid(),execname(),uid(),ppid(),"R"] += $return
			device[pid(),execname(),uid(),ppid(),"R"] = devname
			read_bytes += $return
		}
	}
}

probe vfs.write.return {
	if ($return>0) {
		if (devname!="N/A") { /*skip update cache*/
			io_stat[pid(),execname(),uid(),ppid(),"W"] += $return
			device[pid(),execname(),uid(),ppid(),"W"] = devname
			write_bytes += $return
		}
	}
}

probe timer.ms(5000) {
	/* skip non-read/write disk */
	if (read_bytes+write_bytes) {

		printf("\n%-25s, %-8s%4dKb/sec, %-7s%6dKb, %-7s%6dKb\n\n",
			ctime(gettimeofday_s()),
			"Average:", ((read_bytes+write_bytes)/1024)/5,
			"Read:",read_bytes/1024,
			"Write:",write_bytes/1024)

		/* print header */
		printf("%8s %8s %8s %25s %8s %4s %12s\n",
			"UID","PID","PPID","CMD","DEVICE","T","BYTES")
	}
	/* print top ten I/O */
	foreach ([process,cmd,userid,parent,action] in io_stat- limit 10)
	  printf("%8d %8d %8d %25s %8s %4s %12d\n",
		userid,process,parent,cmd,
		device[process,cmd,userid,parent,action],
		action,io_stat[process,cmd,userid,parent,action])

	/* clear data */
	delete io_stat
	delete device
	read_bytes = 0
	write_bytes = 0	
}

probe end{
	delete io_stat
	delete device
	delete read_bytes
	delete write_bytes	
}