summaryrefslogtreecommitdiffstats
path: root/examples/small_demos/rwtiming.stp
blob: d570c581039399e95cb3f6bf44b64c5d08cfad2f (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
72
73
74
#! /usr/bin/env stap
# rwtiming.stp
#
# This is a simple example to track the amount of time
# spent doing reads and writes for the various programs running on the
# system.

probe begin { log("starting probe") }

global names, opens, reads, writes
global entry_opens, entry_reads, entry_writes
global time_opens, time_reads, time_writes

probe kernel.function("sys_open") {
  t=gettimeofday_us(); p=pid(); e=execname();
  names[e]=1
  opens[e] ++ # plain integer
  entry_opens[p] = t;
}

probe kernel.function("sys_open").return {
  t=gettimeofday_us(); p=pid(); e=execname();
  time_opens[e] <<< t - entry_opens[p];
}

probe kernel.function("sys_read") {
  t= gettimeofday_us(); p =pid(); e=execname();
  names[e]=1
  reads[e] <<< $count # statistics
  entry_reads[p] = t;
}

probe kernel.function("sys_read").return {
  t=gettimeofday_us(); p=pid(); e=execname();
  time_reads[e] <<< t - entry_reads[p];
}

probe kernel.function("sys_write") {
  t=gettimeofday_us(); p=pid(); e=execname();
  names[e]=1
  writes[e] <<< $count # statistics
  entry_writes[p] = t;
}

probe kernel.function("sys_write").return {
  t = gettimeofday_us(); p = pid(); e=execname();
  time_writes[e] <<< t - entry_writes[p];
}

probe end {
  foreach(name+ in names) { # sort by names
    printf ("process: %s\n", name)
    if (opens[name]) {
      printf ("opens n=%d\n", opens[name])
      print (@hist_log(time_opens[name]))
    }
    if (@count(reads[name])) {
      printf ("reads n=%d, sum=%d, avg=%d\n",
         @count(reads[name]), # extracting stat results
         @sum(reads[name]),
         @avg(reads[name]))
      print ("read timing distribution\n")
      print (@hist_log(time_reads[name]))
    }
    if (@count(writes[name])) {
      printf ("writes n=%d, sum=%d, avg=%d\n",
         @count(writes[name]), # extracting stat results
         @sum(writes[name]),
         @avg(writes[name]))
      print ("write timing distribution\n")
      print (@hist_log(time_writes[name]))
    }
  }
}