[PATCH] Add debugging feature /proc/timer_stat
Add /proc/timer_stats support: debugging feature to profile timer expiration.
Both the starting site, process/PID and the expiration function is captured.
This allows the quick identification of timer event sources in a system.
Sample output:
# echo 1 > /proc/timer_stats
# cat /proc/timer_stats
Timer Stats Version: v0.1
Sample period: 4.010 s
24, 0 swapper hrtimer_stop_sched_tick (hrtimer_sched_tick)
11, 0 swapper sk_reset_timer (tcp_delack_timer)
6, 0 swapper hrtimer_stop_sched_tick (hrtimer_sched_tick)
2, 1 swapper queue_delayed_work_on (delayed_work_timer_fn)
17, 0 swapper hrtimer_restart_sched_tick (hrtimer_sched_tick)
2, 1 swapper queue_delayed_work_on (delayed_work_timer_fn)
4, 2050 pcscd do_nanosleep (hrtimer_wakeup)
5, 4179 sshd sk_reset_timer (tcp_write_timer)
4, 2248 yum-updatesd schedule_timeout (process_timeout)
18, 0 swapper hrtimer_restart_sched_tick (hrtimer_sched_tick)
3, 0 swapper sk_reset_timer (tcp_delack_timer)
1, 1 swapper neigh_table_init_no_netlink (neigh_periodic_timer)
2, 1 swapper e1000_up (e1000_watchdog)
1, 1 init schedule_timeout (process_timeout)
100 total events, 25.24 events/sec
[ cleanups and hrtimers support from Thomas Gleixner <tglx@linutronix.de> ]
[bunk@stusta.de: nr_entries can become static]
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: john stultz <johnstul@us.ibm.com>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Adrian Bunk <bunk@stusta.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-02-16 17:28:13 +08:00
|
|
|
timer_stats - timer usage statistics
|
|
|
|
------------------------------------
|
|
|
|
|
|
|
|
timer_stats is a debugging facility to make the timer (ab)usage in a Linux
|
2007-06-01 15:47:16 +08:00
|
|
|
system visible to kernel and userspace developers. If enabled in the config
|
|
|
|
but not used it has almost zero runtime overhead, and a relatively small
|
|
|
|
data structure overhead. Even if collection is enabled runtime all the
|
|
|
|
locking is per-CPU and lookup is hashed.
|
[PATCH] Add debugging feature /proc/timer_stat
Add /proc/timer_stats support: debugging feature to profile timer expiration.
Both the starting site, process/PID and the expiration function is captured.
This allows the quick identification of timer event sources in a system.
Sample output:
# echo 1 > /proc/timer_stats
# cat /proc/timer_stats
Timer Stats Version: v0.1
Sample period: 4.010 s
24, 0 swapper hrtimer_stop_sched_tick (hrtimer_sched_tick)
11, 0 swapper sk_reset_timer (tcp_delack_timer)
6, 0 swapper hrtimer_stop_sched_tick (hrtimer_sched_tick)
2, 1 swapper queue_delayed_work_on (delayed_work_timer_fn)
17, 0 swapper hrtimer_restart_sched_tick (hrtimer_sched_tick)
2, 1 swapper queue_delayed_work_on (delayed_work_timer_fn)
4, 2050 pcscd do_nanosleep (hrtimer_wakeup)
5, 4179 sshd sk_reset_timer (tcp_write_timer)
4, 2248 yum-updatesd schedule_timeout (process_timeout)
18, 0 swapper hrtimer_restart_sched_tick (hrtimer_sched_tick)
3, 0 swapper sk_reset_timer (tcp_delack_timer)
1, 1 swapper neigh_table_init_no_netlink (neigh_periodic_timer)
2, 1 swapper e1000_up (e1000_watchdog)
1, 1 init schedule_timeout (process_timeout)
100 total events, 25.24 events/sec
[ cleanups and hrtimers support from Thomas Gleixner <tglx@linutronix.de> ]
[bunk@stusta.de: nr_entries can become static]
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: john stultz <johnstul@us.ibm.com>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Adrian Bunk <bunk@stusta.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-02-16 17:28:13 +08:00
|
|
|
|
|
|
|
timer_stats should be used by kernel and userspace developers to verify that
|
|
|
|
their code does not make unduly use of timers. This helps to avoid unnecessary
|
|
|
|
wakeups, which should be avoided to optimize power consumption.
|
|
|
|
|
|
|
|
It can be enabled by CONFIG_TIMER_STATS in the "Kernel hacking" configuration
|
|
|
|
section.
|
|
|
|
|
|
|
|
timer_stats collects information about the timer events which are fired in a
|
|
|
|
Linux system over a sample period:
|
|
|
|
|
|
|
|
- the pid of the task(process) which initialized the timer
|
|
|
|
- the name of the process which initialized the timer
|
|
|
|
- the function where the timer was intialized
|
|
|
|
- the callback function which is associated to the timer
|
|
|
|
- the number of events (callbacks)
|
|
|
|
|
|
|
|
timer_stats adds an entry to /proc: /proc/timer_stats
|
|
|
|
|
|
|
|
This entry is used to control the statistics functionality and to read out the
|
|
|
|
sampled information.
|
|
|
|
|
|
|
|
The timer_stats functionality is inactive on bootup.
|
|
|
|
|
|
|
|
To activate a sample period issue:
|
|
|
|
# echo 1 >/proc/timer_stats
|
|
|
|
|
|
|
|
To stop a sample period issue:
|
|
|
|
# echo 0 >/proc/timer_stats
|
|
|
|
|
|
|
|
The statistics can be retrieved by:
|
|
|
|
# cat /proc/timer_stats
|
|
|
|
|
|
|
|
The readout of /proc/timer_stats automatically disables sampling. The sampled
|
|
|
|
information is kept until a new sample period is started. This allows multiple
|
|
|
|
readouts.
|
|
|
|
|
|
|
|
Sample output of /proc/timer_stats:
|
|
|
|
|
|
|
|
Timerstats sample period: 3.888770 s
|
|
|
|
12, 0 swapper hrtimer_stop_sched_tick (hrtimer_sched_tick)
|
|
|
|
15, 1 swapper hcd_submit_urb (rh_timer_func)
|
|
|
|
4, 959 kedac schedule_timeout (process_timeout)
|
|
|
|
1, 0 swapper page_writeback_init (wb_timer_fn)
|
|
|
|
28, 0 swapper hrtimer_stop_sched_tick (hrtimer_sched_tick)
|
|
|
|
22, 2948 IRQ 4 tty_flip_buffer_push (delayed_work_timer_fn)
|
|
|
|
3, 3100 bash schedule_timeout (process_timeout)
|
|
|
|
1, 1 swapper queue_delayed_work_on (delayed_work_timer_fn)
|
|
|
|
1, 1 swapper queue_delayed_work_on (delayed_work_timer_fn)
|
|
|
|
1, 1 swapper neigh_table_init_no_netlink (neigh_periodic_timer)
|
|
|
|
1, 2292 ip __netdev_watchdog_up (dev_watchdog)
|
|
|
|
1, 23 events/1 do_cache_clean (delayed_work_timer_fn)
|
|
|
|
90 total events, 30.0 events/sec
|
|
|
|
|
|
|
|
The first column is the number of events, the second column the pid, the third
|
|
|
|
column is the name of the process. The forth column shows the function which
|
|
|
|
initialized the timer and in parantheses the callback function which was
|
|
|
|
executed on expiry.
|
|
|
|
|
|
|
|
Thomas, Ingo
|
|
|
|
|