| 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 | 
|  | 22 | - the function where the timer was intialized | 
|  | 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 |  | 
|  | 42 | The readout of /proc/timer_stats automatically disables sampling. The sampled | 
|  | 43 | information is kept until a new sample period is started. This allows multiple | 
|  | 44 | readouts. | 
|  | 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 | 
|  | 65 | initialized the timer and in parantheses the callback function which was | 
|  | 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 |  |