summaryrefslogtreecommitdiff
path: root/examples/systemtap/gencache.stp
blob: 225f0aefd710ca359eada76f48054e80ddc32856 (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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/usr/bin/stap
#
# Systemtap script to instrument the Samba gencache subsystem
#
# Usage:
#
# Instrument all smbd processes:
# # stap gencache.stp smbd
#
# Instrument all winbindd processes:
# # stap gencache.stp winbindd
#
# Instrument a specific smbd process:
# # stap -x PID gencache.stp smbd
#
# Instrument a specific winbindd process:
# # stap -x PID gencache.stp winbindd
#

global running, intervals

probe begin {
	printf("Collecting data, press ctrl-C to stop... ")
}

probe process(@1).library("*").function("gencache_parse") {
	running["gencache_parse", tid()] = gettimeofday_us()
}

probe process(@1).library("*").function("gencache_parse").return {
	if (!(["gencache_parse", tid()] in running))
		next

	end = gettimeofday_us()
	begin = running["gencache_parse", tid()]
	delete running["gencache_parse", tid()]

	duration = end - begin
	intervals["gencache_parse"] <<< duration
}

probe process(@1).library("*").function("gencache_get_data_blob") {
	running["gencache_get_data_blob", tid()] = gettimeofday_us()
}

probe process(@1).library("*").function("gencache_get_data_blob").return {
	if (!(["gencache_get_data_blob", tid()] in running))
		next

	end = gettimeofday_us()
	begin = running["gencache_get_data_blob", tid()]
	delete running["gencache_get_data_blob", tid()]

	duration = end - begin
	intervals["gencache_get_data_blob"] <<< duration
}

probe process(@1).library("*").function("gencache_set_data_blob") {
	running["gencache_set_data_blob", tid()] = gettimeofday_us()
}

probe process(@1).library("*").function("gencache_set_data_blob").return {
	if (!(["gencache_set_data_blob", tid()] in running))
		next

	end = gettimeofday_us()
	begin = running["gencache_set_data_blob", tid()]
	delete running["gencache_set_data_blob", tid()]

	duration = end - begin
	intervals["gencache_set_data_blob"] <<< duration
}

probe process(@1).library("*").function("gencache_del") {
	running["gencache_del", tid()] = gettimeofday_us()
}

probe process(@1).library("*").function("gencache_del").return {
	if (!(["gencache_del", tid()] in running))
		next

	end = gettimeofday_us()
	begin = running["gencache_del", tid()]
	delete running["gencache_del", tid()]

	duration = end - begin
	intervals["gencache_del"] <<< duration
}

probe process(@1).library("*").function("gencache_stabilize") {
	running["gencache_stabilize", tid()] = gettimeofday_us()
}

probe process(@1).library("*").function("gencache_stabilize").return {
	if (!(["gencache_stabilize", tid()] in running))
		next

	end = gettimeofday_us()
	begin = running["gencache_stabilize", tid()]
	delete running["gencache_stabilize", tid()]

	duration = end - begin
	intervals["gencache_stabilize"] <<< duration
}

probe end {
	printf("\n\n")

	foreach ([name] in intervals) {
		printf("%-30s count: %d sum: %d us (min: %d us avg: %d us max: %d us)\n",
		       name,
		       @count(intervals[name]),
		       @sum(intervals[name]),
		       @min(intervals[name]),
		       @avg(intervals[name]),
		       @max(intervals[name]))
	}

	printf("\n")
	foreach ([name] in intervals) {
		printf("%s time distribution histogram:\n", name)
		println(@hist_log(intervals[name]))
	}
}