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
72
73
74
75
76
77
78
79
80
81
|
#! /usr/bin/env stap
global devices, reads, writes
/* data collection: SCSI disk */
%(kernel_v<"2.6.24" %?
probe module("sd_mod").function("sd_init_command") !, kernel.function("sd_init_command") {
device=kernel_string($SCpnt->request->rq_disk->disk_name)
sector_size=$SCpnt->device->sector_size
nr_sectors=$SCpnt->request->nr_sectors
devices[device] = 1
%(kernel_v>="2.6.19" %?
if ($SCpnt->request->cmd_flags & 1)
%:
if ($SCpnt->request->flags & 1)
%)
writes[device] <<< nr_sectors * sector_size
else
reads[device] <<< nr_sectors * sector_size
}
%:
%{
#include <scsi/scsi_device.h>
%}
function get_sector_size:long (data:long) %{ /* pure */
struct scsi_device *sdp = (struct scsi_device *)((long)THIS->data);
THIS->__retvalue = kread(&(sdp->sector_size));
CATCH_DEREF_FAULT();
%}
probe module("sd_mod").function("sd_prep_fn") !, kernel.function("sd_prep_fn") {
device=kernel_string($rq->rq_disk->disk_name)
sector_size=get_sector_size($q->queuedata)
nr_sectors=$rq->nr_sectors
devices[device] = 1
if ($rq->cmd_flags & 1)
writes[device] <<< nr_sectors * sector_size
else
reads[device] <<< nr_sectors * sector_size
}
%)
/* data collection: SCSI tape */
probe module("st").function("st_do_scsi") !, kernel.function("st_do_scsi") {
device=kernel_string($STp->disk->disk_name)
devices[device] = 1
if ($direction)
writes[device] <<< $bytes
else
reads[device] <<< $bytes
}
/* reporting */
global blksize=512
global hdrcount
probe timer.s($1) {
if ((hdrcount++ % 10) == 0)
printf("%9s %9s %9s %9s %9s %9s\n",
"Device:","tps","blk_read/s","blk_wrtn/s","blk_read","blk_wrtn")
foreach (dev in devices) {
rdcount=@count(reads[dev])
wrcount=@count(writes[dev])
tps=(rdcount+wrcount)*100/$1
rdblkcount=rdcount ? @sum(reads[dev])/blksize : 0
wrblkcount=wrcount ? @sum(writes[dev])/blksize : 0
rdblkrate=rdblkcount*100/$1
wrblkrate=wrblkcount*100/$1
printf("%9s %6d.%02d %6d.%02d %6d.%02d %9d %9d\n",
dev, tps/100,tps%100,
rdblkrate/100,rdblkrate%100,
wrblkrate/100,wrblkrate%100,
rdblkcount, wrblkcount)
}
printf ("\n")
delete devices
delete reads
delete writes
}
|