#!/usr/bin/stap --all-modules # Copyright (C) 2011 Red Hat, Inc. # Written by William Cohen # # A little script to give an idea what periodic things are running on # the system global last_expire, period, funct, data probe kernel.trace("timer_expire_entry") { old_expire = last_expire[$timer] new_expire = gettimeofday_us() if (old_expire) { elapsed = new_expire - old_expire period[$timer] <<< elapsed funct[$timer] = $timer->function data[$timer] = $timer->data } last_expire[$timer] = new_expire } function output() { printf("#%-16s %-35s %12s %10s\n", "type", "function", "period(us)", "count") # print out the various timers firing foreach([timer] in period-) { fname = symname(funct[timer]) if (fname == "process_timeout") { fname = sprintf("%s(%d)", kernel_string_n(@cast(data[timer], "struct task_struct")->comm, 16), @cast(data[timer], "struct task_struct")->pid) type="process" } else if (fname == "delayed_work_timer_fn") { fname = sprintf("%s", symname(@cast(data[timer], "struct delayed_work")->work->func)) type="work_queue" } else { fname = sprintf("%s:%s", modname(funct[timer]), fname) type="kernel" } printf("%-16s %-35s %12d %10d\n", type, fname, @avg(period[timer]), @count(period[timer])) } } probe begin { printf("#monitoring timer periods\n") } probe end { output() } # allow optional period output from script %( $# > 0 %? probe timer.s($1) { output(); delete last_expire delete period delete funct delete data } %)