Ingo Molnar | 82f67cd | 2007-02-16 01:28:13 -0800 | [diff] [blame] | 1 | timer_stats - timer usage statistics |
| 2 | ------------------------------------ |
| 3 | |
| 4 | timer_stats is a debugging facility to make the timer (ab)usage in a Linux |
Ingo Molnar | c1a834d | 2007-06-01 00:47:16 -0700 | [diff] [blame] | 5 | system visible to kernel and userspace developers. If enabled in the config |
| 6 | but not used it has almost zero runtime overhead, and a relatively small |
| 7 | data structure overhead. Even if collection is enabled runtime all the |
| 8 | locking is per-CPU and lookup is hashed. |
Ingo Molnar | 82f67cd | 2007-02-16 01:28:13 -0800 | [diff] [blame] | 9 | |
| 10 | timer_stats should be used by kernel and userspace developers to verify that |
| 11 | their code does not make unduly use of timers. This helps to avoid unnecessary |
| 12 | wakeups, which should be avoided to optimize power consumption. |
| 13 | |
| 14 | It can be enabled by CONFIG_TIMER_STATS in the "Kernel hacking" configuration |
| 15 | section. |
| 16 | |
| 17 | timer_stats collects information about the timer events which are fired in a |
| 18 | Linux system over a sample period: |
| 19 | |
| 20 | - the pid of the task(process) which initialized the timer |
| 21 | - the name of the process which initialized the timer |
Uwe Kleine-König | b595076 | 2010-11-01 15:38:34 -0400 | [diff] [blame] | 22 | - the function where the timer was initialized |
Ingo Molnar | 82f67cd | 2007-02-16 01:28:13 -0800 | [diff] [blame] | 23 | - the callback function which is associated to the timer |
| 24 | - the number of events (callbacks) |
| 25 | |
| 26 | timer_stats adds an entry to /proc: /proc/timer_stats |
| 27 | |
| 28 | This entry is used to control the statistics functionality and to read out the |
| 29 | sampled information. |
| 30 | |
| 31 | The timer_stats functionality is inactive on bootup. |
| 32 | |
| 33 | To activate a sample period issue: |
| 34 | # echo 1 >/proc/timer_stats |
| 35 | |
| 36 | To stop a sample period issue: |
| 37 | # echo 0 >/proc/timer_stats |
| 38 | |
| 39 | The statistics can be retrieved by: |
| 40 | # cat /proc/timer_stats |
| 41 | |
Michael Kerrisk | 2779ac1 | 2014-05-02 12:13:10 +0200 | [diff] [blame] | 42 | While sampling is enabled, each readout from /proc/timer_stats will see |
| 43 | newly updated statistics. Once sampling is disabled, the sampled information |
| 44 | is kept until a new sample period is started. This allows multiple readouts. |
Ingo Molnar | 82f67cd | 2007-02-16 01:28:13 -0800 | [diff] [blame] | 45 | |
| 46 | Sample output of /proc/timer_stats: |
| 47 | |
| 48 | Timerstats sample period: 3.888770 s |
| 49 | 12, 0 swapper hrtimer_stop_sched_tick (hrtimer_sched_tick) |
| 50 | 15, 1 swapper hcd_submit_urb (rh_timer_func) |
| 51 | 4, 959 kedac schedule_timeout (process_timeout) |
| 52 | 1, 0 swapper page_writeback_init (wb_timer_fn) |
| 53 | 28, 0 swapper hrtimer_stop_sched_tick (hrtimer_sched_tick) |
| 54 | 22, 2948 IRQ 4 tty_flip_buffer_push (delayed_work_timer_fn) |
| 55 | 3, 3100 bash schedule_timeout (process_timeout) |
| 56 | 1, 1 swapper queue_delayed_work_on (delayed_work_timer_fn) |
| 57 | 1, 1 swapper queue_delayed_work_on (delayed_work_timer_fn) |
| 58 | 1, 1 swapper neigh_table_init_no_netlink (neigh_periodic_timer) |
| 59 | 1, 2292 ip __netdev_watchdog_up (dev_watchdog) |
| 60 | 1, 23 events/1 do_cache_clean (delayed_work_timer_fn) |
| 61 | 90 total events, 30.0 events/sec |
| 62 | |
| 63 | The first column is the number of events, the second column the pid, the third |
| 64 | column is the name of the process. The forth column shows the function which |
Matt LaPlante | 19f5946 | 2009-04-27 15:06:31 +0200 | [diff] [blame] | 65 | initialized the timer and in parenthesis the callback function which was |
Ingo Molnar | 82f67cd | 2007-02-16 01:28:13 -0800 | [diff] [blame] | 66 | executed on expiry. |
| 67 | |
| 68 | Thomas, Ingo |
| 69 | |
Venki Pallipadi | c5c061b8 | 2007-07-15 23:40:30 -0700 | [diff] [blame] | 70 | Added flag to indicate 'deferrable timer' in /proc/timer_stats. A deferrable |
| 71 | timer will appear as follows |
| 72 | 10D, 1 swapper queue_delayed_work_on (delayed_work_timer_fn) |
| 73 | |