Back to home page

OSCL-LXR

 
 

    


0001 ================
0002 Delay accounting
0003 ================
0004 
0005 Tasks encounter delays in execution when they wait
0006 for some kernel resource to become available e.g. a
0007 runnable task may wait for a free CPU to run on.
0008 
0009 The per-task delay accounting functionality measures
0010 the delays experienced by a task while
0011 
0012 a) waiting for a CPU (while being runnable)
0013 b) completion of synchronous block I/O initiated by the task
0014 c) swapping in pages
0015 d) memory reclaim
0016 e) thrashing page cache
0017 f) direct compact
0018 g) write-protect copy
0019 
0020 and makes these statistics available to userspace through
0021 the taskstats interface.
0022 
0023 Such delays provide feedback for setting a task's cpu priority,
0024 io priority and rss limit values appropriately. Long delays for
0025 important tasks could be a trigger for raising its corresponding priority.
0026 
0027 The functionality, through its use of the taskstats interface, also provides
0028 delay statistics aggregated for all tasks (or threads) belonging to a
0029 thread group (corresponding to a traditional Unix process). This is a commonly
0030 needed aggregation that is more efficiently done by the kernel.
0031 
0032 Userspace utilities, particularly resource management applications, can also
0033 aggregate delay statistics into arbitrary groups. To enable this, delay
0034 statistics of a task are available both during its lifetime as well as on its
0035 exit, ensuring continuous and complete monitoring can be done.
0036 
0037 
0038 Interface
0039 ---------
0040 
0041 Delay accounting uses the taskstats interface which is described
0042 in detail in a separate document in this directory. Taskstats returns a
0043 generic data structure to userspace corresponding to per-pid and per-tgid
0044 statistics. The delay accounting functionality populates specific fields of
0045 this structure. See
0046 
0047      include/uapi/linux/taskstats.h
0048 
0049 for a description of the fields pertaining to delay accounting.
0050 It will generally be in the form of counters returning the cumulative
0051 delay seen for cpu, sync block I/O, swapin, memory reclaim, thrash page
0052 cache, direct compact, write-protect copy etc.
0053 
0054 Taking the difference of two successive readings of a given
0055 counter (say cpu_delay_total) for a task will give the delay
0056 experienced by the task waiting for the corresponding resource
0057 in that interval.
0058 
0059 When a task exits, records containing the per-task statistics
0060 are sent to userspace without requiring a command. If it is the last exiting
0061 task of a thread group, the per-tgid statistics are also sent. More details
0062 are given in the taskstats interface description.
0063 
0064 The getdelays.c userspace utility in tools/accounting directory allows simple
0065 commands to be run and the corresponding delay statistics to be displayed. It
0066 also serves as an example of using the taskstats interface.
0067 
0068 Usage
0069 -----
0070 
0071 Compile the kernel with::
0072 
0073         CONFIG_TASK_DELAY_ACCT=y
0074         CONFIG_TASKSTATS=y
0075 
0076 Delay accounting is disabled by default at boot up.
0077 To enable, add::
0078 
0079    delayacct
0080 
0081 to the kernel boot options. The rest of the instructions below assume this has
0082 been done. Alternatively, use sysctl kernel.task_delayacct to switch the state
0083 at runtime. Note however that only tasks started after enabling it will have
0084 delayacct information.
0085 
0086 After the system has booted up, use a utility
0087 similar to  getdelays.c to access the delays
0088 seen by a given task or a task group (tgid).
0089 The utility also allows a given command to be
0090 executed and the corresponding delays to be
0091 seen.
0092 
0093 General format of the getdelays command::
0094 
0095         getdelays [-dilv] [-t tgid] [-p pid]
0096 
0097 Get delays, since system boot, for pid 10::
0098 
0099         # ./getdelays -d -p 10
0100         (output similar to next case)
0101 
0102 Get sum of delays, since system boot, for all pids with tgid 5::
0103 
0104         # ./getdelays -d -t 5
0105         print delayacct stats ON
0106         TGID    5
0107 
0108 
0109         CPU             count     real total  virtual total    delay total  delay average
0110                             8        7000000        6872122        3382277          0.423ms
0111         IO              count    delay total  delay average
0112                             0              0              0ms
0113         SWAP            count    delay total  delay average
0114                             0              0              0ms
0115         RECLAIM         count    delay total  delay average
0116                             0              0              0ms
0117         THRASHING       count    delay total  delay average
0118                             0              0              0ms
0119         COMPACT         count    delay total  delay average
0120                             0              0              0ms
0121         WPCOPY          count    delay total  delay average
0122                             0              0              0ms
0123 
0124 Get IO accounting for pid 1, it works only with -p::
0125 
0126         # ./getdelays -i -p 1
0127         printing IO accounting
0128         linuxrc: read=65536, write=0, cancelled_write=0
0129 
0130 The above command can be used with -v to get more debug information.