3 outfile
="$(dirname $0)/winbindd.stp"
5 child_funcs
="winbindd_dual_init_connection
11 _wbint_PamAuthChangePassword
12 _wbint_PamAuthCrapChangePassword
13 _wbint_ListTrustedDomains
22 _wbint_LookupUserAliases
23 _wbint_LookupUserGroups
24 _wbint_QuerySequenceNumber
25 _wbint_LookupGroupMembers
27 _wbint_QueryUserRidList
30 _wbint_CheckMachineAccount
31 _wbint_ChangeMachineAccount
43 winbindd_getsidaliases
44 winbindd_getuserdomgroups
46 winbindd_show_sequence
61 winbindd_check_machine_acct
65 winbindd_pam_chauthtok
66 winbindd_pam_chng_pswd_auth_crap
71 winbindd_change_machine_acct
72 winbindd_pam_auth_crap"
74 backend_funcs
="query_user_list
88 header
='#!/usr/bin/stap
90 # Systemtap script to instrument winbindd
92 '"# Generated by examples/systemtap/$(basename $0) on $(date), do not edit
96 # Instrument all winbindd processes:
99 # Instrument a specific winbindd process:
100 # # stap -x PID winbindd.stp
103 global dc_running, dc_svctime
104 global backend_running, backend_svctime
105 global send_running, recv_running
106 global start_time, idle_time
107 global async_svctime, async_runtime
110 printf("Collecting data, press ctrl-C to stop... ")
113 domchild_req_template
='
115 # winbind domain child function XXX
118 probe process("winbindd").function("XXX") {
119 dc_running[tid(), "XXX"] = gettimeofday_us()
122 probe process("winbindd").function("XXX").return {
123 if (!([tid(), "XXX"] in dc_running))
126 end = gettimeofday_us()
127 begin = dc_running[tid(), "XXX"]
128 delete dc_running[tid(), "XXX"]
130 duration = end - begin
131 dc_svctime["XXX"] <<< duration
134 backend_req_template
='
136 # winbind domain child backend function XXX
139 probe process("winbindd").function("XXX@../source3/winbindd/winbindd_ads.c") {
140 backend_running[tid(), "XXX"] = gettimeofday_us()
143 probe process("winbindd").function("XXX@../source3/winbindd/winbindd_ads.c").return {
144 if (!([tid(), "XXX"] in backend_running))
147 end = gettimeofday_us()
148 begin = backend_running[tid(), "XXX"]
149 delete backend_running[tid(), "XXX"]
151 duration = end - begin
152 backend_svctime["XXX"] <<< duration
157 # winbind async function XXX
160 probe process("winbindd").function("XXX_send") {
161 send_running["XXX_send"] = gettimeofday_us()
164 probe process("winbindd").function("XXX_send").return {
165 if (!(["XXX_send"] in send_running))
168 end = gettimeofday_us()
169 start = send_running["XXX_send"]
170 delete send_running["XXX_send"]
172 start_time["XXX_send", $return] = start
173 idle_time["XXX_send", $return] = end
176 probe process("winbindd").function("XXX_recv") {
177 if (!(["XXX_send", $req] in start_time))
180 recv_running["XXX_recv"] = gettimeofday_us()
183 probe process("winbindd").function("XXX_recv").return {
184 if (!(["XXX_recv"] in recv_running))
187 recv_end = gettimeofday_us()
188 recv_start = recv_running["XXX_recv"]
189 delete recv_running["XXX_recv"]
190 recv_runtime = recv_end - recv_start
194 send_begin = start_time["XXX_send", req]
195 delete start_time["XXX_send", req]
196 svctime = recv_end - send_begin
198 idle = idle_time["XXX_send", req]
199 delete idle_time["XXX_send", req]
200 runtime = (idle - send_begin) + recv_runtime
202 async_svctime["XXX_send"] <<< svctime
203 async_runtime["XXX_send"] <<< runtime
210 printf("Winbind request service time\n")
211 printf("============================\n")
212 foreach ([name] in async_svctime) {
213 printf("%-40s count: %5d, sum: %6d ms (min: %6d us, avg: %6d us, max: %6d us)\n",
215 @count(async_svctime[name]),
216 @sum(async_svctime[name]) / 1000,
217 @min(async_svctime[name]),
218 @avg(async_svctime[name]),
219 @max(async_svctime[name]))
223 printf("Winbind request runtime\n")
224 printf("=======================\n")
225 foreach ([name] in async_runtime) {
226 printf("%-40s count: %5d, sum: %6d ms (min: %6d us, avg: %6d us, max: %6d us)\n",
228 @count(async_runtime[name]),
229 @sum(async_runtime[name]) / 1000,
230 @min(async_runtime[name]),
231 @avg(async_runtime[name]),
232 @max(async_runtime[name]))
236 printf("Winbind domain-child request service time\n")
237 printf("=========================================\n")
238 foreach ([name] in dc_svctime) {
239 printf("%-40s count: %5d, sum: %6d ms (min: %6d us, avg: %6d us, max: %6d us)\n",
241 @count(dc_svctime[name]),
242 @sum(dc_svctime[name]) / 1000,
243 @min(dc_svctime[name]),
244 @avg(dc_svctime[name]),
245 @max(dc_svctime[name]))
249 printf("Winbind domain-child AD-backend service time\n")
250 printf("============================================\n")
251 foreach ([name] in backend_svctime) {
252 printf("%-40s count: %5d, sum: %6d ms (min: %6d us, avg: %6d us, max: %6d us)\n",
254 @count(backend_svctime[name]),
255 @sum(backend_svctime[name]) / 1000,
256 @min(backend_svctime[name]),
257 @avg(backend_svctime[name]),
258 @max(backend_svctime[name]))
262 printf("Winbind request service time distributions (us)\n")
263 printf("===============================================\n")
264 foreach ([name] in async_svctime) {
265 printf("%s:\n", name);
266 println(@hist_log(async_svctime[name]))
270 printf("Winbind request runtime distributions (us)\n")
271 printf("==========================================\n")
272 foreach ([name] in async_runtime) {
273 printf("%s:\n", name);
274 println(@hist_log(async_runtime[name]))
277 printf("Winbind domain-child request service time distributions (us)\n")
278 printf("============================================================\n")
279 foreach ([name] in dc_svctime) {
280 printf("%s:\n", name);
281 println(@hist_log(dc_svctime[name]))
284 printf("Winbind domain-child AD-backend service time distributions (us)\n")
285 printf("===============================================================\n")
286 foreach ([name] in backend_svctime) {
287 printf("%s:\n", name);
288 println(@hist_log(backend_svctime[name]))
296 printf "$child_funcs\n" |
while read func
; do
297 printf "$domchild_req_template\n" |
sed -e s
/XXX
/$func/g
>>$outfile
300 printf "$backend_funcs\n" |
while read func
; do
301 printf "$backend_req_template\n" |
sed -e "s|XXX|$func|g" >>$outfile
304 printf "$async_funcs\n" |
while read func
; do
305 printf "$async_req_template\n" |
sed -e s
/XXX
/$func/g
>>$outfile