examples: add gencache.stp
[sfrench/samba-autobuild/.git] / examples / systemtap / gencache.stp
1 #!/usr/bin/stap
2 #
3 # Systemtap script to instrument the Samba gencache subsystem
4 #
5 # Usage:
6 #
7 # Instrument all smbd processes:
8 # # stap gencache.stp smbd
9 #
10 # Instrument all winbindd processes:
11 # # stap gencache.stp winbindd
12 #
13 # Instrument a specific smbd process:
14 # # stap -x PID gencache.stp smbd
15 #
16 # Instrument a specific winbindd process:
17 # # stap -x PID gencache.stp winbindd
18 #
19
20 global running, intervals
21
22 probe begin {
23         printf("Collecting data, press ctrl-C to stop... ")
24 }
25
26 probe process(@1).library("*").function("gencache_parse") {
27         running["gencache_parse", tid()] = gettimeofday_us()
28 }
29
30 probe process(@1).library("*").function("gencache_parse").return {
31         if (!(["gencache_parse", tid()] in running))
32                 next
33
34         end = gettimeofday_us()
35         begin = running["gencache_parse", tid()]
36         delete running["gencache_parse", tid()]
37
38         duration = end - begin
39         intervals["gencache_parse"] <<< duration
40 }
41
42 probe process(@1).library("*").function("gencache_get_data_blob") {
43         running["gencache_get_data_blob", tid()] = gettimeofday_us()
44 }
45
46 probe process(@1).library("*").function("gencache_get_data_blob").return {
47         if (!(["gencache_get_data_blob", tid()] in running))
48                 next
49
50         end = gettimeofday_us()
51         begin = running["gencache_get_data_blob", tid()]
52         delete running["gencache_get_data_blob", tid()]
53
54         duration = end - begin
55         intervals["gencache_get_data_blob"] <<< duration
56 }
57
58 probe process(@1).library("*").function("gencache_set_data_blob") {
59         running["gencache_set_data_blob", tid()] = gettimeofday_us()
60 }
61
62 probe process(@1).library("*").function("gencache_set_data_blob").return {
63         if (!(["gencache_set_data_blob", tid()] in running))
64                 next
65
66         end = gettimeofday_us()
67         begin = running["gencache_set_data_blob", tid()]
68         delete running["gencache_set_data_blob", tid()]
69
70         duration = end - begin
71         intervals["gencache_set_data_blob"] <<< duration
72 }
73
74 probe process(@1).library("*").function("gencache_del") {
75         running["gencache_del", tid()] = gettimeofday_us()
76 }
77
78 probe process(@1).library("*").function("gencache_del").return {
79         if (!(["gencache_del", tid()] in running))
80                 next
81
82         end = gettimeofday_us()
83         begin = running["gencache_del", tid()]
84         delete running["gencache_del", tid()]
85
86         duration = end - begin
87         intervals["gencache_del"] <<< duration
88 }
89
90 probe process(@1).library("*").function("gencache_stabilize") {
91         running["gencache_stabilize", tid()] = gettimeofday_us()
92 }
93
94 probe process(@1).library("*").function("gencache_stabilize").return {
95         if (!(["gencache_stabilize", tid()] in running))
96                 next
97
98         end = gettimeofday_us()
99         begin = running["gencache_stabilize", tid()]
100         delete running["gencache_stabilize", tid()]
101
102         duration = end - begin
103         intervals["gencache_stabilize"] <<< duration
104 }
105
106 probe end {
107         printf("\n\n")
108
109         foreach ([name] in intervals) {
110                 printf("%-30s count: %d sum: %d us (min: %d us avg: %d us max: %d us)\n",
111                        name,
112                        @count(intervals[name]),
113                        @sum(intervals[name]),
114                        @min(intervals[name]),
115                        @avg(intervals[name]),
116                        @max(intervals[name]))
117         }
118
119         printf("\n")
120         foreach ([name] in intervals) {
121                 printf("%s time distribution histogram:\n", name)
122                 println(@hist_log(intervals[name]))
123         }
124 }