1 ================ 1 ================ 2 Event Histograms 2 Event Histograms 3 ================ 3 ================ 4 4 5 Documentation written by Tom Zanussi 5 Documentation written by Tom Zanussi 6 6 7 1. Introduction 7 1. Introduction 8 =============== 8 =============== 9 9 10 Histogram triggers are special event trigger 10 Histogram triggers are special event triggers that can be used to 11 aggregate trace event data into histograms. 11 aggregate trace event data into histograms. For information on 12 trace events and event triggers, see Documen 12 trace events and event triggers, see Documentation/trace/events.rst. 13 13 14 14 15 2. Histogram Trigger Command 15 2. Histogram Trigger Command 16 ============================ 16 ============================ 17 17 18 A histogram trigger command is an event trig 18 A histogram trigger command is an event trigger command that 19 aggregates event hits into a hash table keye 19 aggregates event hits into a hash table keyed on one or more trace 20 event format fields (or stacktrace) and a se 20 event format fields (or stacktrace) and a set of running totals 21 derived from one or more trace event format 21 derived from one or more trace event format fields and/or event 22 counts (hitcount). 22 counts (hitcount). 23 23 24 The format of a hist trigger is as follows:: 24 The format of a hist trigger is as follows:: 25 25 26 hist:keys=<field1[,field2,...]>[:value 26 hist:keys=<field1[,field2,...]>[:values=<field1[,field2,...]>] 27 [:sort=<field1[,field2,...]>][:size= 27 [:sort=<field1[,field2,...]>][:size=#entries][:pause][:continue] 28 [:clear][:name=histname1][:nohitcoun 28 [:clear][:name=histname1][:nohitcount][:<handler>.<action>] [if <filter>] 29 29 30 When a matching event is hit, an entry is ad 30 When a matching event is hit, an entry is added to a hash table 31 using the key(s) and value(s) named. Keys a 31 using the key(s) and value(s) named. Keys and values correspond to 32 fields in the event's format description. V 32 fields in the event's format description. Values must correspond to 33 numeric fields - on an event hit, the value( 33 numeric fields - on an event hit, the value(s) will be added to a 34 sum kept for that field. The special string 34 sum kept for that field. The special string 'hitcount' can be used 35 in place of an explicit value field - this i 35 in place of an explicit value field - this is simply a count of 36 event hits. If 'values' isn't specified, an 36 event hits. If 'values' isn't specified, an implicit 'hitcount' 37 value will be automatically created and used 37 value will be automatically created and used as the only value. 38 Keys can be any field, or the special string !! 38 Keys can be any field, or the special string 'stacktrace', which 39 will use the event's kernel stacktrace as th 39 will use the event's kernel stacktrace as the key. The keywords 40 'keys' or 'key' can be used to specify keys, 40 'keys' or 'key' can be used to specify keys, and the keywords 41 'values', 'vals', or 'val' can be used to sp 41 'values', 'vals', or 'val' can be used to specify values. Compound 42 keys consisting of up to three fields can be 42 keys consisting of up to three fields can be specified by the 'keys' 43 keyword. Hashing a compound key produces a 43 keyword. Hashing a compound key produces a unique entry in the 44 table for each unique combination of compone 44 table for each unique combination of component keys, and can be 45 useful for providing more fine-grained summa 45 useful for providing more fine-grained summaries of event data. 46 Additionally, sort keys consisting of up to 46 Additionally, sort keys consisting of up to two fields can be 47 specified by the 'sort' keyword. If more th 47 specified by the 'sort' keyword. If more than one field is 48 specified, the result will be a 'sort within 48 specified, the result will be a 'sort within a sort': the first key 49 is taken to be the primary sort key and the 49 is taken to be the primary sort key and the second the secondary 50 key. If a hist trigger is given a name usin 50 key. If a hist trigger is given a name using the 'name' parameter, 51 its histogram data will be shared with other 51 its histogram data will be shared with other triggers of the same 52 name, and trigger hits will update this comm 52 name, and trigger hits will update this common data. Only triggers 53 with 'compatible' fields can be combined in 53 with 'compatible' fields can be combined in this way; triggers are 54 'compatible' if the fields named in the trig 54 'compatible' if the fields named in the trigger share the same 55 number and type of fields and those fields a 55 number and type of fields and those fields also have the same names. 56 Note that any two events always share the co 56 Note that any two events always share the compatible 'hitcount' and 57 'common_stacktrace' fields and can therefore !! 57 'stacktrace' fields and can therefore be combined using those 58 fields, however pointless that may be. 58 fields, however pointless that may be. 59 59 60 'hist' triggers add a 'hist' file to each ev 60 'hist' triggers add a 'hist' file to each event's subdirectory. 61 Reading the 'hist' file for the event will d 61 Reading the 'hist' file for the event will dump the hash table in 62 its entirety to stdout. If there are multip 62 its entirety to stdout. If there are multiple hist triggers 63 attached to an event, there will be a table 63 attached to an event, there will be a table for each trigger in the 64 output. The table displayed for a named tri 64 output. The table displayed for a named trigger will be the same as 65 any other instance having the same name. Eac 65 any other instance having the same name. Each printed hash table 66 entry is a simple list of the keys and value 66 entry is a simple list of the keys and values comprising the entry; 67 keys are printed first and are delineated by 67 keys are printed first and are delineated by curly braces, and are 68 followed by the set of value fields for the 68 followed by the set of value fields for the entry. By default, 69 numeric fields are displayed as base-10 inte 69 numeric fields are displayed as base-10 integers. This can be 70 modified by appending any of the following m 70 modified by appending any of the following modifiers to the field 71 name: 71 name: 72 72 73 ============= ======================= 73 ============= ================================================= 74 .hex display a number as a h 74 .hex display a number as a hex value 75 .sym display an address as a 75 .sym display an address as a symbol 76 .sym-offset display an address as a 76 .sym-offset display an address as a symbol and offset 77 .syscall display a syscall id as 77 .syscall display a syscall id as a system call name 78 .execname display a common_pid as 78 .execname display a common_pid as a program name 79 .log2 display log2 value rath 79 .log2 display log2 value rather than raw number 80 .buckets=size display grouping of val 80 .buckets=size display grouping of values rather than raw number 81 .usecs display a common_timest 81 .usecs display a common_timestamp in microseconds 82 .percent display a number of per 82 .percent display a number of percentage value 83 .graph display a bar-graph of 83 .graph display a bar-graph of a value 84 .stacktrace display as a stacktrace << 85 ============= ======================= 84 ============= ================================================= 86 85 87 Note that in general the semantics of a give 86 Note that in general the semantics of a given field aren't 88 interpreted when applying a modifier to it, 87 interpreted when applying a modifier to it, but there are some 89 restrictions to be aware of in this regard: 88 restrictions to be aware of in this regard: 90 89 91 - only the 'hex' modifier can be used for 90 - only the 'hex' modifier can be used for values (because values 92 are essentially sums, and the other modi 91 are essentially sums, and the other modifiers don't make sense 93 in that context). 92 in that context). 94 - the 'execname' modifier can only be used 93 - the 'execname' modifier can only be used on a 'common_pid'. The 95 reason for this is that the execname is 94 reason for this is that the execname is simply the 'comm' value 96 saved for the 'current' process when an 95 saved for the 'current' process when an event was triggered, 97 which is the same as the common_pid valu 96 which is the same as the common_pid value saved by the event 98 tracing code. Trying to apply that comm 97 tracing code. Trying to apply that comm value to other pid 99 values wouldn't be correct, and typicall 98 values wouldn't be correct, and typically events that care save 100 pid-specific comm fields in the event it 99 pid-specific comm fields in the event itself. 101 100 102 A typical usage scenario would be the follow 101 A typical usage scenario would be the following to enable a hist 103 trigger, read its current contents, and then 102 trigger, read its current contents, and then turn it off:: 104 103 105 # echo 'hist:keys=skbaddr.hex:vals=len' > 104 # echo 'hist:keys=skbaddr.hex:vals=len' > \ 106 /sys/kernel/tracing/events/net/netif_rx/ !! 105 /sys/kernel/debug/tracing/events/net/netif_rx/trigger 107 106 108 # cat /sys/kernel/tracing/events/net/netif !! 107 # cat /sys/kernel/debug/tracing/events/net/netif_rx/hist 109 108 110 # echo '!hist:keys=skbaddr.hex:vals=len' > 109 # echo '!hist:keys=skbaddr.hex:vals=len' > \ 111 /sys/kernel/tracing/events/net/netif_rx/ !! 110 /sys/kernel/debug/tracing/events/net/netif_rx/trigger 112 111 113 The trigger file itself can be read to show 112 The trigger file itself can be read to show the details of the 114 currently attached hist trigger. This infor 113 currently attached hist trigger. This information is also displayed 115 at the top of the 'hist' file when read. 114 at the top of the 'hist' file when read. 116 115 117 By default, the size of the hash table is 20 116 By default, the size of the hash table is 2048 entries. The 'size' 118 parameter can be used to specify more or few 117 parameter can be used to specify more or fewer than that. The units 119 are in terms of hashtable entries - if a run 118 are in terms of hashtable entries - if a run uses more entries than 120 specified, the results will show the number 119 specified, the results will show the number of 'drops', the number 121 of hits that were ignored. The size should 120 of hits that were ignored. The size should be a power of 2 between 122 128 and 131072 (any non- power-of-2 number s 121 128 and 131072 (any non- power-of-2 number specified will be rounded 123 up). 122 up). 124 123 125 The 'sort' parameter can be used to specify 124 The 'sort' parameter can be used to specify a value field to sort 126 on. The default if unspecified is 'hitcount 125 on. The default if unspecified is 'hitcount' and the default sort 127 order is 'ascending'. To sort in the opposi 126 order is 'ascending'. To sort in the opposite direction, append 128 .descending' to the sort key. 127 .descending' to the sort key. 129 128 130 The 'pause' parameter can be used to pause a 129 The 'pause' parameter can be used to pause an existing hist trigger 131 or to start a hist trigger but not log any e 130 or to start a hist trigger but not log any events until told to do 132 so. 'continue' or 'cont' can be used to sta 131 so. 'continue' or 'cont' can be used to start or restart a paused 133 hist trigger. 132 hist trigger. 134 133 135 The 'clear' parameter will clear the content 134 The 'clear' parameter will clear the contents of a running hist 136 trigger and leave its current paused/active 135 trigger and leave its current paused/active state. 137 136 138 Note that the 'pause', 'cont', and 'clear' p 137 Note that the 'pause', 'cont', and 'clear' parameters should be 139 applied using 'append' shell operator ('>>') 138 applied using 'append' shell operator ('>>') if applied to an 140 existing trigger, rather than via the '>' op 139 existing trigger, rather than via the '>' operator, which will cause 141 the trigger to be removed through truncation 140 the trigger to be removed through truncation. 142 141 143 The 'nohitcount' (or NOHC) parameter will su 142 The 'nohitcount' (or NOHC) parameter will suppress display of 144 raw hitcount in the histogram. This option r 143 raw hitcount in the histogram. This option requires at least one 145 value field which is not a 'raw hitcount'. F 144 value field which is not a 'raw hitcount'. For example, 146 'hist:...:vals=hitcount:nohitcount' is rejec 145 'hist:...:vals=hitcount:nohitcount' is rejected, but 147 'hist:...:vals=hitcount.percent:nohitcount' 146 'hist:...:vals=hitcount.percent:nohitcount' is OK. 148 147 149 - enable_hist/disable_hist 148 - enable_hist/disable_hist 150 149 151 The enable_hist and disable_hist triggers ca 150 The enable_hist and disable_hist triggers can be used to have one 152 event conditionally start and stop another e 151 event conditionally start and stop another event's already-attached 153 hist trigger. Any number of enable_hist and 152 hist trigger. Any number of enable_hist and disable_hist triggers 154 can be attached to a given event, allowing t 153 can be attached to a given event, allowing that event to kick off 155 and stop aggregations on a host of other eve 154 and stop aggregations on a host of other events. 156 155 157 The format is very similar to the enable/dis 156 The format is very similar to the enable/disable_event triggers:: 158 157 159 enable_hist:<system>:<event>[:count] 158 enable_hist:<system>:<event>[:count] 160 disable_hist:<system>:<event>[:count] 159 disable_hist:<system>:<event>[:count] 161 160 162 Instead of enabling or disabling the tracing 161 Instead of enabling or disabling the tracing of the target event 163 into the trace buffer as the enable/disable_ 162 into the trace buffer as the enable/disable_event triggers do, the 164 enable/disable_hist triggers enable or disab 163 enable/disable_hist triggers enable or disable the aggregation of 165 the target event into a hash table. 164 the target event into a hash table. 166 165 167 A typical usage scenario for the enable_hist 166 A typical usage scenario for the enable_hist/disable_hist triggers 168 would be to first set up a paused hist trigg 167 would be to first set up a paused hist trigger on some event, 169 followed by an enable_hist/disable_hist pair 168 followed by an enable_hist/disable_hist pair that turns the hist 170 aggregation on and off when conditions of in 169 aggregation on and off when conditions of interest are hit:: 171 170 172 # echo 'hist:keys=skbaddr.hex:vals=len:paus 171 # echo 'hist:keys=skbaddr.hex:vals=len:pause' > \ 173 /sys/kernel/tracing/events/net/netif_rec !! 172 /sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger 174 173 175 # echo 'enable_hist:net:netif_receive_skb 174 # echo 'enable_hist:net:netif_receive_skb if filename==/usr/bin/wget' > \ 176 /sys/kernel/tracing/events/sched/sched_p !! 175 /sys/kernel/debug/tracing/events/sched/sched_process_exec/trigger 177 176 178 # echo 'disable_hist:net:netif_receive_skb 177 # echo 'disable_hist:net:netif_receive_skb if comm==wget' > \ 179 /sys/kernel/tracing/events/sched/sched_p !! 178 /sys/kernel/debug/tracing/events/sched/sched_process_exit/trigger 180 179 181 The above sets up an initially paused hist t 180 The above sets up an initially paused hist trigger which is unpaused 182 and starts aggregating events when a given p 181 and starts aggregating events when a given program is executed, and 183 which stops aggregating when the process exi 182 which stops aggregating when the process exits and the hist trigger 184 is paused again. 183 is paused again. 185 184 186 The examples below provide a more concrete i 185 The examples below provide a more concrete illustration of the 187 concepts and typical usage patterns discusse 186 concepts and typical usage patterns discussed above. 188 187 189 'special' event fields 188 'special' event fields 190 ------------------------ 189 ------------------------ 191 190 192 There are a number of 'special event fields' 191 There are a number of 'special event fields' available for use as 193 keys or values in a hist trigger. These loo 192 keys or values in a hist trigger. These look like and behave as if 194 they were actual event fields, but aren't re 193 they were actual event fields, but aren't really part of the event's 195 field definition or format file. They are h 194 field definition or format file. They are however available for any 196 event, and can be used anywhere an actual ev 195 event, and can be used anywhere an actual event field could be. 197 They are: 196 They are: 198 197 199 ====================== ==== ============== 198 ====================== ==== ======================================= 200 common_timestamp u64 timestamp (fro 199 common_timestamp u64 timestamp (from ring buffer) associated 201 with the event 200 with the event, in nanoseconds. May be 202 modified by .u 201 modified by .usecs to have timestamps 203 interpreted as 202 interpreted as microseconds. 204 common_cpu int the cpu on whi 203 common_cpu int the cpu on which the event occurred. 205 ====================== ==== ============== 204 ====================== ==== ======================================= 206 205 207 Extended error information 206 Extended error information 208 -------------------------- 207 -------------------------- 209 208 210 For some error conditions encountered when i 209 For some error conditions encountered when invoking a hist trigger 211 command, extended error information is avail 210 command, extended error information is available via the 212 tracing/error_log file. See Error Condition 211 tracing/error_log file. See Error Conditions in 213 :file:`Documentation/trace/ftrace.rst` for d 212 :file:`Documentation/trace/ftrace.rst` for details. 214 213 215 6.2 'hist' trigger examples 214 6.2 'hist' trigger examples 216 --------------------------- 215 --------------------------- 217 216 218 The first set of examples creates aggregatio 217 The first set of examples creates aggregations using the kmalloc 219 event. The fields that can be used for the 218 event. The fields that can be used for the hist trigger are listed 220 in the kmalloc event's format file:: 219 in the kmalloc event's format file:: 221 220 222 # cat /sys/kernel/tracing/events/kmem/kmal !! 221 # cat /sys/kernel/debug/tracing/events/kmem/kmalloc/format 223 name: kmalloc 222 name: kmalloc 224 ID: 374 223 ID: 374 225 format: 224 format: 226 field:unsigned short common_type; 225 field:unsigned short common_type; offset:0; size:2; signed:0; 227 field:unsigned char common_flags; 226 field:unsigned char common_flags; offset:2; size:1; signed:0; 228 field:unsigned char common_preempt_cou 227 field:unsigned char common_preempt_count; offset:3; size:1; signed:0; 229 field:int common_pid; 228 field:int common_pid; offset:4; size:4; signed:1; 230 229 231 field:unsigned long call_site; 230 field:unsigned long call_site; offset:8; size:8; signed:0; 232 field:const void * ptr; 231 field:const void * ptr; offset:16; size:8; signed:0; 233 field:size_t bytes_req; 232 field:size_t bytes_req; offset:24; size:8; signed:0; 234 field:size_t bytes_alloc; 233 field:size_t bytes_alloc; offset:32; size:8; signed:0; 235 field:gfp_t gfp_flags; 234 field:gfp_t gfp_flags; offset:40; size:4; signed:0; 236 235 237 We'll start by creating a hist trigger that 236 We'll start by creating a hist trigger that generates a simple table 238 that lists the total number of bytes request 237 that lists the total number of bytes requested for each function in 239 the kernel that made one or more calls to km 238 the kernel that made one or more calls to kmalloc:: 240 239 241 # echo 'hist:key=call_site:val=bytes_req.b 240 # echo 'hist:key=call_site:val=bytes_req.buckets=32' > \ 242 /sys/kernel/tracing/events/kmem/km !! 241 /sys/kernel/debug/tracing/events/kmem/kmalloc/trigger 243 242 244 This tells the tracing system to create a 'h 243 This tells the tracing system to create a 'hist' trigger using the 245 call_site field of the kmalloc event as the 244 call_site field of the kmalloc event as the key for the table, which 246 just means that each unique call_site addres 245 just means that each unique call_site address will have an entry 247 created for it in the table. The 'val=bytes 246 created for it in the table. The 'val=bytes_req' parameter tells 248 the hist trigger that for each unique entry 247 the hist trigger that for each unique entry (call_site) in the 249 table, it should keep a running total of the 248 table, it should keep a running total of the number of bytes 250 requested by that call_site. 249 requested by that call_site. 251 250 252 We'll let it run for awhile and then dump th 251 We'll let it run for awhile and then dump the contents of the 'hist' 253 file in the kmalloc event's subdirectory (fo 252 file in the kmalloc event's subdirectory (for readability, a number 254 of entries have been omitted):: 253 of entries have been omitted):: 255 254 256 # cat /sys/kernel/tracing/events/kmem/kmal !! 255 # cat /sys/kernel/debug/tracing/events/kmem/kmalloc/hist 257 # trigger info: hist:keys=call_site:vals=b 256 # trigger info: hist:keys=call_site:vals=bytes_req:sort=hitcount:size=2048 [active] 258 257 259 { call_site: 18446744072106379007 } hitcou 258 { call_site: 18446744072106379007 } hitcount: 1 bytes_req: 176 260 { call_site: 18446744071579557049 } hitcou 259 { call_site: 18446744071579557049 } hitcount: 1 bytes_req: 1024 261 { call_site: 18446744071580608289 } hitcou 260 { call_site: 18446744071580608289 } hitcount: 1 bytes_req: 16384 262 { call_site: 18446744071581827654 } hitcou 261 { call_site: 18446744071581827654 } hitcount: 1 bytes_req: 24 263 { call_site: 18446744071580700980 } hitcou 262 { call_site: 18446744071580700980 } hitcount: 1 bytes_req: 8 264 { call_site: 18446744071579359876 } hitcou 263 { call_site: 18446744071579359876 } hitcount: 1 bytes_req: 152 265 { call_site: 18446744071580795365 } hitcou 264 { call_site: 18446744071580795365 } hitcount: 3 bytes_req: 144 266 { call_site: 18446744071581303129 } hitcou 265 { call_site: 18446744071581303129 } hitcount: 3 bytes_req: 144 267 { call_site: 18446744071580713234 } hitcou 266 { call_site: 18446744071580713234 } hitcount: 4 bytes_req: 2560 268 { call_site: 18446744071580933750 } hitcou 267 { call_site: 18446744071580933750 } hitcount: 4 bytes_req: 736 269 . 268 . 270 . 269 . 271 . 270 . 272 { call_site: 18446744072106047046 } hitcou 271 { call_site: 18446744072106047046 } hitcount: 69 bytes_req: 5576 273 { call_site: 18446744071582116407 } hitcou 272 { call_site: 18446744071582116407 } hitcount: 73 bytes_req: 2336 274 { call_site: 18446744072106054684 } hitcou 273 { call_site: 18446744072106054684 } hitcount: 136 bytes_req: 140504 275 { call_site: 18446744072106224230 } hitcou 274 { call_site: 18446744072106224230 } hitcount: 136 bytes_req: 19584 276 { call_site: 18446744072106078074 } hitcou 275 { call_site: 18446744072106078074 } hitcount: 153 bytes_req: 2448 277 { call_site: 18446744072106062406 } hitcou 276 { call_site: 18446744072106062406 } hitcount: 153 bytes_req: 36720 278 { call_site: 18446744071582507929 } hitcou 277 { call_site: 18446744071582507929 } hitcount: 153 bytes_req: 37088 279 { call_site: 18446744072102520590 } hitcou 278 { call_site: 18446744072102520590 } hitcount: 273 bytes_req: 10920 280 { call_site: 18446744071582143559 } hitcou 279 { call_site: 18446744071582143559 } hitcount: 358 bytes_req: 716 281 { call_site: 18446744072106465852 } hitcou 280 { call_site: 18446744072106465852 } hitcount: 417 bytes_req: 56712 282 { call_site: 18446744072102523378 } hitcou 281 { call_site: 18446744072102523378 } hitcount: 485 bytes_req: 27160 283 { call_site: 18446744072099568646 } hitcou 282 { call_site: 18446744072099568646 } hitcount: 1676 bytes_req: 33520 284 283 285 Totals: 284 Totals: 286 Hits: 4610 285 Hits: 4610 287 Entries: 45 286 Entries: 45 288 Dropped: 0 287 Dropped: 0 289 288 290 The output displays a line for each entry, b 289 The output displays a line for each entry, beginning with the key 291 specified in the trigger, followed by the va 290 specified in the trigger, followed by the value(s) also specified in 292 the trigger. At the beginning of the output 291 the trigger. At the beginning of the output is a line that displays 293 the trigger info, which can also be displaye 292 the trigger info, which can also be displayed by reading the 294 'trigger' file:: 293 'trigger' file:: 295 294 296 # cat /sys/kernel/tracing/events/kmem/kmal !! 295 # cat /sys/kernel/debug/tracing/events/kmem/kmalloc/trigger 297 hist:keys=call_site:vals=bytes_req:sort=hi 296 hist:keys=call_site:vals=bytes_req:sort=hitcount:size=2048 [active] 298 297 299 At the end of the output are a few lines tha 298 At the end of the output are a few lines that display the overall 300 totals for the run. The 'Hits' field shows 299 totals for the run. The 'Hits' field shows the total number of 301 times the event trigger was hit, the 'Entrie 300 times the event trigger was hit, the 'Entries' field shows the total 302 number of used entries in the hash table, an 301 number of used entries in the hash table, and the 'Dropped' field 303 shows the number of hits that were dropped b 302 shows the number of hits that were dropped because the number of 304 used entries for the run exceeded the maximu 303 used entries for the run exceeded the maximum number of entries 305 allowed for the table (normally 0, but if no 304 allowed for the table (normally 0, but if not a hint that you may 306 want to increase the size of the table using 305 want to increase the size of the table using the 'size' parameter). 307 306 308 Notice in the above output that there's an e 307 Notice in the above output that there's an extra field, 'hitcount', 309 which wasn't specified in the trigger. Also 308 which wasn't specified in the trigger. Also notice that in the 310 trigger info output, there's a parameter, 's 309 trigger info output, there's a parameter, 'sort=hitcount', which 311 wasn't specified in the trigger either. The 310 wasn't specified in the trigger either. The reason for that is that 312 every trigger implicitly keeps a count of th 311 every trigger implicitly keeps a count of the total number of hits 313 attributed to a given entry, called the 'hit 312 attributed to a given entry, called the 'hitcount'. That hitcount 314 information is explicitly displayed in the o 313 information is explicitly displayed in the output, and in the 315 absence of a user-specified sort parameter, 314 absence of a user-specified sort parameter, is used as the default 316 sort field. 315 sort field. 317 316 318 The value 'hitcount' can be used in place of 317 The value 'hitcount' can be used in place of an explicit value in 319 the 'values' parameter if you don't really n 318 the 'values' parameter if you don't really need to have any 320 particular field summed and are mainly inter 319 particular field summed and are mainly interested in hit 321 frequencies. 320 frequencies. 322 321 323 To turn the hist trigger off, simply call up 322 To turn the hist trigger off, simply call up the trigger in the 324 command history and re-execute it with a '!' 323 command history and re-execute it with a '!' prepended:: 325 324 326 # echo '!hist:key=call_site:val=bytes_req' 325 # echo '!hist:key=call_site:val=bytes_req' > \ 327 /sys/kernel/tracing/events/kmem/kma !! 326 /sys/kernel/debug/tracing/events/kmem/kmalloc/trigger 328 327 329 Finally, notice that the call_site as displa 328 Finally, notice that the call_site as displayed in the output above 330 isn't really very useful. It's an address, 329 isn't really very useful. It's an address, but normally addresses 331 are displayed in hex. To have a numeric fie 330 are displayed in hex. To have a numeric field displayed as a hex 332 value, simply append '.hex' to the field nam 331 value, simply append '.hex' to the field name in the trigger:: 333 332 334 # echo 'hist:key=call_site.hex:val=bytes_r 333 # echo 'hist:key=call_site.hex:val=bytes_req' > \ 335 /sys/kernel/tracing/events/kmem/kma !! 334 /sys/kernel/debug/tracing/events/kmem/kmalloc/trigger 336 335 337 # cat /sys/kernel/tracing/events/kmem/kmal !! 336 # cat /sys/kernel/debug/tracing/events/kmem/kmalloc/hist 338 # trigger info: hist:keys=call_site.hex:va 337 # trigger info: hist:keys=call_site.hex:vals=bytes_req:sort=hitcount:size=2048 [active] 339 338 340 { call_site: ffffffffa026b291 } hitcount: 339 { call_site: ffffffffa026b291 } hitcount: 1 bytes_req: 433 341 { call_site: ffffffffa07186ff } hitcount: 340 { call_site: ffffffffa07186ff } hitcount: 1 bytes_req: 176 342 { call_site: ffffffff811ae721 } hitcount: 341 { call_site: ffffffff811ae721 } hitcount: 1 bytes_req: 16384 343 { call_site: ffffffff811c5134 } hitcount: 342 { call_site: ffffffff811c5134 } hitcount: 1 bytes_req: 8 344 { call_site: ffffffffa04a9ebb } hitcount: 343 { call_site: ffffffffa04a9ebb } hitcount: 1 bytes_req: 511 345 { call_site: ffffffff8122e0a6 } hitcount: 344 { call_site: ffffffff8122e0a6 } hitcount: 1 bytes_req: 12 346 { call_site: ffffffff8107da84 } hitcount: 345 { call_site: ffffffff8107da84 } hitcount: 1 bytes_req: 152 347 { call_site: ffffffff812d8246 } hitcount: 346 { call_site: ffffffff812d8246 } hitcount: 1 bytes_req: 24 348 { call_site: ffffffff811dc1e5 } hitcount: 347 { call_site: ffffffff811dc1e5 } hitcount: 3 bytes_req: 144 349 { call_site: ffffffffa02515e8 } hitcount: 348 { call_site: ffffffffa02515e8 } hitcount: 3 bytes_req: 648 350 { call_site: ffffffff81258159 } hitcount: 349 { call_site: ffffffff81258159 } hitcount: 3 bytes_req: 144 351 { call_site: ffffffff811c80f4 } hitcount: 350 { call_site: ffffffff811c80f4 } hitcount: 4 bytes_req: 544 352 . 351 . 353 . 352 . 354 . 353 . 355 { call_site: ffffffffa06c7646 } hitcount: 354 { call_site: ffffffffa06c7646 } hitcount: 106 bytes_req: 8024 356 { call_site: ffffffffa06cb246 } hitcount: 355 { call_site: ffffffffa06cb246 } hitcount: 132 bytes_req: 31680 357 { call_site: ffffffffa06cef7a } hitcount: 356 { call_site: ffffffffa06cef7a } hitcount: 132 bytes_req: 2112 358 { call_site: ffffffff8137e399 } hitcount: 357 { call_site: ffffffff8137e399 } hitcount: 132 bytes_req: 23232 359 { call_site: ffffffffa06c941c } hitcount: 358 { call_site: ffffffffa06c941c } hitcount: 185 bytes_req: 171360 360 { call_site: ffffffffa06f2a66 } hitcount: 359 { call_site: ffffffffa06f2a66 } hitcount: 185 bytes_req: 26640 361 { call_site: ffffffffa036a70e } hitcount: 360 { call_site: ffffffffa036a70e } hitcount: 265 bytes_req: 10600 362 { call_site: ffffffff81325447 } hitcount: 361 { call_site: ffffffff81325447 } hitcount: 292 bytes_req: 584 363 { call_site: ffffffffa072da3c } hitcount: 362 { call_site: ffffffffa072da3c } hitcount: 446 bytes_req: 60656 364 { call_site: ffffffffa036b1f2 } hitcount: 363 { call_site: ffffffffa036b1f2 } hitcount: 526 bytes_req: 29456 365 { call_site: ffffffffa0099c06 } hitcount: 364 { call_site: ffffffffa0099c06 } hitcount: 1780 bytes_req: 35600 366 365 367 Totals: 366 Totals: 368 Hits: 4775 367 Hits: 4775 369 Entries: 46 368 Entries: 46 370 Dropped: 0 369 Dropped: 0 371 370 372 Even that's only marginally more useful - wh 371 Even that's only marginally more useful - while hex values do look 373 more like addresses, what users are typicall 372 more like addresses, what users are typically more interested in 374 when looking at text addresses are the corre 373 when looking at text addresses are the corresponding symbols 375 instead. To have an address displayed as sy 374 instead. To have an address displayed as symbolic value instead, 376 simply append '.sym' or '.sym-offset' to the 375 simply append '.sym' or '.sym-offset' to the field name in the 377 trigger:: 376 trigger:: 378 377 379 # echo 'hist:key=call_site.sym:val=bytes_r 378 # echo 'hist:key=call_site.sym:val=bytes_req' > \ 380 /sys/kernel/tracing/events/kmem/kma !! 379 /sys/kernel/debug/tracing/events/kmem/kmalloc/trigger 381 380 382 # cat /sys/kernel/tracing/events/kmem/kmal !! 381 # cat /sys/kernel/debug/tracing/events/kmem/kmalloc/hist 383 # trigger info: hist:keys=call_site.sym:va 382 # trigger info: hist:keys=call_site.sym:vals=bytes_req:sort=hitcount:size=2048 [active] 384 383 385 { call_site: [ffffffff810adcb9] syslog_pri 384 { call_site: [ffffffff810adcb9] syslog_print_all } hitcount: 1 bytes_req: 1024 386 { call_site: [ffffffff8154bc62] usb_contro 385 { call_site: [ffffffff8154bc62] usb_control_msg } hitcount: 1 bytes_req: 8 387 { call_site: [ffffffffa00bf6fe] hidraw_sen 386 { call_site: [ffffffffa00bf6fe] hidraw_send_report [hid] } hitcount: 1 bytes_req: 7 388 { call_site: [ffffffff8154acbe] usb_alloc_ 387 { call_site: [ffffffff8154acbe] usb_alloc_urb } hitcount: 1 bytes_req: 192 389 { call_site: [ffffffffa00bf1ca] hidraw_rep 388 { call_site: [ffffffffa00bf1ca] hidraw_report_event [hid] } hitcount: 1 bytes_req: 7 390 { call_site: [ffffffff811e3a25] __seq_open 389 { call_site: [ffffffff811e3a25] __seq_open_private } hitcount: 1 bytes_req: 40 391 { call_site: [ffffffff8109524a] alloc_fair 390 { call_site: [ffffffff8109524a] alloc_fair_sched_group } hitcount: 2 bytes_req: 128 392 { call_site: [ffffffff811febd5] fsnotify_a 391 { call_site: [ffffffff811febd5] fsnotify_alloc_group } hitcount: 2 bytes_req: 528 393 { call_site: [ffffffff81440f58] __tty_buff 392 { call_site: [ffffffff81440f58] __tty_buffer_request_room } hitcount: 2 bytes_req: 2624 394 { call_site: [ffffffff81200ba6] inotify_ne 393 { call_site: [ffffffff81200ba6] inotify_new_group } hitcount: 2 bytes_req: 96 395 { call_site: [ffffffffa05e19af] ieee80211_ 394 { call_site: [ffffffffa05e19af] ieee80211_start_tx_ba_session [mac80211] } hitcount: 2 bytes_req: 464 396 { call_site: [ffffffff81672406] tcp_get_me 395 { call_site: [ffffffff81672406] tcp_get_metrics } hitcount: 2 bytes_req: 304 397 { call_site: [ffffffff81097ec2] alloc_rt_s 396 { call_site: [ffffffff81097ec2] alloc_rt_sched_group } hitcount: 2 bytes_req: 128 398 { call_site: [ffffffff81089b05] sched_crea 397 { call_site: [ffffffff81089b05] sched_create_group } hitcount: 2 bytes_req: 1424 399 . 398 . 400 . 399 . 401 . 400 . 402 { call_site: [ffffffffa04a580c] intel_crtc 401 { call_site: [ffffffffa04a580c] intel_crtc_page_flip [i915] } hitcount: 1185 bytes_req: 123240 403 { call_site: [ffffffffa0287592] drm_mode_p 402 { call_site: [ffffffffa0287592] drm_mode_page_flip_ioctl [drm] } hitcount: 1185 bytes_req: 104280 404 { call_site: [ffffffffa04c4a3c] intel_plan 403 { call_site: [ffffffffa04c4a3c] intel_plane_duplicate_state [i915] } hitcount: 1402 bytes_req: 190672 405 { call_site: [ffffffff812891ca] ext4_find_ 404 { call_site: [ffffffff812891ca] ext4_find_extent } hitcount: 1518 bytes_req: 146208 406 { call_site: [ffffffffa029070e] drm_vma_no 405 { call_site: [ffffffffa029070e] drm_vma_node_allow [drm] } hitcount: 1746 bytes_req: 69840 407 { call_site: [ffffffffa045e7c4] i915_gem_d 406 { call_site: [ffffffffa045e7c4] i915_gem_do_execbuffer.isra.23 [i915] } hitcount: 2021 bytes_req: 792312 408 { call_site: [ffffffffa02911f2] drm_modese 407 { call_site: [ffffffffa02911f2] drm_modeset_lock_crtc [drm] } hitcount: 2592 bytes_req: 145152 409 { call_site: [ffffffffa0489a66] intel_ring 408 { call_site: [ffffffffa0489a66] intel_ring_begin [i915] } hitcount: 2629 bytes_req: 378576 410 { call_site: [ffffffffa046041c] i915_gem_e 409 { call_site: [ffffffffa046041c] i915_gem_execbuffer2 [i915] } hitcount: 2629 bytes_req: 3783248 411 { call_site: [ffffffff81325607] apparmor_f 410 { call_site: [ffffffff81325607] apparmor_file_alloc_security } hitcount: 5192 bytes_req: 10384 412 { call_site: [ffffffffa00b7c06] hid_report 411 { call_site: [ffffffffa00b7c06] hid_report_raw_event [hid] } hitcount: 5529 bytes_req: 110584 413 { call_site: [ffffffff8131ebf7] aa_alloc_t 412 { call_site: [ffffffff8131ebf7] aa_alloc_task_context } hitcount: 21943 bytes_req: 702176 414 { call_site: [ffffffff8125847d] ext4_htree 413 { call_site: [ffffffff8125847d] ext4_htree_store_dirent } hitcount: 55759 bytes_req: 5074265 415 414 416 Totals: 415 Totals: 417 Hits: 109928 416 Hits: 109928 418 Entries: 71 417 Entries: 71 419 Dropped: 0 418 Dropped: 0 420 419 421 Because the default sort key above is 'hitco 420 Because the default sort key above is 'hitcount', the above shows a 422 the list of call_sites by increasing hitcoun 421 the list of call_sites by increasing hitcount, so that at the bottom 423 we see the functions that made the most kmal 422 we see the functions that made the most kmalloc calls during the 424 run. If instead we wanted to see the top km 423 run. If instead we wanted to see the top kmalloc callers in 425 terms of the number of bytes requested rathe 424 terms of the number of bytes requested rather than the number of 426 calls, and we wanted the top caller to appea 425 calls, and we wanted the top caller to appear at the top, we can use 427 the 'sort' parameter, along with the 'descen 426 the 'sort' parameter, along with the 'descending' modifier:: 428 427 429 # echo 'hist:key=call_site.sym:val=bytes_r 428 # echo 'hist:key=call_site.sym:val=bytes_req:sort=bytes_req.descending' > \ 430 /sys/kernel/tracing/events/kmem/kma !! 429 /sys/kernel/debug/tracing/events/kmem/kmalloc/trigger 431 430 432 # cat /sys/kernel/tracing/events/kmem/kmal !! 431 # cat /sys/kernel/debug/tracing/events/kmem/kmalloc/hist 433 # trigger info: hist:keys=call_site.sym:va 432 # trigger info: hist:keys=call_site.sym:vals=bytes_req:sort=bytes_req.descending:size=2048 [active] 434 433 435 { call_site: [ffffffffa046041c] i915_gem_e 434 { call_site: [ffffffffa046041c] i915_gem_execbuffer2 [i915] } hitcount: 2186 bytes_req: 3397464 436 { call_site: [ffffffffa045e7c4] i915_gem_d 435 { call_site: [ffffffffa045e7c4] i915_gem_do_execbuffer.isra.23 [i915] } hitcount: 1790 bytes_req: 712176 437 { call_site: [ffffffff8125847d] ext4_htree 436 { call_site: [ffffffff8125847d] ext4_htree_store_dirent } hitcount: 8132 bytes_req: 513135 438 { call_site: [ffffffff811e2a1b] seq_buf_al 437 { call_site: [ffffffff811e2a1b] seq_buf_alloc } hitcount: 106 bytes_req: 440128 439 { call_site: [ffffffffa0489a66] intel_ring 438 { call_site: [ffffffffa0489a66] intel_ring_begin [i915] } hitcount: 2186 bytes_req: 314784 440 { call_site: [ffffffff812891ca] ext4_find_ 439 { call_site: [ffffffff812891ca] ext4_find_extent } hitcount: 2174 bytes_req: 208992 441 { call_site: [ffffffff811ae8e1] __kmalloc 440 { call_site: [ffffffff811ae8e1] __kmalloc } hitcount: 8 bytes_req: 131072 442 { call_site: [ffffffffa04c4a3c] intel_plan 441 { call_site: [ffffffffa04c4a3c] intel_plane_duplicate_state [i915] } hitcount: 859 bytes_req: 116824 443 { call_site: [ffffffffa02911f2] drm_modese 442 { call_site: [ffffffffa02911f2] drm_modeset_lock_crtc [drm] } hitcount: 1834 bytes_req: 102704 444 { call_site: [ffffffffa04a580c] intel_crtc 443 { call_site: [ffffffffa04a580c] intel_crtc_page_flip [i915] } hitcount: 972 bytes_req: 101088 445 { call_site: [ffffffffa0287592] drm_mode_p 444 { call_site: [ffffffffa0287592] drm_mode_page_flip_ioctl [drm] } hitcount: 972 bytes_req: 85536 446 { call_site: [ffffffffa00b7c06] hid_report 445 { call_site: [ffffffffa00b7c06] hid_report_raw_event [hid] } hitcount: 3333 bytes_req: 66664 447 { call_site: [ffffffff8137e559] sg_kmalloc 446 { call_site: [ffffffff8137e559] sg_kmalloc } hitcount: 209 bytes_req: 61632 448 . 447 . 449 . 448 . 450 . 449 . 451 { call_site: [ffffffff81095225] alloc_fair 450 { call_site: [ffffffff81095225] alloc_fair_sched_group } hitcount: 2 bytes_req: 128 452 { call_site: [ffffffff81097ec2] alloc_rt_s 451 { call_site: [ffffffff81097ec2] alloc_rt_sched_group } hitcount: 2 bytes_req: 128 453 { call_site: [ffffffff812d8406] copy_semun 452 { call_site: [ffffffff812d8406] copy_semundo } hitcount: 2 bytes_req: 48 454 { call_site: [ffffffff81200ba6] inotify_ne 453 { call_site: [ffffffff81200ba6] inotify_new_group } hitcount: 1 bytes_req: 48 455 { call_site: [ffffffffa027121a] drm_getmag 454 { call_site: [ffffffffa027121a] drm_getmagic [drm] } hitcount: 1 bytes_req: 48 456 { call_site: [ffffffff811e3a25] __seq_open 455 { call_site: [ffffffff811e3a25] __seq_open_private } hitcount: 1 bytes_req: 40 457 { call_site: [ffffffff811c52f4] bprm_chang 456 { call_site: [ffffffff811c52f4] bprm_change_interp } hitcount: 2 bytes_req: 16 458 { call_site: [ffffffff8154bc62] usb_contro 457 { call_site: [ffffffff8154bc62] usb_control_msg } hitcount: 1 bytes_req: 8 459 { call_site: [ffffffffa00bf1ca] hidraw_rep 458 { call_site: [ffffffffa00bf1ca] hidraw_report_event [hid] } hitcount: 1 bytes_req: 7 460 { call_site: [ffffffffa00bf6fe] hidraw_sen 459 { call_site: [ffffffffa00bf6fe] hidraw_send_report [hid] } hitcount: 1 bytes_req: 7 461 460 462 Totals: 461 Totals: 463 Hits: 32133 462 Hits: 32133 464 Entries: 81 463 Entries: 81 465 Dropped: 0 464 Dropped: 0 466 465 467 To display the offset and size information i 466 To display the offset and size information in addition to the symbol 468 name, just use 'sym-offset' instead:: 467 name, just use 'sym-offset' instead:: 469 468 470 # echo 'hist:key=call_site.sym-offset:val= 469 # echo 'hist:key=call_site.sym-offset:val=bytes_req:sort=bytes_req.descending' > \ 471 /sys/kernel/tracing/events/kmem/kma !! 470 /sys/kernel/debug/tracing/events/kmem/kmalloc/trigger 472 471 473 # cat /sys/kernel/tracing/events/kmem/kmal !! 472 # cat /sys/kernel/debug/tracing/events/kmem/kmalloc/hist 474 # trigger info: hist:keys=call_site.sym-of 473 # trigger info: hist:keys=call_site.sym-offset:vals=bytes_req:sort=bytes_req.descending:size=2048 [active] 475 474 476 { call_site: [ffffffffa046041c] i915_gem_e 475 { call_site: [ffffffffa046041c] i915_gem_execbuffer2+0x6c/0x2c0 [i915] } hitcount: 4569 bytes_req: 3163720 477 { call_site: [ffffffffa0489a66] intel_ring 476 { call_site: [ffffffffa0489a66] intel_ring_begin+0xc6/0x1f0 [i915] } hitcount: 4569 bytes_req: 657936 478 { call_site: [ffffffffa045e7c4] i915_gem_d 477 { call_site: [ffffffffa045e7c4] i915_gem_do_execbuffer.isra.23+0x694/0x1020 [i915] } hitcount: 1519 bytes_req: 472936 479 { call_site: [ffffffffa045e646] i915_gem_d 478 { call_site: [ffffffffa045e646] i915_gem_do_execbuffer.isra.23+0x516/0x1020 [i915] } hitcount: 3050 bytes_req: 211832 480 { call_site: [ffffffff811e2a1b] seq_buf_al 479 { call_site: [ffffffff811e2a1b] seq_buf_alloc+0x1b/0x50 } hitcount: 34 bytes_req: 148384 481 { call_site: [ffffffffa04a580c] intel_crtc 480 { call_site: [ffffffffa04a580c] intel_crtc_page_flip+0xbc/0x870 [i915] } hitcount: 1385 bytes_req: 144040 482 { call_site: [ffffffff811ae8e1] __kmalloc+ 481 { call_site: [ffffffff811ae8e1] __kmalloc+0x191/0x1b0 } hitcount: 8 bytes_req: 131072 483 { call_site: [ffffffffa0287592] drm_mode_p 482 { call_site: [ffffffffa0287592] drm_mode_page_flip_ioctl+0x282/0x360 [drm] } hitcount: 1385 bytes_req: 121880 484 { call_site: [ffffffffa02911f2] drm_modese 483 { call_site: [ffffffffa02911f2] drm_modeset_lock_crtc+0x32/0x100 [drm] } hitcount: 1848 bytes_req: 103488 485 { call_site: [ffffffffa04c4a3c] intel_plan 484 { call_site: [ffffffffa04c4a3c] intel_plane_duplicate_state+0x2c/0xa0 [i915] } hitcount: 461 bytes_req: 62696 486 { call_site: [ffffffffa029070e] drm_vma_no 485 { call_site: [ffffffffa029070e] drm_vma_node_allow+0x2e/0xd0 [drm] } hitcount: 1541 bytes_req: 61640 487 { call_site: [ffffffff815f8d7b] sk_prot_al 486 { call_site: [ffffffff815f8d7b] sk_prot_alloc+0xcb/0x1b0 } hitcount: 57 bytes_req: 57456 488 . 487 . 489 . 488 . 490 . 489 . 491 { call_site: [ffffffff8109524a] alloc_fair 490 { call_site: [ffffffff8109524a] alloc_fair_sched_group+0x5a/0x1a0 } hitcount: 2 bytes_req: 128 492 { call_site: [ffffffffa027b921] drm_vm_ope 491 { call_site: [ffffffffa027b921] drm_vm_open_locked+0x31/0xa0 [drm] } hitcount: 3 bytes_req: 96 493 { call_site: [ffffffff8122e266] proc_self_ 492 { call_site: [ffffffff8122e266] proc_self_follow_link+0x76/0xb0 } hitcount: 8 bytes_req: 96 494 { call_site: [ffffffff81213e80] load_elf_b 493 { call_site: [ffffffff81213e80] load_elf_binary+0x240/0x1650 } hitcount: 3 bytes_req: 84 495 { call_site: [ffffffff8154bc62] usb_contro 494 { call_site: [ffffffff8154bc62] usb_control_msg+0x42/0x110 } hitcount: 1 bytes_req: 8 496 { call_site: [ffffffffa00bf6fe] hidraw_sen 495 { call_site: [ffffffffa00bf6fe] hidraw_send_report+0x7e/0x1a0 [hid] } hitcount: 1 bytes_req: 7 497 { call_site: [ffffffffa00bf1ca] hidraw_rep 496 { call_site: [ffffffffa00bf1ca] hidraw_report_event+0x8a/0x120 [hid] } hitcount: 1 bytes_req: 7 498 497 499 Totals: 498 Totals: 500 Hits: 26098 499 Hits: 26098 501 Entries: 64 500 Entries: 64 502 Dropped: 0 501 Dropped: 0 503 502 504 We can also add multiple fields to the 'valu 503 We can also add multiple fields to the 'values' parameter. For 505 example, we might want to see the total numb 504 example, we might want to see the total number of bytes allocated 506 alongside bytes requested, and display the r 505 alongside bytes requested, and display the result sorted by bytes 507 allocated in a descending order:: 506 allocated in a descending order:: 508 507 509 # echo 'hist:keys=call_site.sym:values=byt 508 # echo 'hist:keys=call_site.sym:values=bytes_req,bytes_alloc:sort=bytes_alloc.descending' > \ 510 /sys/kernel/tracing/events/kmem/kma !! 509 /sys/kernel/debug/tracing/events/kmem/kmalloc/trigger 511 510 512 # cat /sys/kernel/tracing/events/kmem/kmal !! 511 # cat /sys/kernel/debug/tracing/events/kmem/kmalloc/hist 513 # trigger info: hist:keys=call_site.sym:va 512 # trigger info: hist:keys=call_site.sym:vals=bytes_req,bytes_alloc:sort=bytes_alloc.descending:size=2048 [active] 514 513 515 { call_site: [ffffffffa046041c] i915_gem_e 514 { call_site: [ffffffffa046041c] i915_gem_execbuffer2 [i915] } hitcount: 7403 bytes_req: 4084360 bytes_alloc: 5958016 516 { call_site: [ffffffff811e2a1b] seq_buf_al 515 { call_site: [ffffffff811e2a1b] seq_buf_alloc } hitcount: 541 bytes_req: 2213968 bytes_alloc: 2228224 517 { call_site: [ffffffffa0489a66] intel_ring 516 { call_site: [ffffffffa0489a66] intel_ring_begin [i915] } hitcount: 7404 bytes_req: 1066176 bytes_alloc: 1421568 518 { call_site: [ffffffffa045e7c4] i915_gem_d 517 { call_site: [ffffffffa045e7c4] i915_gem_do_execbuffer.isra.23 [i915] } hitcount: 1565 bytes_req: 557368 bytes_alloc: 1037760 519 { call_site: [ffffffff8125847d] ext4_htree 518 { call_site: [ffffffff8125847d] ext4_htree_store_dirent } hitcount: 9557 bytes_req: 595778 bytes_alloc: 695744 520 { call_site: [ffffffffa045e646] i915_gem_d 519 { call_site: [ffffffffa045e646] i915_gem_do_execbuffer.isra.23 [i915] } hitcount: 5839 bytes_req: 430680 bytes_alloc: 470400 521 { call_site: [ffffffffa04c4a3c] intel_plan 520 { call_site: [ffffffffa04c4a3c] intel_plane_duplicate_state [i915] } hitcount: 2388 bytes_req: 324768 bytes_alloc: 458496 522 { call_site: [ffffffffa02911f2] drm_modese 521 { call_site: [ffffffffa02911f2] drm_modeset_lock_crtc [drm] } hitcount: 3911 bytes_req: 219016 bytes_alloc: 250304 523 { call_site: [ffffffff815f8d7b] sk_prot_al 522 { call_site: [ffffffff815f8d7b] sk_prot_alloc } hitcount: 235 bytes_req: 236880 bytes_alloc: 240640 524 { call_site: [ffffffff8137e559] sg_kmalloc 523 { call_site: [ffffffff8137e559] sg_kmalloc } hitcount: 557 bytes_req: 169024 bytes_alloc: 221760 525 { call_site: [ffffffffa00b7c06] hid_report 524 { call_site: [ffffffffa00b7c06] hid_report_raw_event [hid] } hitcount: 9378 bytes_req: 187548 bytes_alloc: 206312 526 { call_site: [ffffffffa04a580c] intel_crtc 525 { call_site: [ffffffffa04a580c] intel_crtc_page_flip [i915] } hitcount: 1519 bytes_req: 157976 bytes_alloc: 194432 527 . 526 . 528 . 527 . 529 . 528 . 530 { call_site: [ffffffff8109bd3b] sched_auto 529 { call_site: [ffffffff8109bd3b] sched_autogroup_create_attach } hitcount: 2 bytes_req: 144 bytes_alloc: 192 531 { call_site: [ffffffff81097ee8] alloc_rt_s 530 { call_site: [ffffffff81097ee8] alloc_rt_sched_group } hitcount: 2 bytes_req: 128 bytes_alloc: 128 532 { call_site: [ffffffff8109524a] alloc_fair 531 { call_site: [ffffffff8109524a] alloc_fair_sched_group } hitcount: 2 bytes_req: 128 bytes_alloc: 128 533 { call_site: [ffffffff81095225] alloc_fair 532 { call_site: [ffffffff81095225] alloc_fair_sched_group } hitcount: 2 bytes_req: 128 bytes_alloc: 128 534 { call_site: [ffffffff81097ec2] alloc_rt_s 533 { call_site: [ffffffff81097ec2] alloc_rt_sched_group } hitcount: 2 bytes_req: 128 bytes_alloc: 128 535 { call_site: [ffffffff81213e80] load_elf_b 534 { call_site: [ffffffff81213e80] load_elf_binary } hitcount: 3 bytes_req: 84 bytes_alloc: 96 536 { call_site: [ffffffff81079a2e] kthread_cr 535 { call_site: [ffffffff81079a2e] kthread_create_on_node } hitcount: 1 bytes_req: 56 bytes_alloc: 64 537 { call_site: [ffffffffa00bf6fe] hidraw_sen 536 { call_site: [ffffffffa00bf6fe] hidraw_send_report [hid] } hitcount: 1 bytes_req: 7 bytes_alloc: 8 538 { call_site: [ffffffff8154bc62] usb_contro 537 { call_site: [ffffffff8154bc62] usb_control_msg } hitcount: 1 bytes_req: 8 bytes_alloc: 8 539 { call_site: [ffffffffa00bf1ca] hidraw_rep 538 { call_site: [ffffffffa00bf1ca] hidraw_report_event [hid] } hitcount: 1 bytes_req: 7 bytes_alloc: 8 540 539 541 Totals: 540 Totals: 542 Hits: 66598 541 Hits: 66598 543 Entries: 65 542 Entries: 65 544 Dropped: 0 543 Dropped: 0 545 544 546 Finally, to finish off our kmalloc example, 545 Finally, to finish off our kmalloc example, instead of simply having 547 the hist trigger display symbolic call_sites 546 the hist trigger display symbolic call_sites, we can have the hist 548 trigger additionally display the complete se 547 trigger additionally display the complete set of kernel stack traces 549 that led to each call_site. To do that, we 548 that led to each call_site. To do that, we simply use the special 550 value 'common_stacktrace' for the key parame !! 549 value 'stacktrace' for the key parameter:: 551 550 552 # echo 'hist:keys=common_stacktrace:values !! 551 # echo 'hist:keys=stacktrace:values=bytes_req,bytes_alloc:sort=bytes_alloc' > \ 553 /sys/kernel/tracing/events/kmem/kma !! 552 /sys/kernel/debug/tracing/events/kmem/kmalloc/trigger 554 553 555 The above trigger will use the kernel stack 554 The above trigger will use the kernel stack trace in effect when an 556 event is triggered as the key for the hash t 555 event is triggered as the key for the hash table. This allows the 557 enumeration of every kernel callpath that le 556 enumeration of every kernel callpath that led up to a particular 558 event, along with a running total of any of 557 event, along with a running total of any of the event fields for 559 that event. Here we tally bytes requested a 558 that event. Here we tally bytes requested and bytes allocated for 560 every callpath in the system that led up to 559 every callpath in the system that led up to a kmalloc (in this case 561 every callpath to a kmalloc for a kernel com 560 every callpath to a kmalloc for a kernel compile):: 562 561 563 # cat /sys/kernel/tracing/events/kmem/kmal !! 562 # cat /sys/kernel/debug/tracing/events/kmem/kmalloc/hist 564 # trigger info: hist:keys=common_stacktrac !! 563 # trigger info: hist:keys=stacktrace:vals=bytes_req,bytes_alloc:sort=bytes_alloc:size=2048 [active] 565 564 566 { common_stacktrace: !! 565 { stacktrace: 567 __kmalloc_track_caller+0x10b/0x1a0 566 __kmalloc_track_caller+0x10b/0x1a0 568 kmemdup+0x20/0x50 567 kmemdup+0x20/0x50 569 hidraw_report_event+0x8a/0x120 [hid] 568 hidraw_report_event+0x8a/0x120 [hid] 570 hid_report_raw_event+0x3ea/0x440 [hid 569 hid_report_raw_event+0x3ea/0x440 [hid] 571 hid_input_report+0x112/0x190 [hid] 570 hid_input_report+0x112/0x190 [hid] 572 hid_irq_in+0xc2/0x260 [usbhid] 571 hid_irq_in+0xc2/0x260 [usbhid] 573 __usb_hcd_giveback_urb+0x72/0x120 572 __usb_hcd_giveback_urb+0x72/0x120 574 usb_giveback_urb_bh+0x9e/0xe0 573 usb_giveback_urb_bh+0x9e/0xe0 575 tasklet_hi_action+0xf8/0x100 574 tasklet_hi_action+0xf8/0x100 576 __do_softirq+0x114/0x2c0 575 __do_softirq+0x114/0x2c0 577 irq_exit+0xa5/0xb0 576 irq_exit+0xa5/0xb0 578 do_IRQ+0x5a/0xf0 577 do_IRQ+0x5a/0xf0 579 ret_from_intr+0x0/0x30 578 ret_from_intr+0x0/0x30 580 cpuidle_enter+0x17/0x20 579 cpuidle_enter+0x17/0x20 581 cpu_startup_entry+0x315/0x3e0 580 cpu_startup_entry+0x315/0x3e0 582 rest_init+0x7c/0x80 581 rest_init+0x7c/0x80 583 } hitcount: 3 bytes_req: 582 } hitcount: 3 bytes_req: 21 bytes_alloc: 24 584 { common_stacktrace: !! 583 { stacktrace: 585 __kmalloc_track_caller+0x10b/0x1a0 584 __kmalloc_track_caller+0x10b/0x1a0 586 kmemdup+0x20/0x50 585 kmemdup+0x20/0x50 587 hidraw_report_event+0x8a/0x120 [hid] 586 hidraw_report_event+0x8a/0x120 [hid] 588 hid_report_raw_event+0x3ea/0x440 [hid 587 hid_report_raw_event+0x3ea/0x440 [hid] 589 hid_input_report+0x112/0x190 [hid] 588 hid_input_report+0x112/0x190 [hid] 590 hid_irq_in+0xc2/0x260 [usbhid] 589 hid_irq_in+0xc2/0x260 [usbhid] 591 __usb_hcd_giveback_urb+0x72/0x120 590 __usb_hcd_giveback_urb+0x72/0x120 592 usb_giveback_urb_bh+0x9e/0xe0 591 usb_giveback_urb_bh+0x9e/0xe0 593 tasklet_hi_action+0xf8/0x100 592 tasklet_hi_action+0xf8/0x100 594 __do_softirq+0x114/0x2c0 593 __do_softirq+0x114/0x2c0 595 irq_exit+0xa5/0xb0 594 irq_exit+0xa5/0xb0 596 do_IRQ+0x5a/0xf0 595 do_IRQ+0x5a/0xf0 597 ret_from_intr+0x0/0x30 596 ret_from_intr+0x0/0x30 598 } hitcount: 3 bytes_req: 597 } hitcount: 3 bytes_req: 21 bytes_alloc: 24 599 { common_stacktrace: !! 598 { stacktrace: 600 kmem_cache_alloc_trace+0xeb/0x150 599 kmem_cache_alloc_trace+0xeb/0x150 601 aa_alloc_task_context+0x27/0x40 600 aa_alloc_task_context+0x27/0x40 602 apparmor_cred_prepare+0x1f/0x50 601 apparmor_cred_prepare+0x1f/0x50 603 security_prepare_creds+0x16/0x20 602 security_prepare_creds+0x16/0x20 604 prepare_creds+0xdf/0x1a0 603 prepare_creds+0xdf/0x1a0 605 SyS_capset+0xb5/0x200 604 SyS_capset+0xb5/0x200 606 system_call_fastpath+0x12/0x6a 605 system_call_fastpath+0x12/0x6a 607 } hitcount: 1 bytes_req: 606 } hitcount: 1 bytes_req: 32 bytes_alloc: 32 608 . 607 . 609 . 608 . 610 . 609 . 611 { common_stacktrace: !! 610 { stacktrace: 612 __kmalloc+0x11b/0x1b0 611 __kmalloc+0x11b/0x1b0 613 i915_gem_execbuffer2+0x6c/0x2c0 [i915 612 i915_gem_execbuffer2+0x6c/0x2c0 [i915] 614 drm_ioctl+0x349/0x670 [drm] 613 drm_ioctl+0x349/0x670 [drm] 615 do_vfs_ioctl+0x2f0/0x4f0 614 do_vfs_ioctl+0x2f0/0x4f0 616 SyS_ioctl+0x81/0xa0 615 SyS_ioctl+0x81/0xa0 617 system_call_fastpath+0x12/0x6a 616 system_call_fastpath+0x12/0x6a 618 } hitcount: 17726 bytes_req: 13944 617 } hitcount: 17726 bytes_req: 13944120 bytes_alloc: 19593808 619 { common_stacktrace: !! 618 { stacktrace: 620 __kmalloc+0x11b/0x1b0 619 __kmalloc+0x11b/0x1b0 621 load_elf_phdrs+0x76/0xa0 620 load_elf_phdrs+0x76/0xa0 622 load_elf_binary+0x102/0x1650 621 load_elf_binary+0x102/0x1650 623 search_binary_handler+0x97/0x1d0 622 search_binary_handler+0x97/0x1d0 624 do_execveat_common.isra.34+0x551/0x6e 623 do_execveat_common.isra.34+0x551/0x6e0 625 SyS_execve+0x3a/0x50 624 SyS_execve+0x3a/0x50 626 return_from_execve+0x0/0x23 625 return_from_execve+0x0/0x23 627 } hitcount: 33348 bytes_req: 17152 626 } hitcount: 33348 bytes_req: 17152128 bytes_alloc: 20226048 628 { common_stacktrace: !! 627 { stacktrace: 629 kmem_cache_alloc_trace+0xeb/0x150 628 kmem_cache_alloc_trace+0xeb/0x150 630 apparmor_file_alloc_security+0x27/0x4 629 apparmor_file_alloc_security+0x27/0x40 631 security_file_alloc+0x16/0x20 630 security_file_alloc+0x16/0x20 632 get_empty_filp+0x93/0x1c0 631 get_empty_filp+0x93/0x1c0 633 path_openat+0x31/0x5f0 632 path_openat+0x31/0x5f0 634 do_filp_open+0x3a/0x90 633 do_filp_open+0x3a/0x90 635 do_sys_open+0x128/0x220 634 do_sys_open+0x128/0x220 636 SyS_open+0x1e/0x20 635 SyS_open+0x1e/0x20 637 system_call_fastpath+0x12/0x6a 636 system_call_fastpath+0x12/0x6a 638 } hitcount: 4766422 bytes_req: 9532 637 } hitcount: 4766422 bytes_req: 9532844 bytes_alloc: 38131376 639 { common_stacktrace: !! 638 { stacktrace: 640 __kmalloc+0x11b/0x1b0 639 __kmalloc+0x11b/0x1b0 641 seq_buf_alloc+0x1b/0x50 640 seq_buf_alloc+0x1b/0x50 642 seq_read+0x2cc/0x370 641 seq_read+0x2cc/0x370 643 proc_reg_read+0x3d/0x80 642 proc_reg_read+0x3d/0x80 644 __vfs_read+0x28/0xe0 643 __vfs_read+0x28/0xe0 645 vfs_read+0x86/0x140 644 vfs_read+0x86/0x140 646 SyS_read+0x46/0xb0 645 SyS_read+0x46/0xb0 647 system_call_fastpath+0x12/0x6a 646 system_call_fastpath+0x12/0x6a 648 } hitcount: 19133 bytes_req: 78368 647 } hitcount: 19133 bytes_req: 78368768 bytes_alloc: 78368768 649 648 650 Totals: 649 Totals: 651 Hits: 6085872 650 Hits: 6085872 652 Entries: 253 651 Entries: 253 653 Dropped: 0 652 Dropped: 0 654 653 655 If you key a hist trigger on common_pid, in 654 If you key a hist trigger on common_pid, in order for example to 656 gather and display sorted totals for each pr 655 gather and display sorted totals for each process, you can use the 657 special .execname modifier to display the ex 656 special .execname modifier to display the executable names for the 658 processes in the table rather than raw pids. 657 processes in the table rather than raw pids. The example below 659 keeps a per-process sum of total bytes read: 658 keeps a per-process sum of total bytes read:: 660 659 661 # echo 'hist:key=common_pid.execname:val=c 660 # echo 'hist:key=common_pid.execname:val=count:sort=count.descending' > \ 662 /sys/kernel/tracing/events/syscalls !! 661 /sys/kernel/debug/tracing/events/syscalls/sys_enter_read/trigger 663 662 664 # cat /sys/kernel/tracing/events/syscalls/ !! 663 # cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_read/hist 665 # trigger info: hist:keys=common_pid.execn 664 # trigger info: hist:keys=common_pid.execname:vals=count:sort=count.descending:size=2048 [active] 666 665 667 { common_pid: gnome-terminal [ 3196] 666 { common_pid: gnome-terminal [ 3196] } hitcount: 280 count: 1093512 668 { common_pid: Xorg [ 1309] 667 { common_pid: Xorg [ 1309] } hitcount: 525 count: 256640 669 { common_pid: compiz [ 2889] 668 { common_pid: compiz [ 2889] } hitcount: 59 count: 254400 670 { common_pid: bash [ 8710] 669 { common_pid: bash [ 8710] } hitcount: 3 count: 66369 671 { common_pid: dbus-daemon-lau [ 8703] 670 { common_pid: dbus-daemon-lau [ 8703] } hitcount: 49 count: 47739 672 { common_pid: irqbalance [ 1252] 671 { common_pid: irqbalance [ 1252] } hitcount: 27 count: 27648 673 { common_pid: 01ifupdown [ 8705] 672 { common_pid: 01ifupdown [ 8705] } hitcount: 3 count: 17216 674 { common_pid: dbus-daemon [ 772] 673 { common_pid: dbus-daemon [ 772] } hitcount: 10 count: 12396 675 { common_pid: Socket Thread [ 8342] 674 { common_pid: Socket Thread [ 8342] } hitcount: 11 count: 11264 676 { common_pid: nm-dhcp-client. [ 8701] 675 { common_pid: nm-dhcp-client. [ 8701] } hitcount: 6 count: 7424 677 { common_pid: gmain [ 1315] 676 { common_pid: gmain [ 1315] } hitcount: 18 count: 6336 678 . 677 . 679 . 678 . 680 . 679 . 681 { common_pid: postgres [ 1892] 680 { common_pid: postgres [ 1892] } hitcount: 2 count: 32 682 { common_pid: postgres [ 1891] 681 { common_pid: postgres [ 1891] } hitcount: 2 count: 32 683 { common_pid: gmain [ 8704] 682 { common_pid: gmain [ 8704] } hitcount: 2 count: 32 684 { common_pid: upstart-dbus-br [ 2740] 683 { common_pid: upstart-dbus-br [ 2740] } hitcount: 21 count: 21 685 { common_pid: nm-dispatcher.a [ 8696] 684 { common_pid: nm-dispatcher.a [ 8696] } hitcount: 1 count: 16 686 { common_pid: indicator-datet [ 2904] 685 { common_pid: indicator-datet [ 2904] } hitcount: 1 count: 16 687 { common_pid: gdbus [ 2998] 686 { common_pid: gdbus [ 2998] } hitcount: 1 count: 16 688 { common_pid: rtkit-daemon [ 2052] 687 { common_pid: rtkit-daemon [ 2052] } hitcount: 1 count: 8 689 { common_pid: init [ 1] 688 { common_pid: init [ 1] } hitcount: 2 count: 2 690 689 691 Totals: 690 Totals: 692 Hits: 2116 691 Hits: 2116 693 Entries: 51 692 Entries: 51 694 Dropped: 0 693 Dropped: 0 695 694 696 Similarly, if you key a hist trigger on sysc 695 Similarly, if you key a hist trigger on syscall id, for example to 697 gather and display a list of systemwide sysc 696 gather and display a list of systemwide syscall hits, you can use 698 the special .syscall modifier to display the 697 the special .syscall modifier to display the syscall names rather 699 than raw ids. The example below keeps a run 698 than raw ids. The example below keeps a running total of syscall 700 counts for the system during the run:: 699 counts for the system during the run:: 701 700 702 # echo 'hist:key=id.syscall:val=hitcount' 701 # echo 'hist:key=id.syscall:val=hitcount' > \ 703 /sys/kernel/tracing/events/raw_sysc !! 702 /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/trigger 704 703 705 # cat /sys/kernel/tracing/events/raw_sysca !! 704 # cat /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/hist 706 # trigger info: hist:keys=id.syscall:vals= 705 # trigger info: hist:keys=id.syscall:vals=hitcount:sort=hitcount:size=2048 [active] 707 706 708 { id: sys_fsync [ 74] 707 { id: sys_fsync [ 74] } hitcount: 1 709 { id: sys_newuname [ 63] 708 { id: sys_newuname [ 63] } hitcount: 1 710 { id: sys_prctl [157] 709 { id: sys_prctl [157] } hitcount: 1 711 { id: sys_statfs [137] 710 { id: sys_statfs [137] } hitcount: 1 712 { id: sys_symlink [ 88] 711 { id: sys_symlink [ 88] } hitcount: 1 713 { id: sys_sendmmsg [307] 712 { id: sys_sendmmsg [307] } hitcount: 1 714 { id: sys_semctl [ 66] 713 { id: sys_semctl [ 66] } hitcount: 1 715 { id: sys_readlink [ 89] 714 { id: sys_readlink [ 89] } hitcount: 3 716 { id: sys_bind [ 49] 715 { id: sys_bind [ 49] } hitcount: 3 717 { id: sys_getsockname [ 51] 716 { id: sys_getsockname [ 51] } hitcount: 3 718 { id: sys_unlink [ 87] 717 { id: sys_unlink [ 87] } hitcount: 3 719 { id: sys_rename [ 82] 718 { id: sys_rename [ 82] } hitcount: 4 720 { id: unknown_syscall [ 58] 719 { id: unknown_syscall [ 58] } hitcount: 4 721 { id: sys_connect [ 42] 720 { id: sys_connect [ 42] } hitcount: 4 722 { id: sys_getpid [ 39] 721 { id: sys_getpid [ 39] } hitcount: 4 723 . 722 . 724 . 723 . 725 . 724 . 726 { id: sys_rt_sigprocmask [ 14] 725 { id: sys_rt_sigprocmask [ 14] } hitcount: 952 727 { id: sys_futex [202] 726 { id: sys_futex [202] } hitcount: 1534 728 { id: sys_write [ 1] 727 { id: sys_write [ 1] } hitcount: 2689 729 { id: sys_setitimer [ 38] 728 { id: sys_setitimer [ 38] } hitcount: 2797 730 { id: sys_read [ 0] 729 { id: sys_read [ 0] } hitcount: 3202 731 { id: sys_select [ 23] 730 { id: sys_select [ 23] } hitcount: 3773 732 { id: sys_writev [ 20] 731 { id: sys_writev [ 20] } hitcount: 4531 733 { id: sys_poll [ 7] 732 { id: sys_poll [ 7] } hitcount: 8314 734 { id: sys_recvmsg [ 47] 733 { id: sys_recvmsg [ 47] } hitcount: 13738 735 { id: sys_ioctl [ 16] 734 { id: sys_ioctl [ 16] } hitcount: 21843 736 735 737 Totals: 736 Totals: 738 Hits: 67612 737 Hits: 67612 739 Entries: 72 738 Entries: 72 740 Dropped: 0 739 Dropped: 0 741 740 742 The syscall counts above provide a rough ove 741 The syscall counts above provide a rough overall picture of system 743 call activity on the system; we can see for 742 call activity on the system; we can see for example that the most 744 popular system call on this system was the ' 743 popular system call on this system was the 'sys_ioctl' system call. 745 744 746 We can use 'compound' keys to refine that nu 745 We can use 'compound' keys to refine that number and provide some 747 further insight as to which processes exactl 746 further insight as to which processes exactly contribute to the 748 overall ioctl count. 747 overall ioctl count. 749 748 750 The command below keeps a hitcount for every 749 The command below keeps a hitcount for every unique combination of 751 system call id and pid - the end result is e 750 system call id and pid - the end result is essentially a table 752 that keeps a per-pid sum of system call hits 751 that keeps a per-pid sum of system call hits. The results are 753 sorted using the system call id as the prima 752 sorted using the system call id as the primary key, and the 754 hitcount sum as the secondary key:: 753 hitcount sum as the secondary key:: 755 754 756 # echo 'hist:key=id.syscall,common_pid.exe 755 # echo 'hist:key=id.syscall,common_pid.execname:val=hitcount:sort=id,hitcount' > \ 757 /sys/kernel/tracing/events/raw_sysc !! 756 /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/trigger 758 757 759 # cat /sys/kernel/tracing/events/raw_sysca !! 758 # cat /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/hist 760 # trigger info: hist:keys=id.syscall,commo 759 # trigger info: hist:keys=id.syscall,common_pid.execname:vals=hitcount:sort=id.syscall,hitcount:size=2048 [active] 761 760 762 { id: sys_read [ 0], 761 { id: sys_read [ 0], common_pid: rtkit-daemon [ 1877] } hitcount: 1 763 { id: sys_read [ 0], 762 { id: sys_read [ 0], common_pid: gdbus [ 2976] } hitcount: 1 764 { id: sys_read [ 0], 763 { id: sys_read [ 0], common_pid: console-kit-dae [ 3400] } hitcount: 1 765 { id: sys_read [ 0], 764 { id: sys_read [ 0], common_pid: postgres [ 1865] } hitcount: 1 766 { id: sys_read [ 0], 765 { id: sys_read [ 0], common_pid: deja-dup-monito [ 3543] } hitcount: 2 767 { id: sys_read [ 0], 766 { id: sys_read [ 0], common_pid: NetworkManager [ 890] } hitcount: 2 768 { id: sys_read [ 0], 767 { id: sys_read [ 0], common_pid: evolution-calen [ 3048] } hitcount: 2 769 { id: sys_read [ 0], 768 { id: sys_read [ 0], common_pid: postgres [ 1864] } hitcount: 2 770 { id: sys_read [ 0], 769 { id: sys_read [ 0], common_pid: nm-applet [ 3022] } hitcount: 2 771 { id: sys_read [ 0], 770 { id: sys_read [ 0], common_pid: whoopsie [ 1212] } hitcount: 2 772 . 771 . 773 . 772 . 774 . 773 . 775 { id: sys_ioctl [ 16], 774 { id: sys_ioctl [ 16], common_pid: bash [ 8479] } hitcount: 1 776 { id: sys_ioctl [ 16], 775 { id: sys_ioctl [ 16], common_pid: bash [ 3472] } hitcount: 12 777 { id: sys_ioctl [ 16], 776 { id: sys_ioctl [ 16], common_pid: gnome-terminal [ 3199] } hitcount: 16 778 { id: sys_ioctl [ 16], 777 { id: sys_ioctl [ 16], common_pid: Xorg [ 1267] } hitcount: 1808 779 { id: sys_ioctl [ 16], 778 { id: sys_ioctl [ 16], common_pid: compiz [ 2994] } hitcount: 5580 780 . 779 . 781 . 780 . 782 . 781 . 783 { id: sys_waitid [247], 782 { id: sys_waitid [247], common_pid: upstart-dbus-br [ 2690] } hitcount: 3 784 { id: sys_waitid [247], 783 { id: sys_waitid [247], common_pid: upstart-dbus-br [ 2688] } hitcount: 16 785 { id: sys_inotify_add_watch [254], 784 { id: sys_inotify_add_watch [254], common_pid: gmain [ 975] } hitcount: 2 786 { id: sys_inotify_add_watch [254], 785 { id: sys_inotify_add_watch [254], common_pid: gmain [ 3204] } hitcount: 4 787 { id: sys_inotify_add_watch [254], 786 { id: sys_inotify_add_watch [254], common_pid: gmain [ 2888] } hitcount: 4 788 { id: sys_inotify_add_watch [254], 787 { id: sys_inotify_add_watch [254], common_pid: gmain [ 3003] } hitcount: 4 789 { id: sys_inotify_add_watch [254], 788 { id: sys_inotify_add_watch [254], common_pid: gmain [ 2873] } hitcount: 4 790 { id: sys_inotify_add_watch [254], 789 { id: sys_inotify_add_watch [254], common_pid: gmain [ 3196] } hitcount: 6 791 { id: sys_openat [257], 790 { id: sys_openat [257], common_pid: java [ 2623] } hitcount: 2 792 { id: sys_eventfd2 [290], 791 { id: sys_eventfd2 [290], common_pid: ibus-ui-gtk3 [ 2760] } hitcount: 4 793 { id: sys_eventfd2 [290], 792 { id: sys_eventfd2 [290], common_pid: compiz [ 2994] } hitcount: 6 794 793 795 Totals: 794 Totals: 796 Hits: 31536 795 Hits: 31536 797 Entries: 323 796 Entries: 323 798 Dropped: 0 797 Dropped: 0 799 798 800 The above list does give us a breakdown of t 799 The above list does give us a breakdown of the ioctl syscall by 801 pid, but it also gives us quite a bit more t 800 pid, but it also gives us quite a bit more than that, which we 802 don't really care about at the moment. Sinc 801 don't really care about at the moment. Since we know the syscall 803 id for sys_ioctl (16, displayed next to the 802 id for sys_ioctl (16, displayed next to the sys_ioctl name), we 804 can use that to filter out all the other sys 803 can use that to filter out all the other syscalls:: 805 804 806 # echo 'hist:key=id.syscall,common_pid.exe 805 # echo 'hist:key=id.syscall,common_pid.execname:val=hitcount:sort=id,hitcount if id == 16' > \ 807 /sys/kernel/tracing/events/raw_sysc !! 806 /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/trigger 808 807 809 # cat /sys/kernel/tracing/events/raw_sysca !! 808 # cat /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/hist 810 # trigger info: hist:keys=id.syscall,commo 809 # trigger info: hist:keys=id.syscall,common_pid.execname:vals=hitcount:sort=id.syscall,hitcount:size=2048 if id == 16 [active] 811 810 812 { id: sys_ioctl [ 16], 811 { id: sys_ioctl [ 16], common_pid: gmain [ 2769] } hitcount: 1 813 { id: sys_ioctl [ 16], 812 { id: sys_ioctl [ 16], common_pid: evolution-addre [ 8571] } hitcount: 1 814 { id: sys_ioctl [ 16], 813 { id: sys_ioctl [ 16], common_pid: gmain [ 3003] } hitcount: 1 815 { id: sys_ioctl [ 16], 814 { id: sys_ioctl [ 16], common_pid: gmain [ 2781] } hitcount: 1 816 { id: sys_ioctl [ 16], 815 { id: sys_ioctl [ 16], common_pid: gmain [ 2829] } hitcount: 1 817 { id: sys_ioctl [ 16], 816 { id: sys_ioctl [ 16], common_pid: bash [ 8726] } hitcount: 1 818 { id: sys_ioctl [ 16], 817 { id: sys_ioctl [ 16], common_pid: bash [ 8508] } hitcount: 1 819 { id: sys_ioctl [ 16], 818 { id: sys_ioctl [ 16], common_pid: gmain [ 2970] } hitcount: 1 820 { id: sys_ioctl [ 16], 819 { id: sys_ioctl [ 16], common_pid: gmain [ 2768] } hitcount: 1 821 . 820 . 822 . 821 . 823 . 822 . 824 { id: sys_ioctl [ 16], 823 { id: sys_ioctl [ 16], common_pid: pool [ 8559] } hitcount: 45 825 { id: sys_ioctl [ 16], 824 { id: sys_ioctl [ 16], common_pid: pool [ 8555] } hitcount: 48 826 { id: sys_ioctl [ 16], 825 { id: sys_ioctl [ 16], common_pid: pool [ 8551] } hitcount: 48 827 { id: sys_ioctl [ 16], 826 { id: sys_ioctl [ 16], common_pid: avahi-daemon [ 896] } hitcount: 66 828 { id: sys_ioctl [ 16], 827 { id: sys_ioctl [ 16], common_pid: Xorg [ 1267] } hitcount: 26674 829 { id: sys_ioctl [ 16], 828 { id: sys_ioctl [ 16], common_pid: compiz [ 2994] } hitcount: 73443 830 829 831 Totals: 830 Totals: 832 Hits: 101162 831 Hits: 101162 833 Entries: 103 832 Entries: 103 834 Dropped: 0 833 Dropped: 0 835 834 836 The above output shows that 'compiz' and 'Xo 835 The above output shows that 'compiz' and 'Xorg' are far and away 837 the heaviest ioctl callers (which might lead 836 the heaviest ioctl callers (which might lead to questions about 838 whether they really need to be making all th 837 whether they really need to be making all those calls and to 839 possible avenues for further investigation.) 838 possible avenues for further investigation.) 840 839 841 The compound key examples used a key and a s 840 The compound key examples used a key and a sum value (hitcount) to 842 sort the output, but we can just as easily u 841 sort the output, but we can just as easily use two keys instead. 843 Here's an example where we use a compound ke 842 Here's an example where we use a compound key composed of the the 844 common_pid and size event fields. Sorting w 843 common_pid and size event fields. Sorting with pid as the primary 845 key and 'size' as the secondary key allows u 844 key and 'size' as the secondary key allows us to display an 846 ordered summary of the recvfrom sizes, with 845 ordered summary of the recvfrom sizes, with counts, received by 847 each process:: 846 each process:: 848 847 849 # echo 'hist:key=common_pid.execname,size: 848 # echo 'hist:key=common_pid.execname,size:val=hitcount:sort=common_pid,size' > \ 850 /sys/kernel/tracing/events/syscalls !! 849 /sys/kernel/debug/tracing/events/syscalls/sys_enter_recvfrom/trigger 851 850 852 # cat /sys/kernel/tracing/events/syscalls/ !! 851 # cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_recvfrom/hist 853 # trigger info: hist:keys=common_pid.execn 852 # trigger info: hist:keys=common_pid.execname,size:vals=hitcount:sort=common_pid.execname,size:size=2048 [active] 854 853 855 { common_pid: smbd [ 784] 854 { common_pid: smbd [ 784], size: 4 } hitcount: 1 856 { common_pid: dnsmasq [ 1412] 855 { common_pid: dnsmasq [ 1412], size: 4096 } hitcount: 672 857 { common_pid: postgres [ 1796] 856 { common_pid: postgres [ 1796], size: 1000 } hitcount: 6 858 { common_pid: postgres [ 1867] 857 { common_pid: postgres [ 1867], size: 1000 } hitcount: 10 859 { common_pid: bamfdaemon [ 2787] 858 { common_pid: bamfdaemon [ 2787], size: 28 } hitcount: 2 860 { common_pid: bamfdaemon [ 2787] 859 { common_pid: bamfdaemon [ 2787], size: 14360 } hitcount: 1 861 { common_pid: compiz [ 2994] 860 { common_pid: compiz [ 2994], size: 8 } hitcount: 1 862 { common_pid: compiz [ 2994] 861 { common_pid: compiz [ 2994], size: 20 } hitcount: 11 863 { common_pid: gnome-terminal [ 3199] 862 { common_pid: gnome-terminal [ 3199], size: 4 } hitcount: 2 864 { common_pid: firefox [ 8817] 863 { common_pid: firefox [ 8817], size: 4 } hitcount: 1 865 { common_pid: firefox [ 8817] 864 { common_pid: firefox [ 8817], size: 8 } hitcount: 5 866 { common_pid: firefox [ 8817] 865 { common_pid: firefox [ 8817], size: 588 } hitcount: 2 867 { common_pid: firefox [ 8817] 866 { common_pid: firefox [ 8817], size: 628 } hitcount: 1 868 { common_pid: firefox [ 8817] 867 { common_pid: firefox [ 8817], size: 6944 } hitcount: 1 869 { common_pid: firefox [ 8817] 868 { common_pid: firefox [ 8817], size: 408880 } hitcount: 2 870 { common_pid: firefox [ 8822] 869 { common_pid: firefox [ 8822], size: 8 } hitcount: 2 871 { common_pid: firefox [ 8822] 870 { common_pid: firefox [ 8822], size: 160 } hitcount: 2 872 { common_pid: firefox [ 8822] 871 { common_pid: firefox [ 8822], size: 320 } hitcount: 2 873 { common_pid: firefox [ 8822] 872 { common_pid: firefox [ 8822], size: 352 } hitcount: 1 874 . 873 . 875 . 874 . 876 . 875 . 877 { common_pid: pool [ 8923] 876 { common_pid: pool [ 8923], size: 1960 } hitcount: 10 878 { common_pid: pool [ 8923] 877 { common_pid: pool [ 8923], size: 2048 } hitcount: 10 879 { common_pid: pool [ 8924] 878 { common_pid: pool [ 8924], size: 1960 } hitcount: 10 880 { common_pid: pool [ 8924] 879 { common_pid: pool [ 8924], size: 2048 } hitcount: 10 881 { common_pid: pool [ 8928] 880 { common_pid: pool [ 8928], size: 1964 } hitcount: 4 882 { common_pid: pool [ 8928] 881 { common_pid: pool [ 8928], size: 1965 } hitcount: 2 883 { common_pid: pool [ 8928] 882 { common_pid: pool [ 8928], size: 2048 } hitcount: 6 884 { common_pid: pool [ 8929] 883 { common_pid: pool [ 8929], size: 1982 } hitcount: 1 885 { common_pid: pool [ 8929] 884 { common_pid: pool [ 8929], size: 2048 } hitcount: 1 886 885 887 Totals: 886 Totals: 888 Hits: 2016 887 Hits: 2016 889 Entries: 224 888 Entries: 224 890 Dropped: 0 889 Dropped: 0 891 890 892 The above example also illustrates the fact 891 The above example also illustrates the fact that although a compound 893 key is treated as a single entity for hashin 892 key is treated as a single entity for hashing purposes, the sub-keys 894 it's composed of can be accessed independent 893 it's composed of can be accessed independently. 895 894 896 The next example uses a string field as the 895 The next example uses a string field as the hash key and 897 demonstrates how you can manually pause and 896 demonstrates how you can manually pause and continue a hist trigger. 898 In this example, we'll aggregate fork counts 897 In this example, we'll aggregate fork counts and don't expect a 899 large number of entries in the hash table, s 898 large number of entries in the hash table, so we'll drop it to a 900 much smaller number, say 256:: 899 much smaller number, say 256:: 901 900 902 # echo 'hist:key=child_comm:val=hitcount:s 901 # echo 'hist:key=child_comm:val=hitcount:size=256' > \ 903 /sys/kernel/tracing/events/sched/sc !! 902 /sys/kernel/debug/tracing/events/sched/sched_process_fork/trigger 904 903 905 # cat /sys/kernel/tracing/events/sched/sch !! 904 # cat /sys/kernel/debug/tracing/events/sched/sched_process_fork/hist 906 # trigger info: hist:keys=child_comm:vals= 905 # trigger info: hist:keys=child_comm:vals=hitcount:sort=hitcount:size=256 [active] 907 906 908 { child_comm: dconf worker 907 { child_comm: dconf worker } hitcount: 1 909 { child_comm: ibus-daemon 908 { child_comm: ibus-daemon } hitcount: 1 910 { child_comm: whoopsie 909 { child_comm: whoopsie } hitcount: 1 911 { child_comm: smbd 910 { child_comm: smbd } hitcount: 1 912 { child_comm: gdbus 911 { child_comm: gdbus } hitcount: 1 913 { child_comm: kthreadd 912 { child_comm: kthreadd } hitcount: 1 914 { child_comm: dconf worker 913 { child_comm: dconf worker } hitcount: 1 915 { child_comm: evolution-alarm 914 { child_comm: evolution-alarm } hitcount: 2 916 { child_comm: Socket Thread 915 { child_comm: Socket Thread } hitcount: 2 917 { child_comm: postgres 916 { child_comm: postgres } hitcount: 2 918 { child_comm: bash 917 { child_comm: bash } hitcount: 3 919 { child_comm: compiz 918 { child_comm: compiz } hitcount: 3 920 { child_comm: evolution-sourc 919 { child_comm: evolution-sourc } hitcount: 4 921 { child_comm: dhclient 920 { child_comm: dhclient } hitcount: 4 922 { child_comm: pool 921 { child_comm: pool } hitcount: 5 923 { child_comm: nm-dispatcher.a 922 { child_comm: nm-dispatcher.a } hitcount: 8 924 { child_comm: firefox 923 { child_comm: firefox } hitcount: 8 925 { child_comm: dbus-daemon 924 { child_comm: dbus-daemon } hitcount: 8 926 { child_comm: glib-pacrunner 925 { child_comm: glib-pacrunner } hitcount: 10 927 { child_comm: evolution 926 { child_comm: evolution } hitcount: 23 928 927 929 Totals: 928 Totals: 930 Hits: 89 929 Hits: 89 931 Entries: 20 930 Entries: 20 932 Dropped: 0 931 Dropped: 0 933 932 934 If we want to pause the hist trigger, we can 933 If we want to pause the hist trigger, we can simply append :pause to 935 the command that started the trigger. Notic 934 the command that started the trigger. Notice that the trigger info 936 displays as [paused]:: 935 displays as [paused]:: 937 936 938 # echo 'hist:key=child_comm:val=hitcount:s 937 # echo 'hist:key=child_comm:val=hitcount:size=256:pause' >> \ 939 /sys/kernel/tracing/events/sched/sc !! 938 /sys/kernel/debug/tracing/events/sched/sched_process_fork/trigger 940 939 941 # cat /sys/kernel/tracing/events/sched/sch !! 940 # cat /sys/kernel/debug/tracing/events/sched/sched_process_fork/hist 942 # trigger info: hist:keys=child_comm:vals= 941 # trigger info: hist:keys=child_comm:vals=hitcount:sort=hitcount:size=256 [paused] 943 942 944 { child_comm: dconf worker 943 { child_comm: dconf worker } hitcount: 1 945 { child_comm: kthreadd 944 { child_comm: kthreadd } hitcount: 1 946 { child_comm: dconf worker 945 { child_comm: dconf worker } hitcount: 1 947 { child_comm: gdbus 946 { child_comm: gdbus } hitcount: 1 948 { child_comm: ibus-daemon 947 { child_comm: ibus-daemon } hitcount: 1 949 { child_comm: Socket Thread 948 { child_comm: Socket Thread } hitcount: 2 950 { child_comm: evolution-alarm 949 { child_comm: evolution-alarm } hitcount: 2 951 { child_comm: smbd 950 { child_comm: smbd } hitcount: 2 952 { child_comm: bash 951 { child_comm: bash } hitcount: 3 953 { child_comm: whoopsie 952 { child_comm: whoopsie } hitcount: 3 954 { child_comm: compiz 953 { child_comm: compiz } hitcount: 3 955 { child_comm: evolution-sourc 954 { child_comm: evolution-sourc } hitcount: 4 956 { child_comm: pool 955 { child_comm: pool } hitcount: 5 957 { child_comm: postgres 956 { child_comm: postgres } hitcount: 6 958 { child_comm: firefox 957 { child_comm: firefox } hitcount: 8 959 { child_comm: dhclient 958 { child_comm: dhclient } hitcount: 10 960 { child_comm: emacs 959 { child_comm: emacs } hitcount: 12 961 { child_comm: dbus-daemon 960 { child_comm: dbus-daemon } hitcount: 20 962 { child_comm: nm-dispatcher.a 961 { child_comm: nm-dispatcher.a } hitcount: 20 963 { child_comm: evolution 962 { child_comm: evolution } hitcount: 35 964 { child_comm: glib-pacrunner 963 { child_comm: glib-pacrunner } hitcount: 59 965 964 966 Totals: 965 Totals: 967 Hits: 199 966 Hits: 199 968 Entries: 21 967 Entries: 21 969 Dropped: 0 968 Dropped: 0 970 969 971 To manually continue having the trigger aggr 970 To manually continue having the trigger aggregate events, append 972 :cont instead. Notice that the trigger info 971 :cont instead. Notice that the trigger info displays as [active] 973 again, and the data has changed:: 972 again, and the data has changed:: 974 973 975 # echo 'hist:key=child_comm:val=hitcount:s 974 # echo 'hist:key=child_comm:val=hitcount:size=256:cont' >> \ 976 /sys/kernel/tracing/events/sched/sc !! 975 /sys/kernel/debug/tracing/events/sched/sched_process_fork/trigger 977 976 978 # cat /sys/kernel/tracing/events/sched/sch !! 977 # cat /sys/kernel/debug/tracing/events/sched/sched_process_fork/hist 979 # trigger info: hist:keys=child_comm:vals= 978 # trigger info: hist:keys=child_comm:vals=hitcount:sort=hitcount:size=256 [active] 980 979 981 { child_comm: dconf worker 980 { child_comm: dconf worker } hitcount: 1 982 { child_comm: dconf worker 981 { child_comm: dconf worker } hitcount: 1 983 { child_comm: kthreadd 982 { child_comm: kthreadd } hitcount: 1 984 { child_comm: gdbus 983 { child_comm: gdbus } hitcount: 1 985 { child_comm: ibus-daemon 984 { child_comm: ibus-daemon } hitcount: 1 986 { child_comm: Socket Thread 985 { child_comm: Socket Thread } hitcount: 2 987 { child_comm: evolution-alarm 986 { child_comm: evolution-alarm } hitcount: 2 988 { child_comm: smbd 987 { child_comm: smbd } hitcount: 2 989 { child_comm: whoopsie 988 { child_comm: whoopsie } hitcount: 3 990 { child_comm: compiz 989 { child_comm: compiz } hitcount: 3 991 { child_comm: evolution-sourc 990 { child_comm: evolution-sourc } hitcount: 4 992 { child_comm: bash 991 { child_comm: bash } hitcount: 5 993 { child_comm: pool 992 { child_comm: pool } hitcount: 5 994 { child_comm: postgres 993 { child_comm: postgres } hitcount: 6 995 { child_comm: firefox 994 { child_comm: firefox } hitcount: 8 996 { child_comm: dhclient 995 { child_comm: dhclient } hitcount: 11 997 { child_comm: emacs 996 { child_comm: emacs } hitcount: 12 998 { child_comm: dbus-daemon 997 { child_comm: dbus-daemon } hitcount: 22 999 { child_comm: nm-dispatcher.a 998 { child_comm: nm-dispatcher.a } hitcount: 22 1000 { child_comm: evolution 999 { child_comm: evolution } hitcount: 35 1001 { child_comm: glib-pacrunner 1000 { child_comm: glib-pacrunner } hitcount: 59 1002 1001 1003 Totals: 1002 Totals: 1004 Hits: 206 1003 Hits: 206 1005 Entries: 21 1004 Entries: 21 1006 Dropped: 0 1005 Dropped: 0 1007 1006 1008 The previous example showed how to start an 1007 The previous example showed how to start and stop a hist trigger by 1009 appending 'pause' and 'continue' to the his 1008 appending 'pause' and 'continue' to the hist trigger command. A 1010 hist trigger can also be started in a pause 1009 hist trigger can also be started in a paused state by initially 1011 starting the trigger with ':pause' appended 1010 starting the trigger with ':pause' appended. This allows you to 1012 start the trigger only when you're ready to 1011 start the trigger only when you're ready to start collecting data 1013 and not before. For example, you could sta 1012 and not before. For example, you could start the trigger in a 1014 paused state, then unpause it and do someth 1013 paused state, then unpause it and do something you want to measure, 1015 then pause the trigger again when done. 1014 then pause the trigger again when done. 1016 1015 1017 Of course, doing this manually can be diffi 1016 Of course, doing this manually can be difficult and error-prone, but 1018 it is possible to automatically start and s 1017 it is possible to automatically start and stop a hist trigger based 1019 on some condition, via the enable_hist and 1018 on some condition, via the enable_hist and disable_hist triggers. 1020 1019 1021 For example, suppose we wanted to take a lo 1020 For example, suppose we wanted to take a look at the relative 1022 weights in terms of skb length for each cal 1021 weights in terms of skb length for each callpath that leads to a 1023 netif_receive_skb event when downloading a 1022 netif_receive_skb event when downloading a decent-sized file using 1024 wget. 1023 wget. 1025 1024 1026 First we set up an initially paused stacktr 1025 First we set up an initially paused stacktrace trigger on the 1027 netif_receive_skb event:: 1026 netif_receive_skb event:: 1028 1027 1029 # echo 'hist:key=common_stacktrace:vals=l !! 1028 # echo 'hist:key=stacktrace:vals=len:pause' > \ 1030 /sys/kernel/tracing/events/net/net !! 1029 /sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger 1031 1030 1032 Next, we set up an 'enable_hist' trigger on 1031 Next, we set up an 'enable_hist' trigger on the sched_process_exec 1033 event, with an 'if filename==/usr/bin/wget' 1032 event, with an 'if filename==/usr/bin/wget' filter. The effect of 1034 this new trigger is that it will 'unpause' 1033 this new trigger is that it will 'unpause' the hist trigger we just 1035 set up on netif_receive_skb if and only if 1034 set up on netif_receive_skb if and only if it sees a 1036 sched_process_exec event with a filename of 1035 sched_process_exec event with a filename of '/usr/bin/wget'. When 1037 that happens, all netif_receive_skb events 1036 that happens, all netif_receive_skb events are aggregated into a 1038 hash table keyed on stacktrace:: 1037 hash table keyed on stacktrace:: 1039 1038 1040 # echo 'enable_hist:net:netif_receive_skb 1039 # echo 'enable_hist:net:netif_receive_skb if filename==/usr/bin/wget' > \ 1041 /sys/kernel/tracing/events/sched/s !! 1040 /sys/kernel/debug/tracing/events/sched/sched_process_exec/trigger 1042 1041 1043 The aggregation continues until the netif_r 1042 The aggregation continues until the netif_receive_skb is paused 1044 again, which is what the following disable_ 1043 again, which is what the following disable_hist event does by 1045 creating a similar setup on the sched_proce 1044 creating a similar setup on the sched_process_exit event, using the 1046 filter 'comm==wget':: 1045 filter 'comm==wget':: 1047 1046 1048 # echo 'disable_hist:net:netif_receive_sk 1047 # echo 'disable_hist:net:netif_receive_skb if comm==wget' > \ 1049 /sys/kernel/tracing/events/sched/s !! 1048 /sys/kernel/debug/tracing/events/sched/sched_process_exit/trigger 1050 1049 1051 Whenever a process exits and the comm field 1050 Whenever a process exits and the comm field of the disable_hist 1052 trigger filter matches 'comm==wget', the ne 1051 trigger filter matches 'comm==wget', the netif_receive_skb hist 1053 trigger is disabled. 1052 trigger is disabled. 1054 1053 1055 The overall effect is that netif_receive_sk 1054 The overall effect is that netif_receive_skb events are aggregated 1056 into the hash table for only the duration o 1055 into the hash table for only the duration of the wget. Executing a 1057 wget command and then listing the 'hist' fi 1056 wget command and then listing the 'hist' file will display the 1058 output generated by the wget command:: 1057 output generated by the wget command:: 1059 1058 1060 $ wget https://www.kernel.org/pub/linux/k 1059 $ wget https://www.kernel.org/pub/linux/kernel/v3.x/patch-3.19.xz 1061 1060 1062 # cat /sys/kernel/tracing/events/net/neti !! 1061 # cat /sys/kernel/debug/tracing/events/net/netif_receive_skb/hist 1063 # trigger info: hist:keys=common_stacktra !! 1062 # trigger info: hist:keys=stacktrace:vals=len:sort=hitcount:size=2048 [paused] 1064 1063 1065 { common_stacktrace: !! 1064 { stacktrace: 1066 __netif_receive_skb_core+0x46d/0x990 1065 __netif_receive_skb_core+0x46d/0x990 1067 __netif_receive_skb+0x18/0x60 1066 __netif_receive_skb+0x18/0x60 1068 netif_receive_skb_internal+0x23/0x90 1067 netif_receive_skb_internal+0x23/0x90 1069 napi_gro_receive+0xc8/0x100 1068 napi_gro_receive+0xc8/0x100 1070 ieee80211_deliver_skb+0xd6/0x270 [ma 1069 ieee80211_deliver_skb+0xd6/0x270 [mac80211] 1071 ieee80211_rx_handlers+0xccf/0x22f0 [ 1070 ieee80211_rx_handlers+0xccf/0x22f0 [mac80211] 1072 ieee80211_prepare_and_rx_handle+0x4e 1071 ieee80211_prepare_and_rx_handle+0x4e7/0xc40 [mac80211] 1073 ieee80211_rx+0x31d/0x900 [mac80211] 1072 ieee80211_rx+0x31d/0x900 [mac80211] 1074 iwlagn_rx_reply_rx+0x3db/0x6f0 [iwld 1073 iwlagn_rx_reply_rx+0x3db/0x6f0 [iwldvm] 1075 iwl_rx_dispatch+0x8e/0xf0 [iwldvm] 1074 iwl_rx_dispatch+0x8e/0xf0 [iwldvm] 1076 iwl_pcie_irq_handler+0xe3c/0x12f0 [i 1075 iwl_pcie_irq_handler+0xe3c/0x12f0 [iwlwifi] 1077 irq_thread_fn+0x20/0x50 1076 irq_thread_fn+0x20/0x50 1078 irq_thread+0x11f/0x150 1077 irq_thread+0x11f/0x150 1079 kthread+0xd2/0xf0 1078 kthread+0xd2/0xf0 1080 ret_from_fork+0x42/0x70 1079 ret_from_fork+0x42/0x70 1081 } hitcount: 85 len: 28884 1080 } hitcount: 85 len: 28884 1082 { common_stacktrace: !! 1081 { stacktrace: 1083 __netif_receive_skb_core+0x46d/0x990 1082 __netif_receive_skb_core+0x46d/0x990 1084 __netif_receive_skb+0x18/0x60 1083 __netif_receive_skb+0x18/0x60 1085 netif_receive_skb_internal+0x23/0x90 1084 netif_receive_skb_internal+0x23/0x90 1086 napi_gro_complete+0xa4/0xe0 1085 napi_gro_complete+0xa4/0xe0 1087 dev_gro_receive+0x23a/0x360 1086 dev_gro_receive+0x23a/0x360 1088 napi_gro_receive+0x30/0x100 1087 napi_gro_receive+0x30/0x100 1089 ieee80211_deliver_skb+0xd6/0x270 [ma 1088 ieee80211_deliver_skb+0xd6/0x270 [mac80211] 1090 ieee80211_rx_handlers+0xccf/0x22f0 [ 1089 ieee80211_rx_handlers+0xccf/0x22f0 [mac80211] 1091 ieee80211_prepare_and_rx_handle+0x4e 1090 ieee80211_prepare_and_rx_handle+0x4e7/0xc40 [mac80211] 1092 ieee80211_rx+0x31d/0x900 [mac80211] 1091 ieee80211_rx+0x31d/0x900 [mac80211] 1093 iwlagn_rx_reply_rx+0x3db/0x6f0 [iwld 1092 iwlagn_rx_reply_rx+0x3db/0x6f0 [iwldvm] 1094 iwl_rx_dispatch+0x8e/0xf0 [iwldvm] 1093 iwl_rx_dispatch+0x8e/0xf0 [iwldvm] 1095 iwl_pcie_irq_handler+0xe3c/0x12f0 [i 1094 iwl_pcie_irq_handler+0xe3c/0x12f0 [iwlwifi] 1096 irq_thread_fn+0x20/0x50 1095 irq_thread_fn+0x20/0x50 1097 irq_thread+0x11f/0x150 1096 irq_thread+0x11f/0x150 1098 kthread+0xd2/0xf0 1097 kthread+0xd2/0xf0 1099 } hitcount: 98 len: 664329 1098 } hitcount: 98 len: 664329 1100 { common_stacktrace: !! 1099 { stacktrace: 1101 __netif_receive_skb_core+0x46d/0x990 1100 __netif_receive_skb_core+0x46d/0x990 1102 __netif_receive_skb+0x18/0x60 1101 __netif_receive_skb+0x18/0x60 1103 process_backlog+0xa8/0x150 1102 process_backlog+0xa8/0x150 1104 net_rx_action+0x15d/0x340 1103 net_rx_action+0x15d/0x340 1105 __do_softirq+0x114/0x2c0 1104 __do_softirq+0x114/0x2c0 1106 do_softirq_own_stack+0x1c/0x30 1105 do_softirq_own_stack+0x1c/0x30 1107 do_softirq+0x65/0x70 1106 do_softirq+0x65/0x70 1108 __local_bh_enable_ip+0xb5/0xc0 1107 __local_bh_enable_ip+0xb5/0xc0 1109 ip_finish_output+0x1f4/0x840 1108 ip_finish_output+0x1f4/0x840 1110 ip_output+0x6b/0xc0 1109 ip_output+0x6b/0xc0 1111 ip_local_out_sk+0x31/0x40 1110 ip_local_out_sk+0x31/0x40 1112 ip_send_skb+0x1a/0x50 1111 ip_send_skb+0x1a/0x50 1113 udp_send_skb+0x173/0x2a0 1112 udp_send_skb+0x173/0x2a0 1114 udp_sendmsg+0x2bf/0x9f0 1113 udp_sendmsg+0x2bf/0x9f0 1115 inet_sendmsg+0x64/0xa0 1114 inet_sendmsg+0x64/0xa0 1116 sock_sendmsg+0x3d/0x50 1115 sock_sendmsg+0x3d/0x50 1117 } hitcount: 115 len: 13030 1116 } hitcount: 115 len: 13030 1118 { common_stacktrace: !! 1117 { stacktrace: 1119 __netif_receive_skb_core+0x46d/0x990 1118 __netif_receive_skb_core+0x46d/0x990 1120 __netif_receive_skb+0x18/0x60 1119 __netif_receive_skb+0x18/0x60 1121 netif_receive_skb_internal+0x23/0x90 1120 netif_receive_skb_internal+0x23/0x90 1122 napi_gro_complete+0xa4/0xe0 1121 napi_gro_complete+0xa4/0xe0 1123 napi_gro_flush+0x6d/0x90 1122 napi_gro_flush+0x6d/0x90 1124 iwl_pcie_irq_handler+0x92a/0x12f0 [i 1123 iwl_pcie_irq_handler+0x92a/0x12f0 [iwlwifi] 1125 irq_thread_fn+0x20/0x50 1124 irq_thread_fn+0x20/0x50 1126 irq_thread+0x11f/0x150 1125 irq_thread+0x11f/0x150 1127 kthread+0xd2/0xf0 1126 kthread+0xd2/0xf0 1128 ret_from_fork+0x42/0x70 1127 ret_from_fork+0x42/0x70 1129 } hitcount: 934 len: 5512212 1128 } hitcount: 934 len: 5512212 1130 1129 1131 Totals: 1130 Totals: 1132 Hits: 1232 1131 Hits: 1232 1133 Entries: 4 1132 Entries: 4 1134 Dropped: 0 1133 Dropped: 0 1135 1134 1136 The above shows all the netif_receive_skb c 1135 The above shows all the netif_receive_skb callpaths and their total 1137 lengths for the duration of the wget comman 1136 lengths for the duration of the wget command. 1138 1137 1139 The 'clear' hist trigger param can be used 1138 The 'clear' hist trigger param can be used to clear the hash table. 1140 Suppose we wanted to try another run of the 1139 Suppose we wanted to try another run of the previous example but 1141 this time also wanted to see the complete l 1140 this time also wanted to see the complete list of events that went 1142 into the histogram. In order to avoid havi 1141 into the histogram. In order to avoid having to set everything up 1143 again, we can just clear the histogram firs 1142 again, we can just clear the histogram first:: 1144 1143 1145 # echo 'hist:key=common_stacktrace:vals=l !! 1144 # echo 'hist:key=stacktrace:vals=len:clear' >> \ 1146 /sys/kernel/tracing/events/net/net !! 1145 /sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger 1147 1146 1148 Just to verify that it is in fact cleared, 1147 Just to verify that it is in fact cleared, here's what we now see in 1149 the hist file:: 1148 the hist file:: 1150 1149 1151 # cat /sys/kernel/tracing/events/net/neti !! 1150 # cat /sys/kernel/debug/tracing/events/net/netif_receive_skb/hist 1152 # trigger info: hist:keys=common_stacktra !! 1151 # trigger info: hist:keys=stacktrace:vals=len:sort=hitcount:size=2048 [paused] 1153 1152 1154 Totals: 1153 Totals: 1155 Hits: 0 1154 Hits: 0 1156 Entries: 0 1155 Entries: 0 1157 Dropped: 0 1156 Dropped: 0 1158 1157 1159 Since we want to see the detailed list of e 1158 Since we want to see the detailed list of every netif_receive_skb 1160 event occurring during the new run, which a 1159 event occurring during the new run, which are in fact the same 1161 events being aggregated into the hash table 1160 events being aggregated into the hash table, we add some additional 1162 'enable_event' events to the triggering sch 1161 'enable_event' events to the triggering sched_process_exec and 1163 sched_process_exit events as such:: 1162 sched_process_exit events as such:: 1164 1163 1165 # echo 'enable_event:net:netif_receive_sk 1164 # echo 'enable_event:net:netif_receive_skb if filename==/usr/bin/wget' > \ 1166 /sys/kernel/tracing/events/sched/s !! 1165 /sys/kernel/debug/tracing/events/sched/sched_process_exec/trigger 1167 1166 1168 # echo 'disable_event:net:netif_receive_s 1167 # echo 'disable_event:net:netif_receive_skb if comm==wget' > \ 1169 /sys/kernel/tracing/events/sched/s !! 1168 /sys/kernel/debug/tracing/events/sched/sched_process_exit/trigger 1170 1169 1171 If you read the trigger files for the sched 1170 If you read the trigger files for the sched_process_exec and 1172 sched_process_exit triggers, you should see 1171 sched_process_exit triggers, you should see two triggers for each: 1173 one enabling/disabling the hist aggregation 1172 one enabling/disabling the hist aggregation and the other 1174 enabling/disabling the logging of events:: 1173 enabling/disabling the logging of events:: 1175 1174 1176 # cat /sys/kernel/tracing/events/sched/sc !! 1175 # cat /sys/kernel/debug/tracing/events/sched/sched_process_exec/trigger 1177 enable_event:net:netif_receive_skb:unlimi 1176 enable_event:net:netif_receive_skb:unlimited if filename==/usr/bin/wget 1178 enable_hist:net:netif_receive_skb:unlimit 1177 enable_hist:net:netif_receive_skb:unlimited if filename==/usr/bin/wget 1179 1178 1180 # cat /sys/kernel/tracing/events/sched/sc !! 1179 # cat /sys/kernel/debug/tracing/events/sched/sched_process_exit/trigger 1181 enable_event:net:netif_receive_skb:unlimi 1180 enable_event:net:netif_receive_skb:unlimited if comm==wget 1182 disable_hist:net:netif_receive_skb:unlimi 1181 disable_hist:net:netif_receive_skb:unlimited if comm==wget 1183 1182 1184 In other words, whenever either of the sche 1183 In other words, whenever either of the sched_process_exec or 1185 sched_process_exit events is hit and matche 1184 sched_process_exit events is hit and matches 'wget', it enables or 1186 disables both the histogram and the event l 1185 disables both the histogram and the event log, and what you end up 1187 with is a hash table and set of events just 1186 with is a hash table and set of events just covering the specified 1188 duration. Run the wget command again:: 1187 duration. Run the wget command again:: 1189 1188 1190 $ wget https://www.kernel.org/pub/linux/k 1189 $ wget https://www.kernel.org/pub/linux/kernel/v3.x/patch-3.19.xz 1191 1190 1192 Displaying the 'hist' file should show some 1191 Displaying the 'hist' file should show something similar to what you 1193 saw in the last run, but this time you shou 1192 saw in the last run, but this time you should also see the 1194 individual events in the trace file:: 1193 individual events in the trace file:: 1195 1194 1196 # cat /sys/kernel/tracing/trace !! 1195 # cat /sys/kernel/debug/tracing/trace 1197 1196 1198 # tracer: nop 1197 # tracer: nop 1199 # 1198 # 1200 # entries-in-buffer/entries-written: 183/ 1199 # entries-in-buffer/entries-written: 183/1426 #P:4 1201 # 1200 # 1202 # _-----=> i 1201 # _-----=> irqs-off 1203 # / _----=> n 1202 # / _----=> need-resched 1204 # | / _---=> h 1203 # | / _---=> hardirq/softirq 1205 # || / _--=> p 1204 # || / _--=> preempt-depth 1206 # ||| / de 1205 # ||| / delay 1207 # TASK-PID CPU# |||| TIME 1206 # TASK-PID CPU# |||| TIMESTAMP FUNCTION 1208 # | | | |||| | 1207 # | | | |||| | | 1209 wget-15108 [000] ..s1 31769.6 1208 wget-15108 [000] ..s1 31769.606929: netif_receive_skb: dev=lo skbaddr=ffff88009c353100 len=60 1210 wget-15108 [000] ..s1 31769.6 1209 wget-15108 [000] ..s1 31769.606999: netif_receive_skb: dev=lo skbaddr=ffff88009c353200 len=60 1211 dnsmasq-1382 [000] ..s1 31769.6 1210 dnsmasq-1382 [000] ..s1 31769.677652: netif_receive_skb: dev=lo skbaddr=ffff88009c352b00 len=130 1212 dnsmasq-1382 [000] ..s1 31769.6 1211 dnsmasq-1382 [000] ..s1 31769.685917: netif_receive_skb: dev=lo skbaddr=ffff88009c352200 len=138 1213 ##### CPU 2 buffer started #### 1212 ##### CPU 2 buffer started #### 1214 irq/29-iwlwifi-559 [002] ..s. 31772.0 1213 irq/29-iwlwifi-559 [002] ..s. 31772.031529: netif_receive_skb: dev=wlan0 skbaddr=ffff88009d433d00 len=2948 1215 irq/29-iwlwifi-559 [002] ..s. 31772.0 1214 irq/29-iwlwifi-559 [002] ..s. 31772.031572: netif_receive_skb: dev=wlan0 skbaddr=ffff88009d432200 len=1500 1216 irq/29-iwlwifi-559 [002] ..s. 31772.0 1215 irq/29-iwlwifi-559 [002] ..s. 31772.032196: netif_receive_skb: dev=wlan0 skbaddr=ffff88009d433100 len=2948 1217 irq/29-iwlwifi-559 [002] ..s. 31772.0 1216 irq/29-iwlwifi-559 [002] ..s. 31772.032761: netif_receive_skb: dev=wlan0 skbaddr=ffff88009d433000 len=2948 1218 irq/29-iwlwifi-559 [002] ..s. 31772.0 1217 irq/29-iwlwifi-559 [002] ..s. 31772.033220: netif_receive_skb: dev=wlan0 skbaddr=ffff88009d432e00 len=1500 1219 . 1218 . 1220 . 1219 . 1221 . 1220 . 1222 1221 1223 The following example demonstrates how mult 1222 The following example demonstrates how multiple hist triggers can be 1224 attached to a given event. This capability 1223 attached to a given event. This capability can be useful for 1225 creating a set of different summaries deriv 1224 creating a set of different summaries derived from the same set of 1226 events, or for comparing the effects of dif 1225 events, or for comparing the effects of different filters, among 1227 other things:: 1226 other things:: 1228 1227 1229 # echo 'hist:keys=skbaddr.hex:vals=len if 1228 # echo 'hist:keys=skbaddr.hex:vals=len if len < 0' >> \ 1230 /sys/kernel/tracing/events/net/net !! 1229 /sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger 1231 # echo 'hist:keys=skbaddr.hex:vals=len if 1230 # echo 'hist:keys=skbaddr.hex:vals=len if len > 4096' >> \ 1232 /sys/kernel/tracing/events/net/net !! 1231 /sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger 1233 # echo 'hist:keys=skbaddr.hex:vals=len if 1232 # echo 'hist:keys=skbaddr.hex:vals=len if len == 256' >> \ 1234 /sys/kernel/tracing/events/net/net !! 1233 /sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger 1235 # echo 'hist:keys=skbaddr.hex:vals=len' > 1234 # echo 'hist:keys=skbaddr.hex:vals=len' >> \ 1236 /sys/kernel/tracing/events/net/net !! 1235 /sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger 1237 # echo 'hist:keys=len:vals=common_preempt 1236 # echo 'hist:keys=len:vals=common_preempt_count' >> \ 1238 /sys/kernel/tracing/events/net/net !! 1237 /sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger 1239 1238 1240 The above set of commands create four trigg 1239 The above set of commands create four triggers differing only in 1241 their filters, along with a completely diff 1240 their filters, along with a completely different though fairly 1242 nonsensical trigger. Note that in order to 1241 nonsensical trigger. Note that in order to append multiple hist 1243 triggers to the same file, you should use t 1242 triggers to the same file, you should use the '>>' operator to 1244 append them ('>' will also add the new hist 1243 append them ('>' will also add the new hist trigger, but will remove 1245 any existing hist triggers beforehand). 1244 any existing hist triggers beforehand). 1246 1245 1247 Displaying the contents of the 'hist' file 1246 Displaying the contents of the 'hist' file for the event shows the 1248 contents of all five histograms:: 1247 contents of all five histograms:: 1249 1248 1250 # cat /sys/kernel/tracing/events/net/neti !! 1249 # cat /sys/kernel/debug/tracing/events/net/netif_receive_skb/hist 1251 1250 1252 # event histogram 1251 # event histogram 1253 # 1252 # 1254 # trigger info: hist:keys=len:vals=hitcou 1253 # trigger info: hist:keys=len:vals=hitcount,common_preempt_count:sort=hitcount:size=2048 [active] 1255 # 1254 # 1256 1255 1257 { len: 176 } hitcount: 1 1256 { len: 176 } hitcount: 1 common_preempt_count: 0 1258 { len: 223 } hitcount: 1 1257 { len: 223 } hitcount: 1 common_preempt_count: 0 1259 { len: 4854 } hitcount: 1 1258 { len: 4854 } hitcount: 1 common_preempt_count: 0 1260 { len: 395 } hitcount: 1 1259 { len: 395 } hitcount: 1 common_preempt_count: 0 1261 { len: 177 } hitcount: 1 1260 { len: 177 } hitcount: 1 common_preempt_count: 0 1262 { len: 446 } hitcount: 1 1261 { len: 446 } hitcount: 1 common_preempt_count: 0 1263 { len: 1601 } hitcount: 1 1262 { len: 1601 } hitcount: 1 common_preempt_count: 0 1264 . 1263 . 1265 . 1264 . 1266 . 1265 . 1267 { len: 1280 } hitcount: 66 1266 { len: 1280 } hitcount: 66 common_preempt_count: 0 1268 { len: 116 } hitcount: 81 1267 { len: 116 } hitcount: 81 common_preempt_count: 40 1269 { len: 708 } hitcount: 112 1268 { len: 708 } hitcount: 112 common_preempt_count: 0 1270 { len: 46 } hitcount: 221 1269 { len: 46 } hitcount: 221 common_preempt_count: 0 1271 { len: 1264 } hitcount: 458 1270 { len: 1264 } hitcount: 458 common_preempt_count: 0 1272 1271 1273 Totals: 1272 Totals: 1274 Hits: 1428 1273 Hits: 1428 1275 Entries: 147 1274 Entries: 147 1276 Dropped: 0 1275 Dropped: 0 1277 1276 1278 1277 1279 # event histogram 1278 # event histogram 1280 # 1279 # 1281 # trigger info: hist:keys=skbaddr.hex:val 1280 # trigger info: hist:keys=skbaddr.hex:vals=hitcount,len:sort=hitcount:size=2048 [active] 1282 # 1281 # 1283 1282 1284 { skbaddr: ffff8800baee5e00 } hitcount: 1283 { skbaddr: ffff8800baee5e00 } hitcount: 1 len: 130 1285 { skbaddr: ffff88005f3d5600 } hitcount: 1284 { skbaddr: ffff88005f3d5600 } hitcount: 1 len: 1280 1286 { skbaddr: ffff88005f3d4900 } hitcount: 1285 { skbaddr: ffff88005f3d4900 } hitcount: 1 len: 1280 1287 { skbaddr: ffff88009fed6300 } hitcount: 1286 { skbaddr: ffff88009fed6300 } hitcount: 1 len: 115 1288 { skbaddr: ffff88009fe0ad00 } hitcount: 1287 { skbaddr: ffff88009fe0ad00 } hitcount: 1 len: 115 1289 { skbaddr: ffff88008cdb1900 } hitcount: 1288 { skbaddr: ffff88008cdb1900 } hitcount: 1 len: 46 1290 { skbaddr: ffff880064b5ef00 } hitcount: 1289 { skbaddr: ffff880064b5ef00 } hitcount: 1 len: 118 1291 { skbaddr: ffff880044e3c700 } hitcount: 1290 { skbaddr: ffff880044e3c700 } hitcount: 1 len: 60 1292 { skbaddr: ffff880100065900 } hitcount: 1291 { skbaddr: ffff880100065900 } hitcount: 1 len: 46 1293 { skbaddr: ffff8800d46bd500 } hitcount: 1292 { skbaddr: ffff8800d46bd500 } hitcount: 1 len: 116 1294 { skbaddr: ffff88005f3d5f00 } hitcount: 1293 { skbaddr: ffff88005f3d5f00 } hitcount: 1 len: 1280 1295 { skbaddr: ffff880100064700 } hitcount: 1294 { skbaddr: ffff880100064700 } hitcount: 1 len: 365 1296 { skbaddr: ffff8800badb6f00 } hitcount: 1295 { skbaddr: ffff8800badb6f00 } hitcount: 1 len: 60 1297 . 1296 . 1298 . 1297 . 1299 . 1298 . 1300 { skbaddr: ffff88009fe0be00 } hitcount: 1299 { skbaddr: ffff88009fe0be00 } hitcount: 27 len: 24677 1301 { skbaddr: ffff88009fe0a400 } hitcount: 1300 { skbaddr: ffff88009fe0a400 } hitcount: 27 len: 23052 1302 { skbaddr: ffff88009fe0b700 } hitcount: 1301 { skbaddr: ffff88009fe0b700 } hitcount: 31 len: 25589 1303 { skbaddr: ffff88009fe0b600 } hitcount: 1302 { skbaddr: ffff88009fe0b600 } hitcount: 32 len: 27326 1304 { skbaddr: ffff88006a462800 } hitcount: 1303 { skbaddr: ffff88006a462800 } hitcount: 68 len: 71678 1305 { skbaddr: ffff88006a463700 } hitcount: 1304 { skbaddr: ffff88006a463700 } hitcount: 70 len: 72678 1306 { skbaddr: ffff88006a462b00 } hitcount: 1305 { skbaddr: ffff88006a462b00 } hitcount: 71 len: 77589 1307 { skbaddr: ffff88006a463600 } hitcount: 1306 { skbaddr: ffff88006a463600 } hitcount: 73 len: 71307 1308 { skbaddr: ffff88006a462200 } hitcount: 1307 { skbaddr: ffff88006a462200 } hitcount: 81 len: 81032 1309 1308 1310 Totals: 1309 Totals: 1311 Hits: 1451 1310 Hits: 1451 1312 Entries: 318 1311 Entries: 318 1313 Dropped: 0 1312 Dropped: 0 1314 1313 1315 1314 1316 # event histogram 1315 # event histogram 1317 # 1316 # 1318 # trigger info: hist:keys=skbaddr.hex:val 1317 # trigger info: hist:keys=skbaddr.hex:vals=hitcount,len:sort=hitcount:size=2048 if len == 256 [active] 1319 # 1318 # 1320 1319 1321 1320 1322 Totals: 1321 Totals: 1323 Hits: 0 1322 Hits: 0 1324 Entries: 0 1323 Entries: 0 1325 Dropped: 0 1324 Dropped: 0 1326 1325 1327 1326 1328 # event histogram 1327 # event histogram 1329 # 1328 # 1330 # trigger info: hist:keys=skbaddr.hex:val 1329 # trigger info: hist:keys=skbaddr.hex:vals=hitcount,len:sort=hitcount:size=2048 if len > 4096 [active] 1331 # 1330 # 1332 1331 1333 { skbaddr: ffff88009fd2c300 } hitcount: 1332 { skbaddr: ffff88009fd2c300 } hitcount: 1 len: 7212 1334 { skbaddr: ffff8800d2bcce00 } hitcount: 1333 { skbaddr: ffff8800d2bcce00 } hitcount: 1 len: 7212 1335 { skbaddr: ffff8800d2bcd700 } hitcount: 1334 { skbaddr: ffff8800d2bcd700 } hitcount: 1 len: 7212 1336 { skbaddr: ffff8800d2bcda00 } hitcount: 1335 { skbaddr: ffff8800d2bcda00 } hitcount: 1 len: 21492 1337 { skbaddr: ffff8800ae2e2d00 } hitcount: 1336 { skbaddr: ffff8800ae2e2d00 } hitcount: 1 len: 7212 1338 { skbaddr: ffff8800d2bcdb00 } hitcount: 1337 { skbaddr: ffff8800d2bcdb00 } hitcount: 1 len: 7212 1339 { skbaddr: ffff88006a4df500 } hitcount: 1338 { skbaddr: ffff88006a4df500 } hitcount: 1 len: 4854 1340 { skbaddr: ffff88008ce47b00 } hitcount: 1339 { skbaddr: ffff88008ce47b00 } hitcount: 1 len: 18636 1341 { skbaddr: ffff8800ae2e2200 } hitcount: 1340 { skbaddr: ffff8800ae2e2200 } hitcount: 1 len: 12924 1342 { skbaddr: ffff88005f3e1000 } hitcount: 1341 { skbaddr: ffff88005f3e1000 } hitcount: 1 len: 4356 1343 { skbaddr: ffff8800d2bcdc00 } hitcount: 1342 { skbaddr: ffff8800d2bcdc00 } hitcount: 2 len: 24420 1344 { skbaddr: ffff8800d2bcc200 } hitcount: 1343 { skbaddr: ffff8800d2bcc200 } hitcount: 2 len: 12996 1345 1344 1346 Totals: 1345 Totals: 1347 Hits: 14 1346 Hits: 14 1348 Entries: 12 1347 Entries: 12 1349 Dropped: 0 1348 Dropped: 0 1350 1349 1351 1350 1352 # event histogram 1351 # event histogram 1353 # 1352 # 1354 # trigger info: hist:keys=skbaddr.hex:val 1353 # trigger info: hist:keys=skbaddr.hex:vals=hitcount,len:sort=hitcount:size=2048 if len < 0 [active] 1355 # 1354 # 1356 1355 1357 1356 1358 Totals: 1357 Totals: 1359 Hits: 0 1358 Hits: 0 1360 Entries: 0 1359 Entries: 0 1361 Dropped: 0 1360 Dropped: 0 1362 1361 1363 Named triggers can be used to have triggers 1362 Named triggers can be used to have triggers share a common set of 1364 histogram data. This capability is mostly 1363 histogram data. This capability is mostly useful for combining the 1365 output of events generated by tracepoints c 1364 output of events generated by tracepoints contained inside inline 1366 functions, but names can be used in a hist 1365 functions, but names can be used in a hist trigger on any event. 1367 For example, these two triggers when hit wi 1366 For example, these two triggers when hit will update the same 'len' 1368 field in the shared 'foo' histogram data:: 1367 field in the shared 'foo' histogram data:: 1369 1368 1370 # echo 'hist:name=foo:keys=skbaddr.hex:va 1369 # echo 'hist:name=foo:keys=skbaddr.hex:vals=len' > \ 1371 /sys/kernel/tracing/events/net/net !! 1370 /sys/kernel/debug/tracing/events/net/netif_receive_skb/trigger 1372 # echo 'hist:name=foo:keys=skbaddr.hex:va 1371 # echo 'hist:name=foo:keys=skbaddr.hex:vals=len' > \ 1373 /sys/kernel/tracing/events/net/net !! 1372 /sys/kernel/debug/tracing/events/net/netif_rx/trigger 1374 1373 1375 You can see that they're updating common hi 1374 You can see that they're updating common histogram data by reading 1376 each event's hist files at the same time:: 1375 each event's hist files at the same time:: 1377 1376 1378 # cat /sys/kernel/tracing/events/net/neti !! 1377 # cat /sys/kernel/debug/tracing/events/net/netif_receive_skb/hist; 1379 cat /sys/kernel/tracing/events/net/neti !! 1378 cat /sys/kernel/debug/tracing/events/net/netif_rx/hist 1380 1379 1381 # event histogram 1380 # event histogram 1382 # 1381 # 1383 # trigger info: hist:name=foo:keys=skbadd 1382 # trigger info: hist:name=foo:keys=skbaddr.hex:vals=hitcount,len:sort=hitcount:size=2048 [active] 1384 # 1383 # 1385 1384 1386 { skbaddr: ffff88000ad53500 } hitcount: 1385 { skbaddr: ffff88000ad53500 } hitcount: 1 len: 46 1387 { skbaddr: ffff8800af5a1500 } hitcount: 1386 { skbaddr: ffff8800af5a1500 } hitcount: 1 len: 76 1388 { skbaddr: ffff8800d62a1900 } hitcount: 1387 { skbaddr: ffff8800d62a1900 } hitcount: 1 len: 46 1389 { skbaddr: ffff8800d2bccb00 } hitcount: 1388 { skbaddr: ffff8800d2bccb00 } hitcount: 1 len: 468 1390 { skbaddr: ffff8800d3c69900 } hitcount: 1389 { skbaddr: ffff8800d3c69900 } hitcount: 1 len: 46 1391 { skbaddr: ffff88009ff09100 } hitcount: 1390 { skbaddr: ffff88009ff09100 } hitcount: 1 len: 52 1392 { skbaddr: ffff88010f13ab00 } hitcount: 1391 { skbaddr: ffff88010f13ab00 } hitcount: 1 len: 168 1393 { skbaddr: ffff88006a54f400 } hitcount: 1392 { skbaddr: ffff88006a54f400 } hitcount: 1 len: 46 1394 { skbaddr: ffff8800d2bcc500 } hitcount: 1393 { skbaddr: ffff8800d2bcc500 } hitcount: 1 len: 260 1395 { skbaddr: ffff880064505000 } hitcount: 1394 { skbaddr: ffff880064505000 } hitcount: 1 len: 46 1396 { skbaddr: ffff8800baf24e00 } hitcount: 1395 { skbaddr: ffff8800baf24e00 } hitcount: 1 len: 32 1397 { skbaddr: ffff88009fe0ad00 } hitcount: 1396 { skbaddr: ffff88009fe0ad00 } hitcount: 1 len: 46 1398 { skbaddr: ffff8800d3edff00 } hitcount: 1397 { skbaddr: ffff8800d3edff00 } hitcount: 1 len: 44 1399 { skbaddr: ffff88009fe0b400 } hitcount: 1398 { skbaddr: ffff88009fe0b400 } hitcount: 1 len: 168 1400 { skbaddr: ffff8800a1c55a00 } hitcount: 1399 { skbaddr: ffff8800a1c55a00 } hitcount: 1 len: 40 1401 { skbaddr: ffff8800d2bcd100 } hitcount: 1400 { skbaddr: ffff8800d2bcd100 } hitcount: 1 len: 40 1402 { skbaddr: ffff880064505f00 } hitcount: 1401 { skbaddr: ffff880064505f00 } hitcount: 1 len: 174 1403 { skbaddr: ffff8800a8bff200 } hitcount: 1402 { skbaddr: ffff8800a8bff200 } hitcount: 1 len: 160 1404 { skbaddr: ffff880044e3cc00 } hitcount: 1403 { skbaddr: ffff880044e3cc00 } hitcount: 1 len: 76 1405 { skbaddr: ffff8800a8bfe700 } hitcount: 1404 { skbaddr: ffff8800a8bfe700 } hitcount: 1 len: 46 1406 { skbaddr: ffff8800d2bcdc00 } hitcount: 1405 { skbaddr: ffff8800d2bcdc00 } hitcount: 1 len: 32 1407 { skbaddr: ffff8800a1f64800 } hitcount: 1406 { skbaddr: ffff8800a1f64800 } hitcount: 1 len: 46 1408 { skbaddr: ffff8800d2bcde00 } hitcount: 1407 { skbaddr: ffff8800d2bcde00 } hitcount: 1 len: 988 1409 { skbaddr: ffff88006a5dea00 } hitcount: 1408 { skbaddr: ffff88006a5dea00 } hitcount: 1 len: 46 1410 { skbaddr: ffff88002e37a200 } hitcount: 1409 { skbaddr: ffff88002e37a200 } hitcount: 1 len: 44 1411 { skbaddr: ffff8800a1f32c00 } hitcount: 1410 { skbaddr: ffff8800a1f32c00 } hitcount: 2 len: 676 1412 { skbaddr: ffff88000ad52600 } hitcount: 1411 { skbaddr: ffff88000ad52600 } hitcount: 2 len: 107 1413 { skbaddr: ffff8800a1f91e00 } hitcount: 1412 { skbaddr: ffff8800a1f91e00 } hitcount: 2 len: 92 1414 { skbaddr: ffff8800af5a0200 } hitcount: 1413 { skbaddr: ffff8800af5a0200 } hitcount: 2 len: 142 1415 { skbaddr: ffff8800d2bcc600 } hitcount: 1414 { skbaddr: ffff8800d2bcc600 } hitcount: 2 len: 220 1416 { skbaddr: ffff8800ba36f500 } hitcount: 1415 { skbaddr: ffff8800ba36f500 } hitcount: 2 len: 92 1417 { skbaddr: ffff8800d021f800 } hitcount: 1416 { skbaddr: ffff8800d021f800 } hitcount: 2 len: 92 1418 { skbaddr: ffff8800a1f33600 } hitcount: 1417 { skbaddr: ffff8800a1f33600 } hitcount: 2 len: 675 1419 { skbaddr: ffff8800a8bfff00 } hitcount: 1418 { skbaddr: ffff8800a8bfff00 } hitcount: 3 len: 138 1420 { skbaddr: ffff8800d62a1300 } hitcount: 1419 { skbaddr: ffff8800d62a1300 } hitcount: 3 len: 138 1421 { skbaddr: ffff88002e37a100 } hitcount: 1420 { skbaddr: ffff88002e37a100 } hitcount: 4 len: 184 1422 { skbaddr: ffff880064504400 } hitcount: 1421 { skbaddr: ffff880064504400 } hitcount: 4 len: 184 1423 { skbaddr: ffff8800a8bfec00 } hitcount: 1422 { skbaddr: ffff8800a8bfec00 } hitcount: 4 len: 184 1424 { skbaddr: ffff88000ad53700 } hitcount: 1423 { skbaddr: ffff88000ad53700 } hitcount: 5 len: 230 1425 { skbaddr: ffff8800d2bcdb00 } hitcount: 1424 { skbaddr: ffff8800d2bcdb00 } hitcount: 5 len: 196 1426 { skbaddr: ffff8800a1f90000 } hitcount: 1425 { skbaddr: ffff8800a1f90000 } hitcount: 6 len: 276 1427 { skbaddr: ffff88006a54f900 } hitcount: 1426 { skbaddr: ffff88006a54f900 } hitcount: 6 len: 276 1428 1427 1429 Totals: 1428 Totals: 1430 Hits: 81 1429 Hits: 81 1431 Entries: 42 1430 Entries: 42 1432 Dropped: 0 1431 Dropped: 0 1433 # event histogram 1432 # event histogram 1434 # 1433 # 1435 # trigger info: hist:name=foo:keys=skbadd 1434 # trigger info: hist:name=foo:keys=skbaddr.hex:vals=hitcount,len:sort=hitcount:size=2048 [active] 1436 # 1435 # 1437 1436 1438 { skbaddr: ffff88000ad53500 } hitcount: 1437 { skbaddr: ffff88000ad53500 } hitcount: 1 len: 46 1439 { skbaddr: ffff8800af5a1500 } hitcount: 1438 { skbaddr: ffff8800af5a1500 } hitcount: 1 len: 76 1440 { skbaddr: ffff8800d62a1900 } hitcount: 1439 { skbaddr: ffff8800d62a1900 } hitcount: 1 len: 46 1441 { skbaddr: ffff8800d2bccb00 } hitcount: 1440 { skbaddr: ffff8800d2bccb00 } hitcount: 1 len: 468 1442 { skbaddr: ffff8800d3c69900 } hitcount: 1441 { skbaddr: ffff8800d3c69900 } hitcount: 1 len: 46 1443 { skbaddr: ffff88009ff09100 } hitcount: 1442 { skbaddr: ffff88009ff09100 } hitcount: 1 len: 52 1444 { skbaddr: ffff88010f13ab00 } hitcount: 1443 { skbaddr: ffff88010f13ab00 } hitcount: 1 len: 168 1445 { skbaddr: ffff88006a54f400 } hitcount: 1444 { skbaddr: ffff88006a54f400 } hitcount: 1 len: 46 1446 { skbaddr: ffff8800d2bcc500 } hitcount: 1445 { skbaddr: ffff8800d2bcc500 } hitcount: 1 len: 260 1447 { skbaddr: ffff880064505000 } hitcount: 1446 { skbaddr: ffff880064505000 } hitcount: 1 len: 46 1448 { skbaddr: ffff8800baf24e00 } hitcount: 1447 { skbaddr: ffff8800baf24e00 } hitcount: 1 len: 32 1449 { skbaddr: ffff88009fe0ad00 } hitcount: 1448 { skbaddr: ffff88009fe0ad00 } hitcount: 1 len: 46 1450 { skbaddr: ffff8800d3edff00 } hitcount: 1449 { skbaddr: ffff8800d3edff00 } hitcount: 1 len: 44 1451 { skbaddr: ffff88009fe0b400 } hitcount: 1450 { skbaddr: ffff88009fe0b400 } hitcount: 1 len: 168 1452 { skbaddr: ffff8800a1c55a00 } hitcount: 1451 { skbaddr: ffff8800a1c55a00 } hitcount: 1 len: 40 1453 { skbaddr: ffff8800d2bcd100 } hitcount: 1452 { skbaddr: ffff8800d2bcd100 } hitcount: 1 len: 40 1454 { skbaddr: ffff880064505f00 } hitcount: 1453 { skbaddr: ffff880064505f00 } hitcount: 1 len: 174 1455 { skbaddr: ffff8800a8bff200 } hitcount: 1454 { skbaddr: ffff8800a8bff200 } hitcount: 1 len: 160 1456 { skbaddr: ffff880044e3cc00 } hitcount: 1455 { skbaddr: ffff880044e3cc00 } hitcount: 1 len: 76 1457 { skbaddr: ffff8800a8bfe700 } hitcount: 1456 { skbaddr: ffff8800a8bfe700 } hitcount: 1 len: 46 1458 { skbaddr: ffff8800d2bcdc00 } hitcount: 1457 { skbaddr: ffff8800d2bcdc00 } hitcount: 1 len: 32 1459 { skbaddr: ffff8800a1f64800 } hitcount: 1458 { skbaddr: ffff8800a1f64800 } hitcount: 1 len: 46 1460 { skbaddr: ffff8800d2bcde00 } hitcount: 1459 { skbaddr: ffff8800d2bcde00 } hitcount: 1 len: 988 1461 { skbaddr: ffff88006a5dea00 } hitcount: 1460 { skbaddr: ffff88006a5dea00 } hitcount: 1 len: 46 1462 { skbaddr: ffff88002e37a200 } hitcount: 1461 { skbaddr: ffff88002e37a200 } hitcount: 1 len: 44 1463 { skbaddr: ffff8800a1f32c00 } hitcount: 1462 { skbaddr: ffff8800a1f32c00 } hitcount: 2 len: 676 1464 { skbaddr: ffff88000ad52600 } hitcount: 1463 { skbaddr: ffff88000ad52600 } hitcount: 2 len: 107 1465 { skbaddr: ffff8800a1f91e00 } hitcount: 1464 { skbaddr: ffff8800a1f91e00 } hitcount: 2 len: 92 1466 { skbaddr: ffff8800af5a0200 } hitcount: 1465 { skbaddr: ffff8800af5a0200 } hitcount: 2 len: 142 1467 { skbaddr: ffff8800d2bcc600 } hitcount: 1466 { skbaddr: ffff8800d2bcc600 } hitcount: 2 len: 220 1468 { skbaddr: ffff8800ba36f500 } hitcount: 1467 { skbaddr: ffff8800ba36f500 } hitcount: 2 len: 92 1469 { skbaddr: ffff8800d021f800 } hitcount: 1468 { skbaddr: ffff8800d021f800 } hitcount: 2 len: 92 1470 { skbaddr: ffff8800a1f33600 } hitcount: 1469 { skbaddr: ffff8800a1f33600 } hitcount: 2 len: 675 1471 { skbaddr: ffff8800a8bfff00 } hitcount: 1470 { skbaddr: ffff8800a8bfff00 } hitcount: 3 len: 138 1472 { skbaddr: ffff8800d62a1300 } hitcount: 1471 { skbaddr: ffff8800d62a1300 } hitcount: 3 len: 138 1473 { skbaddr: ffff88002e37a100 } hitcount: 1472 { skbaddr: ffff88002e37a100 } hitcount: 4 len: 184 1474 { skbaddr: ffff880064504400 } hitcount: 1473 { skbaddr: ffff880064504400 } hitcount: 4 len: 184 1475 { skbaddr: ffff8800a8bfec00 } hitcount: 1474 { skbaddr: ffff8800a8bfec00 } hitcount: 4 len: 184 1476 { skbaddr: ffff88000ad53700 } hitcount: 1475 { skbaddr: ffff88000ad53700 } hitcount: 5 len: 230 1477 { skbaddr: ffff8800d2bcdb00 } hitcount: 1476 { skbaddr: ffff8800d2bcdb00 } hitcount: 5 len: 196 1478 { skbaddr: ffff8800a1f90000 } hitcount: 1477 { skbaddr: ffff8800a1f90000 } hitcount: 6 len: 276 1479 { skbaddr: ffff88006a54f900 } hitcount: 1478 { skbaddr: ffff88006a54f900 } hitcount: 6 len: 276 1480 1479 1481 Totals: 1480 Totals: 1482 Hits: 81 1481 Hits: 81 1483 Entries: 42 1482 Entries: 42 1484 Dropped: 0 1483 Dropped: 0 1485 1484 1486 And here's an example that shows how to com 1485 And here's an example that shows how to combine histogram data from 1487 any two events even if they don't share any 1486 any two events even if they don't share any 'compatible' fields 1488 other than 'hitcount' and 'common_stacktrac !! 1487 other than 'hitcount' and 'stacktrace'. These commands create a 1489 couple of triggers named 'bar' using those 1488 couple of triggers named 'bar' using those fields:: 1490 1489 1491 # echo 'hist:name=bar:key=common_stacktra !! 1490 # echo 'hist:name=bar:key=stacktrace:val=hitcount' > \ 1492 /sys/kernel/tracing/events/sched/s !! 1491 /sys/kernel/debug/tracing/events/sched/sched_process_fork/trigger 1493 # echo 'hist:name=bar:key=common_stacktra !! 1492 # echo 'hist:name=bar:key=stacktrace:val=hitcount' > \ 1494 /sys/kernel/tracing/events/net/neti !! 1493 /sys/kernel/debug/tracing/events/net/netif_rx/trigger 1495 1494 1496 And displaying the output of either shows s 1495 And displaying the output of either shows some interesting if 1497 somewhat confusing output:: 1496 somewhat confusing output:: 1498 1497 1499 # cat /sys/kernel/tracing/events/sched/sc !! 1498 # cat /sys/kernel/debug/tracing/events/sched/sched_process_fork/hist 1500 # cat /sys/kernel/tracing/events/net/neti !! 1499 # cat /sys/kernel/debug/tracing/events/net/netif_rx/hist 1501 1500 1502 # event histogram 1501 # event histogram 1503 # 1502 # 1504 # trigger info: hist:name=bar:keys=common !! 1503 # trigger info: hist:name=bar:keys=stacktrace:vals=hitcount:sort=hitcount:size=2048 [active] 1505 # 1504 # 1506 1505 1507 { common_stacktrace: !! 1506 { stacktrace: 1508 kernel_clone+0x18e/0x330 1507 kernel_clone+0x18e/0x330 1509 kernel_thread+0x29/0x30 1508 kernel_thread+0x29/0x30 1510 kthreadd+0x154/0x1b0 1509 kthreadd+0x154/0x1b0 1511 ret_from_fork+0x3f/0x70 1510 ret_from_fork+0x3f/0x70 1512 } hitcount: 1 1511 } hitcount: 1 1513 { common_stacktrace: !! 1512 { stacktrace: 1514 netif_rx_internal+0xb2/0xd0 1513 netif_rx_internal+0xb2/0xd0 1515 netif_rx_ni+0x20/0x70 1514 netif_rx_ni+0x20/0x70 1516 dev_loopback_xmit+0xaa/0xd0 1515 dev_loopback_xmit+0xaa/0xd0 1517 ip_mc_output+0x126/0x240 1516 ip_mc_output+0x126/0x240 1518 ip_local_out_sk+0x31/0x40 1517 ip_local_out_sk+0x31/0x40 1519 igmp_send_report+0x1e9/0x230 1518 igmp_send_report+0x1e9/0x230 1520 igmp_timer_expire+0xe9/0x120 1519 igmp_timer_expire+0xe9/0x120 1521 call_timer_fn+0x39/0xf0 1520 call_timer_fn+0x39/0xf0 1522 run_timer_softirq+0x1e1/0x290 1521 run_timer_softirq+0x1e1/0x290 1523 __do_softirq+0xfd/0x290 1522 __do_softirq+0xfd/0x290 1524 irq_exit+0x98/0xb0 1523 irq_exit+0x98/0xb0 1525 smp_apic_timer_interrupt+0x4a/0x 1524 smp_apic_timer_interrupt+0x4a/0x60 1526 apic_timer_interrupt+0x6d/0x80 1525 apic_timer_interrupt+0x6d/0x80 1527 cpuidle_enter+0x17/0x20 1526 cpuidle_enter+0x17/0x20 1528 call_cpuidle+0x3b/0x60 1527 call_cpuidle+0x3b/0x60 1529 cpu_startup_entry+0x22d/0x310 1528 cpu_startup_entry+0x22d/0x310 1530 } hitcount: 1 1529 } hitcount: 1 1531 { common_stacktrace: !! 1530 { stacktrace: 1532 netif_rx_internal+0xb2/0xd0 1531 netif_rx_internal+0xb2/0xd0 1533 netif_rx_ni+0x20/0x70 1532 netif_rx_ni+0x20/0x70 1534 dev_loopback_xmit+0xaa/0xd0 1533 dev_loopback_xmit+0xaa/0xd0 1535 ip_mc_output+0x17f/0x240 1534 ip_mc_output+0x17f/0x240 1536 ip_local_out_sk+0x31/0x40 1535 ip_local_out_sk+0x31/0x40 1537 ip_send_skb+0x1a/0x50 1536 ip_send_skb+0x1a/0x50 1538 udp_send_skb+0x13e/0x270 1537 udp_send_skb+0x13e/0x270 1539 udp_sendmsg+0x2bf/0x980 1538 udp_sendmsg+0x2bf/0x980 1540 inet_sendmsg+0x67/0xa0 1539 inet_sendmsg+0x67/0xa0 1541 sock_sendmsg+0x38/0x50 1540 sock_sendmsg+0x38/0x50 1542 SYSC_sendto+0xef/0x170 1541 SYSC_sendto+0xef/0x170 1543 SyS_sendto+0xe/0x10 1542 SyS_sendto+0xe/0x10 1544 entry_SYSCALL_64_fastpath+0x12/0 1543 entry_SYSCALL_64_fastpath+0x12/0x6a 1545 } hitcount: 2 1544 } hitcount: 2 1546 { common_stacktrace: !! 1545 { stacktrace: 1547 netif_rx_internal+0xb2/0xd0 1546 netif_rx_internal+0xb2/0xd0 1548 netif_rx+0x1c/0x60 1547 netif_rx+0x1c/0x60 1549 loopback_xmit+0x6c/0xb0 1548 loopback_xmit+0x6c/0xb0 1550 dev_hard_start_xmit+0x219/0x3a0 1549 dev_hard_start_xmit+0x219/0x3a0 1551 __dev_queue_xmit+0x415/0x4f0 1550 __dev_queue_xmit+0x415/0x4f0 1552 dev_queue_xmit_sk+0x13/0x20 1551 dev_queue_xmit_sk+0x13/0x20 1553 ip_finish_output2+0x237/0x340 1552 ip_finish_output2+0x237/0x340 1554 ip_finish_output+0x113/0x1d0 1553 ip_finish_output+0x113/0x1d0 1555 ip_output+0x66/0xc0 1554 ip_output+0x66/0xc0 1556 ip_local_out_sk+0x31/0x40 1555 ip_local_out_sk+0x31/0x40 1557 ip_send_skb+0x1a/0x50 1556 ip_send_skb+0x1a/0x50 1558 udp_send_skb+0x16d/0x270 1557 udp_send_skb+0x16d/0x270 1559 udp_sendmsg+0x2bf/0x980 1558 udp_sendmsg+0x2bf/0x980 1560 inet_sendmsg+0x67/0xa0 1559 inet_sendmsg+0x67/0xa0 1561 sock_sendmsg+0x38/0x50 1560 sock_sendmsg+0x38/0x50 1562 ___sys_sendmsg+0x14e/0x270 1561 ___sys_sendmsg+0x14e/0x270 1563 } hitcount: 76 1562 } hitcount: 76 1564 { common_stacktrace: !! 1563 { stacktrace: 1565 netif_rx_internal+0xb2/0xd0 1564 netif_rx_internal+0xb2/0xd0 1566 netif_rx+0x1c/0x60 1565 netif_rx+0x1c/0x60 1567 loopback_xmit+0x6c/0xb0 1566 loopback_xmit+0x6c/0xb0 1568 dev_hard_start_xmit+0x219/0x3a0 1567 dev_hard_start_xmit+0x219/0x3a0 1569 __dev_queue_xmit+0x415/0x4f0 1568 __dev_queue_xmit+0x415/0x4f0 1570 dev_queue_xmit_sk+0x13/0x20 1569 dev_queue_xmit_sk+0x13/0x20 1571 ip_finish_output2+0x237/0x340 1570 ip_finish_output2+0x237/0x340 1572 ip_finish_output+0x113/0x1d0 1571 ip_finish_output+0x113/0x1d0 1573 ip_output+0x66/0xc0 1572 ip_output+0x66/0xc0 1574 ip_local_out_sk+0x31/0x40 1573 ip_local_out_sk+0x31/0x40 1575 ip_send_skb+0x1a/0x50 1574 ip_send_skb+0x1a/0x50 1576 udp_send_skb+0x16d/0x270 1575 udp_send_skb+0x16d/0x270 1577 udp_sendmsg+0x2bf/0x980 1576 udp_sendmsg+0x2bf/0x980 1578 inet_sendmsg+0x67/0xa0 1577 inet_sendmsg+0x67/0xa0 1579 sock_sendmsg+0x38/0x50 1578 sock_sendmsg+0x38/0x50 1580 ___sys_sendmsg+0x269/0x270 1579 ___sys_sendmsg+0x269/0x270 1581 } hitcount: 77 1580 } hitcount: 77 1582 { common_stacktrace: !! 1581 { stacktrace: 1583 netif_rx_internal+0xb2/0xd0 1582 netif_rx_internal+0xb2/0xd0 1584 netif_rx+0x1c/0x60 1583 netif_rx+0x1c/0x60 1585 loopback_xmit+0x6c/0xb0 1584 loopback_xmit+0x6c/0xb0 1586 dev_hard_start_xmit+0x219/0x3a0 1585 dev_hard_start_xmit+0x219/0x3a0 1587 __dev_queue_xmit+0x415/0x4f0 1586 __dev_queue_xmit+0x415/0x4f0 1588 dev_queue_xmit_sk+0x13/0x20 1587 dev_queue_xmit_sk+0x13/0x20 1589 ip_finish_output2+0x237/0x340 1588 ip_finish_output2+0x237/0x340 1590 ip_finish_output+0x113/0x1d0 1589 ip_finish_output+0x113/0x1d0 1591 ip_output+0x66/0xc0 1590 ip_output+0x66/0xc0 1592 ip_local_out_sk+0x31/0x40 1591 ip_local_out_sk+0x31/0x40 1593 ip_send_skb+0x1a/0x50 1592 ip_send_skb+0x1a/0x50 1594 udp_send_skb+0x16d/0x270 1593 udp_send_skb+0x16d/0x270 1595 udp_sendmsg+0x2bf/0x980 1594 udp_sendmsg+0x2bf/0x980 1596 inet_sendmsg+0x67/0xa0 1595 inet_sendmsg+0x67/0xa0 1597 sock_sendmsg+0x38/0x50 1596 sock_sendmsg+0x38/0x50 1598 SYSC_sendto+0xef/0x170 1597 SYSC_sendto+0xef/0x170 1599 } hitcount: 88 1598 } hitcount: 88 1600 { common_stacktrace: !! 1599 { stacktrace: 1601 kernel_clone+0x18e/0x330 1600 kernel_clone+0x18e/0x330 1602 SyS_clone+0x19/0x20 1601 SyS_clone+0x19/0x20 1603 entry_SYSCALL_64_fastpath+0x12/0 1602 entry_SYSCALL_64_fastpath+0x12/0x6a 1604 } hitcount: 244 1603 } hitcount: 244 1605 1604 1606 Totals: 1605 Totals: 1607 Hits: 489 1606 Hits: 489 1608 Entries: 7 1607 Entries: 7 1609 Dropped: 0 1608 Dropped: 0 1610 1609 1611 2.2 Inter-event hist triggers 1610 2.2 Inter-event hist triggers 1612 ----------------------------- 1611 ----------------------------- 1613 1612 1614 Inter-event hist triggers are hist triggers t 1613 Inter-event hist triggers are hist triggers that combine values from 1615 one or more other events and create a histogr 1614 one or more other events and create a histogram using that data. Data 1616 from an inter-event histogram can in turn bec 1615 from an inter-event histogram can in turn become the source for 1617 further combined histograms, thus providing a 1616 further combined histograms, thus providing a chain of related 1618 histograms, which is important for some appli 1617 histograms, which is important for some applications. 1619 1618 1620 The most important example of an inter-event 1619 The most important example of an inter-event quantity that can be used 1621 in this manner is latency, which is simply a 1620 in this manner is latency, which is simply a difference in timestamps 1622 between two events. Although latency is the 1621 between two events. Although latency is the most important 1623 inter-event quantity, note that because the s 1622 inter-event quantity, note that because the support is completely 1624 general across the trace event subsystem, any 1623 general across the trace event subsystem, any event field can be used 1625 in an inter-event quantity. 1624 in an inter-event quantity. 1626 1625 1627 An example of a histogram that combines data 1626 An example of a histogram that combines data from other histograms 1628 into a useful chain would be a 'wakeupswitch 1627 into a useful chain would be a 'wakeupswitch latency' histogram that 1629 combines a 'wakeup latency' histogram and a ' 1628 combines a 'wakeup latency' histogram and a 'switch latency' 1630 histogram. 1629 histogram. 1631 1630 1632 Normally, a hist trigger specification consis 1631 Normally, a hist trigger specification consists of a (possibly 1633 compound) key along with one or more numeric 1632 compound) key along with one or more numeric values, which are 1634 continually updated sums associated with that 1633 continually updated sums associated with that key. A histogram 1635 specification in this case consists of indivi 1634 specification in this case consists of individual key and value 1636 specifications that refer to trace event fiel 1635 specifications that refer to trace event fields associated with a 1637 single event type. 1636 single event type. 1638 1637 1639 The inter-event hist trigger extension allows 1638 The inter-event hist trigger extension allows fields from multiple 1640 events to be referenced and combined into a m 1639 events to be referenced and combined into a multi-event histogram 1641 specification. In support of this overall go 1640 specification. In support of this overall goal, a few enabling 1642 features have been added to the hist trigger 1641 features have been added to the hist trigger support: 1643 1642 1644 - In order to compute an inter-event quanti 1643 - In order to compute an inter-event quantity, a value from one 1645 event needs to saved and then referenced 1644 event needs to saved and then referenced from another event. This 1646 requires the introduction of support for 1645 requires the introduction of support for histogram 'variables'. 1647 1646 1648 - The computation of inter-event quantities 1647 - The computation of inter-event quantities and their combination 1649 require some minimal amount of support fo 1648 require some minimal amount of support for applying simple 1650 expressions to variables (+ and -). 1649 expressions to variables (+ and -). 1651 1650 1652 - A histogram consisting of inter-event qua 1651 - A histogram consisting of inter-event quantities isn't logically a 1653 histogram on either event (so having the 1652 histogram on either event (so having the 'hist' file for either 1654 event host the histogram output doesn't r 1653 event host the histogram output doesn't really make sense). To 1655 address the idea that the histogram is as 1654 address the idea that the histogram is associated with a 1656 combination of events, support is added a 1655 combination of events, support is added allowing the creation of 1657 'synthetic' events that are events derive 1656 'synthetic' events that are events derived from other events. 1658 These synthetic events are full-fledged e 1657 These synthetic events are full-fledged events just like any other 1659 and can be used as such, as for instance 1658 and can be used as such, as for instance to create the 1660 'combination' histograms mentioned previo 1659 'combination' histograms mentioned previously. 1661 1660 1662 - A set of 'actions' can be associated with 1661 - A set of 'actions' can be associated with histogram entries - 1663 these can be used to generate the previou 1662 these can be used to generate the previously mentioned synthetic 1664 events, but can also be used for other pu 1663 events, but can also be used for other purposes, such as for 1665 example saving context when a 'max' laten 1664 example saving context when a 'max' latency has been hit. 1666 1665 1667 - Trace events don't have a 'timestamp' ass 1666 - Trace events don't have a 'timestamp' associated with them, but 1668 there is an implicit timestamp saved alon 1667 there is an implicit timestamp saved along with an event in the 1669 underlying ftrace ring buffer. This time 1668 underlying ftrace ring buffer. This timestamp is now exposed as a 1670 a synthetic field named 'common_timestamp 1669 a synthetic field named 'common_timestamp' which can be used in 1671 histograms as if it were any other event 1670 histograms as if it were any other event field; it isn't an actual 1672 field in the trace format but rather is a 1671 field in the trace format but rather is a synthesized value that 1673 nonetheless can be used as if it were an 1672 nonetheless can be used as if it were an actual field. By default 1674 it is in units of nanoseconds; appending 1673 it is in units of nanoseconds; appending '.usecs' to a 1675 common_timestamp field changes the units 1674 common_timestamp field changes the units to microseconds. 1676 1675 1677 A note on inter-event timestamps: If common_t 1676 A note on inter-event timestamps: If common_timestamp is used in a 1678 histogram, the trace buffer is automatically 1677 histogram, the trace buffer is automatically switched over to using 1679 absolute timestamps and the "global" trace cl 1678 absolute timestamps and the "global" trace clock, in order to avoid 1680 bogus timestamp differences with other clocks 1679 bogus timestamp differences with other clocks that aren't coherent 1681 across CPUs. This can be overridden by speci 1680 across CPUs. This can be overridden by specifying one of the other 1682 trace clocks instead, using the "clock=XXX" h 1681 trace clocks instead, using the "clock=XXX" hist trigger attribute, 1683 where XXX is any of the clocks listed in the 1682 where XXX is any of the clocks listed in the tracing/trace_clock 1684 pseudo-file. 1683 pseudo-file. 1685 1684 1686 These features are described in more detail i 1685 These features are described in more detail in the following sections. 1687 1686 1688 2.2.1 Histogram Variables 1687 2.2.1 Histogram Variables 1689 ------------------------- 1688 ------------------------- 1690 1689 1691 Variables are simply named locations used for 1690 Variables are simply named locations used for saving and retrieving 1692 values between matching events. A 'matching' 1691 values between matching events. A 'matching' event is defined as an 1693 event that has a matching key - if a variable 1692 event that has a matching key - if a variable is saved for a histogram 1694 entry corresponding to that key, any subseque 1693 entry corresponding to that key, any subsequent event with a matching 1695 key can access that variable. 1694 key can access that variable. 1696 1695 1697 A variable's value is normally available to a 1696 A variable's value is normally available to any subsequent event until 1698 it is set to something else by a subsequent e 1697 it is set to something else by a subsequent event. The one exception 1699 to that rule is that any variable used in an 1698 to that rule is that any variable used in an expression is essentially 1700 'read-once' - once it's used by an expression 1699 'read-once' - once it's used by an expression in a subsequent event, 1701 it's reset to its 'unset' state, which means 1700 it's reset to its 'unset' state, which means it can't be used again 1702 unless it's set again. This ensures not only 1701 unless it's set again. This ensures not only that an event doesn't 1703 use an uninitialized variable in a calculatio 1702 use an uninitialized variable in a calculation, but that that variable 1704 is used only once and not for any unrelated s 1703 is used only once and not for any unrelated subsequent match. 1705 1704 1706 The basic syntax for saving a variable is to 1705 The basic syntax for saving a variable is to simply prefix a unique 1707 variable name not corresponding to any keywor 1706 variable name not corresponding to any keyword along with an '=' sign 1708 to any event field. 1707 to any event field. 1709 1708 1710 Either keys or values can be saved and retrie 1709 Either keys or values can be saved and retrieved in this way. This 1711 creates a variable named 'ts0' for a histogra 1710 creates a variable named 'ts0' for a histogram entry with the key 1712 'next_pid':: 1711 'next_pid':: 1713 1712 1714 # echo 'hist:keys=next_pid:vals=$ts0:ts0=co 1713 # echo 'hist:keys=next_pid:vals=$ts0:ts0=common_timestamp ... >> \ 1715 event/trigger 1714 event/trigger 1716 1715 1717 The ts0 variable can be accessed by any subse 1716 The ts0 variable can be accessed by any subsequent event having the 1718 same pid as 'next_pid'. 1717 same pid as 'next_pid'. 1719 1718 1720 Variable references are formed by prepending 1719 Variable references are formed by prepending the variable name with 1721 the '$' sign. Thus for example, the ts0 vari 1720 the '$' sign. Thus for example, the ts0 variable above would be 1722 referenced as '$ts0' in expressions. 1721 referenced as '$ts0' in expressions. 1723 1722 1724 Because 'vals=' is used, the common_timestamp 1723 Because 'vals=' is used, the common_timestamp variable value above 1725 will also be summed as a normal histogram val 1724 will also be summed as a normal histogram value would (though for a 1726 timestamp it makes little sense). 1725 timestamp it makes little sense). 1727 1726 1728 The below shows that a key value can also be 1727 The below shows that a key value can also be saved in the same way:: 1729 1728 1730 # echo 'hist:timer_pid=common_pid:key=timer 1729 # echo 'hist:timer_pid=common_pid:key=timer_pid ...' >> event/trigger 1731 1730 1732 If a variable isn't a key variable or prefixe 1731 If a variable isn't a key variable or prefixed with 'vals=', the 1733 associated event field will be saved in a var 1732 associated event field will be saved in a variable but won't be summed 1734 as a value:: 1733 as a value:: 1735 1734 1736 # echo 'hist:keys=next_pid:ts1=common_times 1735 # echo 'hist:keys=next_pid:ts1=common_timestamp ...' >> event/trigger 1737 1736 1738 Multiple variables can be assigned at the sam 1737 Multiple variables can be assigned at the same time. The below would 1739 result in both ts0 and b being created as var 1738 result in both ts0 and b being created as variables, with both 1740 common_timestamp and field1 additionally bein 1739 common_timestamp and field1 additionally being summed as values:: 1741 1740 1742 # echo 'hist:keys=pid:vals=$ts0,$b:ts0=comm 1741 # echo 'hist:keys=pid:vals=$ts0,$b:ts0=common_timestamp,b=field1 ...' >> \ 1743 event/trigger 1742 event/trigger 1744 1743 1745 Note that variable assignments can appear eit 1744 Note that variable assignments can appear either preceding or 1746 following their use. The command below behav 1745 following their use. The command below behaves identically to the 1747 command above:: 1746 command above:: 1748 1747 1749 # echo 'hist:keys=pid:ts0=common_timestamp, 1748 # echo 'hist:keys=pid:ts0=common_timestamp,b=field1:vals=$ts0,$b ...' >> \ 1750 event/trigger 1749 event/trigger 1751 1750 1752 Any number of variables not bound to a 'vals= 1751 Any number of variables not bound to a 'vals=' prefix can also be 1753 assigned by simply separating them with colon 1752 assigned by simply separating them with colons. Below is the same 1754 thing but without the values being summed in 1753 thing but without the values being summed in the histogram:: 1755 1754 1756 # echo 'hist:keys=pid:ts0=common_timestamp: 1755 # echo 'hist:keys=pid:ts0=common_timestamp:b=field1 ...' >> event/trigger 1757 1756 1758 Variables set as above can be referenced and 1757 Variables set as above can be referenced and used in expressions on 1759 another event. 1758 another event. 1760 1759 1761 For example, here's how a latency can be calc 1760 For example, here's how a latency can be calculated:: 1762 1761 1763 # echo 'hist:keys=pid,prio:ts0=common_times 1762 # echo 'hist:keys=pid,prio:ts0=common_timestamp ...' >> event1/trigger 1764 # echo 'hist:keys=next_pid:wakeup_lat=commo 1763 # echo 'hist:keys=next_pid:wakeup_lat=common_timestamp-$ts0 ...' >> event2/trigger 1765 1764 1766 In the first line above, the event's timestam 1765 In the first line above, the event's timestamp is saved into the 1767 variable ts0. In the next line, ts0 is subtr 1766 variable ts0. In the next line, ts0 is subtracted from the second 1768 event's timestamp to produce the latency, whi 1767 event's timestamp to produce the latency, which is then assigned into 1769 yet another variable, 'wakeup_lat'. The hist 1768 yet another variable, 'wakeup_lat'. The hist trigger below in turn 1770 makes use of the wakeup_lat variable to compu 1769 makes use of the wakeup_lat variable to compute a combined latency 1771 using the same key and variable from yet anot 1770 using the same key and variable from yet another event:: 1772 1771 1773 # echo 'hist:key=pid:wakeupswitch_lat=$wake 1772 # echo 'hist:key=pid:wakeupswitch_lat=$wakeup_lat+$switchtime_lat ...' >> event3/trigger 1774 1773 1775 Expressions support the use of addition, subt 1774 Expressions support the use of addition, subtraction, multiplication and 1776 division operators (+-\*/). 1775 division operators (+-\*/). 1777 1776 1778 Note if division by zero cannot be detected a 1777 Note if division by zero cannot be detected at parse time (i.e. the 1779 divisor is not a constant), the result will b 1778 divisor is not a constant), the result will be -1. 1780 1779 1781 Numeric constants can also be used directly i 1780 Numeric constants can also be used directly in an expression:: 1782 1781 1783 # echo 'hist:keys=next_pid:timestamp_secs=c 1782 # echo 'hist:keys=next_pid:timestamp_secs=common_timestamp/1000000 ...' >> event/trigger 1784 1783 1785 or assigned to a variable and referenced in a 1784 or assigned to a variable and referenced in a subsequent expression:: 1786 1785 1787 # echo 'hist:keys=next_pid:us_per_sec=10000 1786 # echo 'hist:keys=next_pid:us_per_sec=1000000 ...' >> event/trigger 1788 # echo 'hist:keys=next_pid:timestamp_secs=c 1787 # echo 'hist:keys=next_pid:timestamp_secs=common_timestamp/$us_per_sec ...' >> event/trigger 1789 1788 1790 Variables can even hold stacktraces, which ar << 1791 << 1792 2.2.2 Synthetic Events 1789 2.2.2 Synthetic Events 1793 ---------------------- 1790 ---------------------- 1794 1791 1795 Synthetic events are user-defined events gene 1792 Synthetic events are user-defined events generated from hist trigger 1796 variables or fields associated with one or mo 1793 variables or fields associated with one or more other events. Their 1797 purpose is to provide a mechanism for display 1794 purpose is to provide a mechanism for displaying data spanning 1798 multiple events consistent with the existing 1795 multiple events consistent with the existing and already familiar 1799 usage for normal events. 1796 usage for normal events. 1800 1797 1801 To define a synthetic event, the user writes 1798 To define a synthetic event, the user writes a simple specification 1802 consisting of the name of the new event along 1799 consisting of the name of the new event along with one or more 1803 variables and their types, which can be any v 1800 variables and their types, which can be any valid field type, 1804 separated by semicolons, to the tracing/synth 1801 separated by semicolons, to the tracing/synthetic_events file. 1805 1802 1806 See synth_field_size() for available types. 1803 See synth_field_size() for available types. 1807 1804 1808 If field_name contains [n], the field is cons 1805 If field_name contains [n], the field is considered to be a static array. 1809 1806 1810 If field_names contains[] (no subscript), the 1807 If field_names contains[] (no subscript), the field is considered to 1811 be a dynamic array, which will only take as m 1808 be a dynamic array, which will only take as much space in the event as 1812 is required to hold the array. 1809 is required to hold the array. 1813 1810 1814 A string field can be specified using either 1811 A string field can be specified using either the static notation: 1815 1812 1816 char name[32]; 1813 char name[32]; 1817 1814 1818 Or the dynamic: 1815 Or the dynamic: 1819 1816 1820 char name[]; 1817 char name[]; 1821 1818 1822 The size limit for either is 256. 1819 The size limit for either is 256. 1823 1820 1824 For instance, the following creates a new eve 1821 For instance, the following creates a new event named 'wakeup_latency' 1825 with 3 fields: lat, pid, and prio. Each of t 1822 with 3 fields: lat, pid, and prio. Each of those fields is simply a 1826 variable reference to a variable on another e 1823 variable reference to a variable on another event:: 1827 1824 1828 # echo 'wakeup_latency \ 1825 # echo 'wakeup_latency \ 1829 u64 lat; \ 1826 u64 lat; \ 1830 pid_t pid; \ 1827 pid_t pid; \ 1831 int prio' >> \ 1828 int prio' >> \ 1832 /sys/kernel/tracing/synthetic_event !! 1829 /sys/kernel/debug/tracing/synthetic_events 1833 1830 1834 Reading the tracing/synthetic_events file lis 1831 Reading the tracing/synthetic_events file lists all the currently 1835 defined synthetic events, in this case the ev 1832 defined synthetic events, in this case the event defined above:: 1836 1833 1837 # cat /sys/kernel/tracing/synthetic_events !! 1834 # cat /sys/kernel/debug/tracing/synthetic_events 1838 wakeup_latency u64 lat; pid_t pid; int pr 1835 wakeup_latency u64 lat; pid_t pid; int prio 1839 1836 1840 An existing synthetic event definition can be 1837 An existing synthetic event definition can be removed by prepending 1841 the command that defined it with a '!':: 1838 the command that defined it with a '!':: 1842 1839 1843 # echo '!wakeup_latency u64 lat pid_t pid i 1840 # echo '!wakeup_latency u64 lat pid_t pid int prio' >> \ 1844 /sys/kernel/tracing/synthetic_events !! 1841 /sys/kernel/debug/tracing/synthetic_events 1845 1842 1846 At this point, there isn't yet an actual 'wak 1843 At this point, there isn't yet an actual 'wakeup_latency' event 1847 instantiated in the event subsystem - for thi 1844 instantiated in the event subsystem - for this to happen, a 'hist 1848 trigger action' needs to be instantiated and 1845 trigger action' needs to be instantiated and bound to actual fields 1849 and variables defined on other events (see Se 1846 and variables defined on other events (see Section 2.2.3 below on 1850 how that is done using hist trigger 'onmatch' 1847 how that is done using hist trigger 'onmatch' action). Once that is 1851 done, the 'wakeup_latency' synthetic event in 1848 done, the 'wakeup_latency' synthetic event instance is created. 1852 1849 1853 The new event is created under the tracing/ev 1850 The new event is created under the tracing/events/synthetic/ directory 1854 and looks and behaves just like any other eve 1851 and looks and behaves just like any other event:: 1855 1852 1856 # ls /sys/kernel/tracing/events/synthetic/w !! 1853 # ls /sys/kernel/debug/tracing/events/synthetic/wakeup_latency 1857 enable filter format hist id tri 1854 enable filter format hist id trigger 1858 1855 1859 A histogram can now be defined for the new sy 1856 A histogram can now be defined for the new synthetic event:: 1860 1857 1861 # echo 'hist:keys=pid,prio,lat.log2:sort=la 1858 # echo 'hist:keys=pid,prio,lat.log2:sort=lat' >> \ 1862 /sys/kernel/tracing/events/synthetic/ !! 1859 /sys/kernel/debug/tracing/events/synthetic/wakeup_latency/trigger 1863 1860 1864 The above shows the latency "lat" in a power 1861 The above shows the latency "lat" in a power of 2 grouping. 1865 1862 1866 Like any other event, once a histogram is ena 1863 Like any other event, once a histogram is enabled for the event, the 1867 output can be displayed by reading the event' !! 1864 output can be displayed by reading the event's 'hist' file. 1868 1865 1869 # cat /sys/kernel/tracing/events/synthetic/ !! 1866 # cat /sys/kernel/debug/tracing/events/synthetic/wakeup_latency/hist 1870 1867 1871 # event histogram 1868 # event histogram 1872 # 1869 # 1873 # trigger info: hist:keys=pid,prio,lat.log2 1870 # trigger info: hist:keys=pid,prio,lat.log2:vals=hitcount:sort=lat.log2:size=2048 [active] 1874 # 1871 # 1875 1872 1876 { pid: 2035, prio: 9, lat: ~ 1873 { pid: 2035, prio: 9, lat: ~ 2^2 } hitcount: 43 1877 { pid: 2034, prio: 9, lat: ~ 1874 { pid: 2034, prio: 9, lat: ~ 2^2 } hitcount: 60 1878 { pid: 2029, prio: 9, lat: ~ 1875 { pid: 2029, prio: 9, lat: ~ 2^2 } hitcount: 965 1879 { pid: 2034, prio: 120, lat: ~ 1876 { pid: 2034, prio: 120, lat: ~ 2^2 } hitcount: 9 1880 { pid: 2033, prio: 120, lat: ~ 1877 { pid: 2033, prio: 120, lat: ~ 2^2 } hitcount: 5 1881 { pid: 2030, prio: 9, lat: ~ 1878 { pid: 2030, prio: 9, lat: ~ 2^2 } hitcount: 335 1882 { pid: 2030, prio: 120, lat: ~ 1879 { pid: 2030, prio: 120, lat: ~ 2^2 } hitcount: 10 1883 { pid: 2032, prio: 120, lat: ~ 1880 { pid: 2032, prio: 120, lat: ~ 2^2 } hitcount: 1 1884 { pid: 2035, prio: 120, lat: ~ 1881 { pid: 2035, prio: 120, lat: ~ 2^2 } hitcount: 2 1885 { pid: 2031, prio: 9, lat: ~ 1882 { pid: 2031, prio: 9, lat: ~ 2^2 } hitcount: 176 1886 { pid: 2028, prio: 120, lat: ~ 1883 { pid: 2028, prio: 120, lat: ~ 2^2 } hitcount: 15 1887 { pid: 2033, prio: 9, lat: ~ 1884 { pid: 2033, prio: 9, lat: ~ 2^2 } hitcount: 91 1888 { pid: 2032, prio: 9, lat: ~ 1885 { pid: 2032, prio: 9, lat: ~ 2^2 } hitcount: 125 1889 { pid: 2029, prio: 120, lat: ~ 1886 { pid: 2029, prio: 120, lat: ~ 2^2 } hitcount: 4 1890 { pid: 2031, prio: 120, lat: ~ 1887 { pid: 2031, prio: 120, lat: ~ 2^2 } hitcount: 3 1891 { pid: 2029, prio: 120, lat: ~ 1888 { pid: 2029, prio: 120, lat: ~ 2^3 } hitcount: 2 1892 { pid: 2035, prio: 9, lat: ~ 1889 { pid: 2035, prio: 9, lat: ~ 2^3 } hitcount: 41 1893 { pid: 2030, prio: 120, lat: ~ 1890 { pid: 2030, prio: 120, lat: ~ 2^3 } hitcount: 1 1894 { pid: 2032, prio: 9, lat: ~ 1891 { pid: 2032, prio: 9, lat: ~ 2^3 } hitcount: 32 1895 { pid: 2031, prio: 9, lat: ~ 1892 { pid: 2031, prio: 9, lat: ~ 2^3 } hitcount: 44 1896 { pid: 2034, prio: 9, lat: ~ 1893 { pid: 2034, prio: 9, lat: ~ 2^3 } hitcount: 40 1897 { pid: 2030, prio: 9, lat: ~ 1894 { pid: 2030, prio: 9, lat: ~ 2^3 } hitcount: 29 1898 { pid: 2033, prio: 9, lat: ~ 1895 { pid: 2033, prio: 9, lat: ~ 2^3 } hitcount: 31 1899 { pid: 2029, prio: 9, lat: ~ 1896 { pid: 2029, prio: 9, lat: ~ 2^3 } hitcount: 31 1900 { pid: 2028, prio: 120, lat: ~ 1897 { pid: 2028, prio: 120, lat: ~ 2^3 } hitcount: 18 1901 { pid: 2031, prio: 120, lat: ~ 1898 { pid: 2031, prio: 120, lat: ~ 2^3 } hitcount: 2 1902 { pid: 2028, prio: 120, lat: ~ 1899 { pid: 2028, prio: 120, lat: ~ 2^4 } hitcount: 1 1903 { pid: 2029, prio: 9, lat: ~ 1900 { pid: 2029, prio: 9, lat: ~ 2^4 } hitcount: 4 1904 { pid: 2031, prio: 120, lat: ~ 1901 { pid: 2031, prio: 120, lat: ~ 2^7 } hitcount: 1 1905 { pid: 2032, prio: 120, lat: ~ 1902 { pid: 2032, prio: 120, lat: ~ 2^7 } hitcount: 1 1906 1903 1907 Totals: 1904 Totals: 1908 Hits: 2122 1905 Hits: 2122 1909 Entries: 30 1906 Entries: 30 1910 Dropped: 0 1907 Dropped: 0 1911 1908 1912 1909 1913 The latency values can also be grouped linear 1910 The latency values can also be grouped linearly by a given size with 1914 the ".buckets" modifier and specify a size (i !! 1911 the ".buckets" modifier and specify a size (in this case groups of 10). 1915 1912 1916 # echo 'hist:keys=pid,prio,lat.buckets=10:s 1913 # echo 'hist:keys=pid,prio,lat.buckets=10:sort=lat' >> \ 1917 /sys/kernel/tracing/events/synthetic/ !! 1914 /sys/kernel/debug/tracing/events/synthetic/wakeup_latency/trigger 1918 1915 1919 # event histogram 1916 # event histogram 1920 # 1917 # 1921 # trigger info: hist:keys=pid,prio,lat.buck 1918 # trigger info: hist:keys=pid,prio,lat.buckets=10:vals=hitcount:sort=lat.buckets=10:size=2048 [active] 1922 # 1919 # 1923 1920 1924 { pid: 2067, prio: 9, lat: ~ 1921 { pid: 2067, prio: 9, lat: ~ 0-9 } hitcount: 220 1925 { pid: 2068, prio: 9, lat: ~ 1922 { pid: 2068, prio: 9, lat: ~ 0-9 } hitcount: 157 1926 { pid: 2070, prio: 9, lat: ~ 1923 { pid: 2070, prio: 9, lat: ~ 0-9 } hitcount: 100 1927 { pid: 2067, prio: 120, lat: ~ 1924 { pid: 2067, prio: 120, lat: ~ 0-9 } hitcount: 6 1928 { pid: 2065, prio: 120, lat: ~ 1925 { pid: 2065, prio: 120, lat: ~ 0-9 } hitcount: 2 1929 { pid: 2066, prio: 120, lat: ~ 1926 { pid: 2066, prio: 120, lat: ~ 0-9 } hitcount: 2 1930 { pid: 2069, prio: 9, lat: ~ 1927 { pid: 2069, prio: 9, lat: ~ 0-9 } hitcount: 122 1931 { pid: 2069, prio: 120, lat: ~ 1928 { pid: 2069, prio: 120, lat: ~ 0-9 } hitcount: 8 1932 { pid: 2070, prio: 120, lat: ~ 1929 { pid: 2070, prio: 120, lat: ~ 0-9 } hitcount: 1 1933 { pid: 2068, prio: 120, lat: ~ 1930 { pid: 2068, prio: 120, lat: ~ 0-9 } hitcount: 7 1934 { pid: 2066, prio: 9, lat: ~ 1931 { pid: 2066, prio: 9, lat: ~ 0-9 } hitcount: 365 1935 { pid: 2064, prio: 120, lat: ~ 1932 { pid: 2064, prio: 120, lat: ~ 0-9 } hitcount: 35 1936 { pid: 2065, prio: 9, lat: ~ 1933 { pid: 2065, prio: 9, lat: ~ 0-9 } hitcount: 998 1937 { pid: 2071, prio: 9, lat: ~ 1934 { pid: 2071, prio: 9, lat: ~ 0-9 } hitcount: 85 1938 { pid: 2065, prio: 9, lat: ~ 1935 { pid: 2065, prio: 9, lat: ~ 10-19 } hitcount: 2 1939 { pid: 2064, prio: 120, lat: ~ 1936 { pid: 2064, prio: 120, lat: ~ 10-19 } hitcount: 2 1940 1937 1941 Totals: 1938 Totals: 1942 Hits: 2112 1939 Hits: 2112 1943 Entries: 16 1940 Entries: 16 1944 Dropped: 0 1941 Dropped: 0 1945 1942 1946 To save stacktraces, create a synthetic event << 1947 or even just "long[]". For example, to see ho << 1948 uninterruptible state:: << 1949 << 1950 # cd /sys/kernel/tracing << 1951 # echo 's:block_lat pid_t pid; u64 delta; u << 1952 # echo 'hist:keys=next_pid:ts=common_timest << 1953 # echo 'hist:keys=prev_pid:delta=common_tim << 1954 # echo 1 > events/synthetic/block_lat/enabl << 1955 # cat trace << 1956 << 1957 # tracer: nop << 1958 # << 1959 # entries-in-buffer/entries-written: 2/2 << 1960 # << 1961 # _-----=> i << 1962 # / _----=> n << 1963 # | / _---=> h << 1964 # || / _--=> p << 1965 # ||| / _-=> m << 1966 # |||| / d << 1967 # TASK-PID CPU# ||||| TIMES << 1968 # | | | ||||| | << 1969 <idle>-0 [005] d..4. 521. << 1970 => __schedule+0x448/0x7b0 << 1971 => schedule+0x5a/0xb0 << 1972 => io_schedule+0x42/0x70 << 1973 => bit_wait_io+0xd/0x60 << 1974 => __wait_on_bit+0x4b/0x140 << 1975 => out_of_line_wait_on_bit+0x91/0xb0 << 1976 => jbd2_journal_commit_transaction+0x1679/0 << 1977 => kjournald2+0xa9/0x280 << 1978 => kthread+0xe9/0x110 << 1979 => ret_from_fork+0x2c/0x50 << 1980 << 1981 <...>-2 [004] d..4. 525. << 1982 => __schedule+0x448/0x7b0 << 1983 => schedule+0x5a/0xb0 << 1984 => schedule_timeout+0x11a/0x150 << 1985 => wait_for_completion_killable+0x144/0x1f0 << 1986 => __kthread_create_on_node+0xe7/0x1e0 << 1987 => kthread_create_on_node+0x51/0x70 << 1988 => create_worker+0xcc/0x1a0 << 1989 => worker_thread+0x2ad/0x380 << 1990 => kthread+0xe9/0x110 << 1991 => ret_from_fork+0x2c/0x50 << 1992 << 1993 A synthetic event that has a stacktrace field << 1994 histogram:: << 1995 << 1996 # echo 'hist:keys=delta.buckets=100,stack.s << 1997 # cat events/synthetic/block_lat/hist << 1998 << 1999 # event histogram << 2000 # << 2001 # trigger info: hist:keys=delta.buckets=100 << 2002 # << 2003 { delta: ~ 0-99, stack.stacktrace _ << 2004 schedule+0x6b/0x110 << 2005 io_schedule+0x46/0x80 << 2006 bit_wait_io+0x11/0x80 << 2007 __wait_on_bit+0x4e/0x120 << 2008 out_of_line_wait_on_bit+0x8d/0xb0 << 2009 __wait_on_buffer+0x33/0x40 << 2010 jbd2_journal_commit_transaction+0x15 << 2011 kjournald2+0xab/0x270 << 2012 kthread+0xfa/0x130 << 2013 ret_from_fork+0x29/0x50 << 2014 } hitcount: 1 << 2015 { delta: ~ 0-99, stack.stacktrace _ << 2016 schedule+0x6b/0x110 << 2017 io_schedule+0x46/0x80 << 2018 rq_qos_wait+0xd0/0x170 << 2019 wbt_wait+0x9e/0xf0 << 2020 __rq_qos_throttle+0x25/0x40 << 2021 blk_mq_submit_bio+0x2c3/0x5b0 << 2022 __submit_bio+0xff/0x190 << 2023 submit_bio_noacct_nocheck+0x25b/0x2b << 2024 submit_bio_noacct+0x20b/0x600 << 2025 submit_bio+0x28/0x90 << 2026 ext4_bio_write_page+0x1e0/0x8c0 << 2027 mpage_submit_page+0x60/0x80 << 2028 mpage_process_page_bufs+0x16c/0x180 << 2029 mpage_prepare_extent_to_map+0x23f/0x << 2030 } hitcount: 1 << 2031 { delta: ~ 0-99, stack.stacktrace _ << 2032 schedule+0x6b/0x110 << 2033 schedule_hrtimeout_range_clock+0x97/ << 2034 schedule_hrtimeout_range+0x13/0x20 << 2035 usleep_range_state+0x65/0x90 << 2036 __intel_wait_for_register+0x1c1/0x23 << 2037 intel_psr_wait_for_idle_locked+0x171 << 2038 intel_pipe_update_start+0x169/0x360 << 2039 intel_update_crtc+0x112/0x490 [i915] << 2040 skl_commit_modeset_enables+0x199/0x6 << 2041 intel_atomic_commit_tail+0x7c4/0x108 << 2042 intel_atomic_commit_work+0x12/0x20 [ << 2043 process_one_work+0x21c/0x3f0 << 2044 worker_thread+0x50/0x3e0 << 2045 kthread+0xfa/0x130 << 2046 } hitcount: 3 << 2047 { delta: ~ 0-99, stack.stacktrace _ << 2048 schedule+0x6b/0x110 << 2049 schedule_timeout+0x11e/0x160 << 2050 __wait_for_common+0x8f/0x190 << 2051 wait_for_completion+0x24/0x30 << 2052 __flush_work.isra.0+0x1cc/0x360 << 2053 flush_work+0xe/0x20 << 2054 drm_mode_rmfb+0x18b/0x1d0 [drm] << 2055 drm_mode_rmfb_ioctl+0x10/0x20 [drm] << 2056 drm_ioctl_kernel+0xb8/0x150 [drm] << 2057 drm_ioctl+0x243/0x560 [drm] << 2058 __x64_sys_ioctl+0x92/0xd0 << 2059 do_syscall_64+0x59/0x90 << 2060 entry_SYSCALL_64_after_hwframe+0x72/ << 2061 } hitcount: 1 << 2062 { delta: ~ 0-99, stack.stacktrace _ << 2063 schedule+0x6b/0x110 << 2064 schedule_timeout+0x87/0x160 << 2065 __wait_for_common+0x8f/0x190 << 2066 wait_for_completion_timeout+0x1d/0x3 << 2067 drm_atomic_helper_wait_for_flip_done << 2068 intel_atomic_commit_tail+0x8ce/0x108 << 2069 intel_atomic_commit_work+0x12/0x20 [ << 2070 process_one_work+0x21c/0x3f0 << 2071 worker_thread+0x50/0x3e0 << 2072 kthread+0xfa/0x130 << 2073 ret_from_fork+0x29/0x50 << 2074 } hitcount: 1 << 2075 { delta: ~ 100-199, stack.stacktrace << 2076 schedule+0x6b/0x110 << 2077 schedule_hrtimeout_range_clock+0x97/ << 2078 schedule_hrtimeout_range+0x13/0x20 << 2079 usleep_range_state+0x65/0x90 << 2080 pci_set_low_power_state+0x17f/0x1f0 << 2081 pci_set_power_state+0x49/0x250 << 2082 pci_finish_runtime_suspend+0x4a/0x90 << 2083 pci_pm_runtime_suspend+0xcb/0x1b0 << 2084 __rpm_callback+0x48/0x120 << 2085 rpm_callback+0x67/0x70 << 2086 rpm_suspend+0x167/0x780 << 2087 rpm_idle+0x25a/0x380 << 2088 pm_runtime_work+0x93/0xc0 << 2089 process_one_work+0x21c/0x3f0 << 2090 } hitcount: 1 << 2091 << 2092 Totals: << 2093 Hits: 10 << 2094 Entries: 7 << 2095 Dropped: 0 << 2096 << 2097 2.2.3 Hist trigger 'handlers' and 'actions' 1943 2.2.3 Hist trigger 'handlers' and 'actions' 2098 ------------------------------------------- 1944 ------------------------------------------- 2099 1945 2100 A hist trigger 'action' is a function that's 1946 A hist trigger 'action' is a function that's executed (in most cases 2101 conditionally) whenever a histogram entry is 1947 conditionally) whenever a histogram entry is added or updated. 2102 1948 2103 When a histogram entry is added or updated, a 1949 When a histogram entry is added or updated, a hist trigger 'handler' 2104 is what decides whether the corresponding act 1950 is what decides whether the corresponding action is actually invoked 2105 or not. 1951 or not. 2106 1952 2107 Hist trigger handlers and actions are paired 1953 Hist trigger handlers and actions are paired together in the general 2108 form: 1954 form: 2109 1955 2110 <handler>.<action> 1956 <handler>.<action> 2111 1957 2112 To specify a handler.action pair for a given 1958 To specify a handler.action pair for a given event, simply specify 2113 that handler.action pair between colons in th 1959 that handler.action pair between colons in the hist trigger 2114 specification. 1960 specification. 2115 1961 2116 In theory, any handler can be combined with a 1962 In theory, any handler can be combined with any action, but in 2117 practice, not every handler.action combinatio 1963 practice, not every handler.action combination is currently supported; 2118 if a given handler.action combination isn't s 1964 if a given handler.action combination isn't supported, the hist 2119 trigger will fail with -EINVAL; 1965 trigger will fail with -EINVAL; 2120 1966 2121 The default 'handler.action' if none is expli 1967 The default 'handler.action' if none is explicitly specified is as it 2122 always has been, to simply update the set of 1968 always has been, to simply update the set of values associated with an 2123 entry. Some applications, however, may want 1969 entry. Some applications, however, may want to perform additional 2124 actions at that point, such as generate anoth 1970 actions at that point, such as generate another event, or compare and 2125 save a maximum. 1971 save a maximum. 2126 1972 2127 The supported handlers and actions are listed 1973 The supported handlers and actions are listed below, and each is 2128 described in more detail in the following par 1974 described in more detail in the following paragraphs, in the context 2129 of descriptions of some common and useful han 1975 of descriptions of some common and useful handler.action combinations. 2130 1976 2131 The available handlers are: 1977 The available handlers are: 2132 1978 2133 - onmatch(matching.event) - invoke actio 1979 - onmatch(matching.event) - invoke action on any addition or update 2134 - onmax(var) - invoke actio 1980 - onmax(var) - invoke action if var exceeds current max 2135 - onchange(var) - invoke actio 1981 - onchange(var) - invoke action if var changes 2136 1982 2137 The available actions are: 1983 The available actions are: 2138 1984 2139 - trace(<synthetic_event_name>,param list) 1985 - trace(<synthetic_event_name>,param list) - generate synthetic event 2140 - save(field,...) 1986 - save(field,...) - save current event fields 2141 - snapshot() 1987 - snapshot() - snapshot the trace buffer 2142 1988 2143 The following commonly-used handler.action pa 1989 The following commonly-used handler.action pairs are available: 2144 1990 2145 - onmatch(matching.event).trace(<synthetic_ 1991 - onmatch(matching.event).trace(<synthetic_event_name>,param list) 2146 1992 2147 The 'onmatch(matching.event).trace(<synth 1993 The 'onmatch(matching.event).trace(<synthetic_event_name>,param 2148 list)' hist trigger action is invoked whe 1994 list)' hist trigger action is invoked whenever an event matches 2149 and the histogram entry would be added or 1995 and the histogram entry would be added or updated. It causes the 2150 named synthetic event to be generated wit 1996 named synthetic event to be generated with the values given in the 2151 'param list'. The result is the generati 1997 'param list'. The result is the generation of a synthetic event 2152 that consists of the values contained in 1998 that consists of the values contained in those variables at the 2153 time the invoking event was hit. For exa 1999 time the invoking event was hit. For example, if the synthetic 2154 event name is 'wakeup_latency', a wakeup_ 2000 event name is 'wakeup_latency', a wakeup_latency event is 2155 generated using onmatch(event).trace(wake 2001 generated using onmatch(event).trace(wakeup_latency,arg1,arg2). 2156 2002 2157 There is also an equivalent alternative f 2003 There is also an equivalent alternative form available for 2158 generating synthetic events. In this for 2004 generating synthetic events. In this form, the synthetic event 2159 name is used as if it were a function nam 2005 name is used as if it were a function name. For example, using 2160 the 'wakeup_latency' synthetic event name 2006 the 'wakeup_latency' synthetic event name again, the 2161 wakeup_latency event would be generated b 2007 wakeup_latency event would be generated by invoking it as if it 2162 were a function call, with the event fiel 2008 were a function call, with the event field values passed in as 2163 arguments: onmatch(event).wakeup_latency( 2009 arguments: onmatch(event).wakeup_latency(arg1,arg2). The syntax 2164 for this form is: 2010 for this form is: 2165 2011 2166 onmatch(matching.event).<synthetic_even 2012 onmatch(matching.event).<synthetic_event_name>(param list) 2167 2013 2168 In either case, the 'param list' consists 2014 In either case, the 'param list' consists of one or more 2169 parameters which may be either variables 2015 parameters which may be either variables or fields defined on 2170 either the 'matching.event' or the target 2016 either the 'matching.event' or the target event. The variables or 2171 fields specified in the param list may be 2017 fields specified in the param list may be either fully-qualified 2172 or unqualified. If a variable is specifi 2018 or unqualified. If a variable is specified as unqualified, it 2173 must be unique between the two events. A 2019 must be unique between the two events. A field name used as a 2174 param can be unqualified if it refers to 2020 param can be unqualified if it refers to the target event, but 2175 must be fully qualified if it refers to t 2021 must be fully qualified if it refers to the matching event. A 2176 fully-qualified name is of the form 'syst 2022 fully-qualified name is of the form 'system.event_name.$var_name' 2177 or 'system.event_name.field'. 2023 or 'system.event_name.field'. 2178 2024 2179 The 'matching.event' specification is sim 2025 The 'matching.event' specification is simply the fully qualified 2180 event name of the event that matches the 2026 event name of the event that matches the target event for the 2181 onmatch() functionality, in the form 'sys 2027 onmatch() functionality, in the form 'system.event_name'. Histogram 2182 keys of both events are compared to find 2028 keys of both events are compared to find if events match. In case 2183 multiple histogram keys are used, they al 2029 multiple histogram keys are used, they all must match in the specified 2184 order. 2030 order. 2185 2031 2186 Finally, the number and type of variables 2032 Finally, the number and type of variables/fields in the 'param 2187 list' must match the number and types of 2033 list' must match the number and types of the fields in the 2188 synthetic event being generated. 2034 synthetic event being generated. 2189 2035 2190 As an example the below defines a simple 2036 As an example the below defines a simple synthetic event and uses 2191 a variable defined on the sched_wakeup_ne 2037 a variable defined on the sched_wakeup_new event as a parameter 2192 when invoking the synthetic event. Here 2038 when invoking the synthetic event. Here we define the synthetic 2193 event:: 2039 event:: 2194 2040 2195 # echo 'wakeup_new_test pid_t pid' >> \ 2041 # echo 'wakeup_new_test pid_t pid' >> \ 2196 /sys/kernel/tracing/synthetic_ev !! 2042 /sys/kernel/debug/tracing/synthetic_events 2197 2043 2198 # cat /sys/kernel/tracing/synthetic_eve !! 2044 # cat /sys/kernel/debug/tracing/synthetic_events 2199 wakeup_new_test pid_t pid 2045 wakeup_new_test pid_t pid 2200 2046 2201 The following hist trigger both defines t 2047 The following hist trigger both defines the missing testpid 2202 variable and specifies an onmatch() actio 2048 variable and specifies an onmatch() action that generates a 2203 wakeup_new_test synthetic event whenever 2049 wakeup_new_test synthetic event whenever a sched_wakeup_new event 2204 occurs, which because of the 'if comm == 2050 occurs, which because of the 'if comm == "cyclictest"' filter only 2205 happens when the executable is cyclictest 2051 happens when the executable is cyclictest:: 2206 2052 2207 # echo 'hist:keys=$testpid:testpid=pid: 2053 # echo 'hist:keys=$testpid:testpid=pid:onmatch(sched.sched_wakeup_new).\ 2208 wakeup_new_test($testpid) if co 2054 wakeup_new_test($testpid) if comm=="cyclictest"' >> \ 2209 /sys/kernel/tracing/events/sche !! 2055 /sys/kernel/debug/tracing/events/sched/sched_wakeup_new/trigger 2210 2056 2211 Or, equivalently, using the 'trace' keywo !! 2057 Or, equivalently, using the 'trace' keyword syntax: 2212 2058 2213 # echo 'hist:keys=$testpid:testpid=pid: !! 2059 # echo 'hist:keys=$testpid:testpid=pid:onmatch(sched.sched_wakeup_new).\ 2214 trace(wakeup_new_test,$testpid) !! 2060 trace(wakeup_new_test,$testpid) if comm=="cyclictest"' >> \ 2215 /sys/kernel/tracing/events/sche !! 2061 /sys/kernel/debug/tracing/events/sched/sched_wakeup_new/trigger 2216 2062 2217 Creating and displaying a histogram based 2063 Creating and displaying a histogram based on those events is now 2218 just a matter of using the fields and new 2064 just a matter of using the fields and new synthetic event in the 2219 tracing/events/synthetic directory, as us 2065 tracing/events/synthetic directory, as usual:: 2220 2066 2221 # echo 'hist:keys=pid:sort=pid' >> \ 2067 # echo 'hist:keys=pid:sort=pid' >> \ 2222 /sys/kernel/tracing/events/synth !! 2068 /sys/kernel/debug/tracing/events/synthetic/wakeup_new_test/trigger 2223 2069 2224 Running 'cyclictest' should cause wakeup_ 2070 Running 'cyclictest' should cause wakeup_new events to generate 2225 wakeup_new_test synthetic events which sh 2071 wakeup_new_test synthetic events which should result in histogram 2226 output in the wakeup_new_test event's his 2072 output in the wakeup_new_test event's hist file:: 2227 2073 2228 # cat /sys/kernel/tracing/events/synthe !! 2074 # cat /sys/kernel/debug/tracing/events/synthetic/wakeup_new_test/hist 2229 2075 2230 A more typical usage would be to use two 2076 A more typical usage would be to use two events to calculate a 2231 latency. The following example uses a se 2077 latency. The following example uses a set of hist triggers to 2232 produce a 'wakeup_latency' histogram. 2078 produce a 'wakeup_latency' histogram. 2233 2079 2234 First, we define a 'wakeup_latency' synth 2080 First, we define a 'wakeup_latency' synthetic event:: 2235 2081 2236 # echo 'wakeup_latency u64 lat; pid_t p 2082 # echo 'wakeup_latency u64 lat; pid_t pid; int prio' >> \ 2237 /sys/kernel/tracing/synthetic_e !! 2083 /sys/kernel/debug/tracing/synthetic_events 2238 2084 2239 Next, we specify that whenever we see a s 2085 Next, we specify that whenever we see a sched_waking event for a 2240 cyclictest thread, save the timestamp in 2086 cyclictest thread, save the timestamp in a 'ts0' variable:: 2241 2087 2242 # echo 'hist:keys=$saved_pid:saved_pid= 2088 # echo 'hist:keys=$saved_pid:saved_pid=pid:ts0=common_timestamp.usecs \ 2243 if comm=="cyclictest"' >> \ 2089 if comm=="cyclictest"' >> \ 2244 /sys/kernel/tracing/events/sche !! 2090 /sys/kernel/debug/tracing/events/sched/sched_waking/trigger 2245 2091 2246 Then, when the corresponding thread is ac 2092 Then, when the corresponding thread is actually scheduled onto the 2247 CPU by a sched_switch event (saved_pid ma 2093 CPU by a sched_switch event (saved_pid matches next_pid), calculate 2248 the latency and use that along with anoth 2094 the latency and use that along with another variable and an event field 2249 to generate a wakeup_latency synthetic ev 2095 to generate a wakeup_latency synthetic event:: 2250 2096 2251 # echo 'hist:keys=next_pid:wakeup_lat=c 2097 # echo 'hist:keys=next_pid:wakeup_lat=common_timestamp.usecs-$ts0:\ 2252 onmatch(sched.sched_waking).wak 2098 onmatch(sched.sched_waking).wakeup_latency($wakeup_lat,\ 2253 $saved_pid,next_prio) i 2099 $saved_pid,next_prio) if next_comm=="cyclictest"' >> \ 2254 /sys/kernel/tracing/events/sche !! 2100 /sys/kernel/debug/tracing/events/sched/sched_switch/trigger 2255 2101 2256 We also need to create a histogram on the 2102 We also need to create a histogram on the wakeup_latency synthetic 2257 event in order to aggregate the generated 2103 event in order to aggregate the generated synthetic event data:: 2258 2104 2259 # echo 'hist:keys=pid,prio,lat:sort=pid 2105 # echo 'hist:keys=pid,prio,lat:sort=pid,lat' >> \ 2260 /sys/kernel/tracing/events/synt !! 2106 /sys/kernel/debug/tracing/events/synthetic/wakeup_latency/trigger 2261 2107 2262 Finally, once we've run cyclictest to act 2108 Finally, once we've run cyclictest to actually generate some 2263 events, we can see the output by looking 2109 events, we can see the output by looking at the wakeup_latency 2264 synthetic event's hist file:: 2110 synthetic event's hist file:: 2265 2111 2266 # cat /sys/kernel/tracing/events/synthe !! 2112 # cat /sys/kernel/debug/tracing/events/synthetic/wakeup_latency/hist 2267 2113 2268 - onmax(var).save(field,.. .) 2114 - onmax(var).save(field,.. .) 2269 2115 2270 The 'onmax(var).save(field,...)' hist tri 2116 The 'onmax(var).save(field,...)' hist trigger action is invoked 2271 whenever the value of 'var' associated wi 2117 whenever the value of 'var' associated with a histogram entry 2272 exceeds the current maximum contained in 2118 exceeds the current maximum contained in that variable. 2273 2119 2274 The end result is that the trace event fi 2120 The end result is that the trace event fields specified as the 2275 onmax.save() params will be saved if 'var 2121 onmax.save() params will be saved if 'var' exceeds the current 2276 maximum for that hist trigger entry. Thi 2122 maximum for that hist trigger entry. This allows context from the 2277 event that exhibited the new maximum to b 2123 event that exhibited the new maximum to be saved for later 2278 reference. When the histogram is display 2124 reference. When the histogram is displayed, additional fields 2279 displaying the saved values will be print 2125 displaying the saved values will be printed. 2280 2126 2281 As an example the below defines a couple 2127 As an example the below defines a couple of hist triggers, one for 2282 sched_waking and another for sched_switch 2128 sched_waking and another for sched_switch, keyed on pid. Whenever 2283 a sched_waking occurs, the timestamp is s 2129 a sched_waking occurs, the timestamp is saved in the entry 2284 corresponding to the current pid, and whe 2130 corresponding to the current pid, and when the scheduler switches 2285 back to that pid, the timestamp differenc 2131 back to that pid, the timestamp difference is calculated. If the 2286 resulting latency, stored in wakeup_lat, 2132 resulting latency, stored in wakeup_lat, exceeds the current 2287 maximum latency, the values specified in 2133 maximum latency, the values specified in the save() fields are 2288 recorded:: 2134 recorded:: 2289 2135 2290 # echo 'hist:keys=pid:ts0=common_timest 2136 # echo 'hist:keys=pid:ts0=common_timestamp.usecs \ 2291 if comm=="cyclictest"' >> \ 2137 if comm=="cyclictest"' >> \ 2292 /sys/kernel/tracing/events/sche !! 2138 /sys/kernel/debug/tracing/events/sched/sched_waking/trigger 2293 2139 2294 # echo 'hist:keys=next_pid:\ 2140 # echo 'hist:keys=next_pid:\ 2295 wakeup_lat=common_timestamp.use 2141 wakeup_lat=common_timestamp.usecs-$ts0:\ 2296 onmax($wakeup_lat).save(next_co 2142 onmax($wakeup_lat).save(next_comm,prev_pid,prev_prio,prev_comm) \ 2297 if next_comm=="cyclictest"' >> 2143 if next_comm=="cyclictest"' >> \ 2298 /sys/kernel/tracing/events/sche !! 2144 /sys/kernel/debug/tracing/events/sched/sched_switch/trigger 2299 2145 2300 When the histogram is displayed, the max 2146 When the histogram is displayed, the max value and the saved 2301 values corresponding to the max are displ 2147 values corresponding to the max are displayed following the rest 2302 of the fields:: 2148 of the fields:: 2303 2149 2304 # cat /sys/kernel/tracing/events/sched/ !! 2150 # cat /sys/kernel/debug/tracing/events/sched/sched_switch/hist 2305 { next_pid: 2255 } hitcount: 2151 { next_pid: 2255 } hitcount: 239 2306 common_timestamp-ts0: 0 2152 common_timestamp-ts0: 0 2307 max: 27 2153 max: 27 2308 next_comm: cyclictest 2154 next_comm: cyclictest 2309 prev_pid: 0 prev_prio: 2155 prev_pid: 0 prev_prio: 120 prev_comm: swapper/1 2310 2156 2311 { next_pid: 2256 } hitcount: 2157 { next_pid: 2256 } hitcount: 2355 2312 common_timestamp-ts0: 0 2158 common_timestamp-ts0: 0 2313 max: 49 next_comm: cyclict 2159 max: 49 next_comm: cyclictest 2314 prev_pid: 0 prev_prio: 2160 prev_pid: 0 prev_prio: 120 prev_comm: swapper/0 2315 2161 2316 Totals: 2162 Totals: 2317 Hits: 12970 2163 Hits: 12970 2318 Entries: 2 2164 Entries: 2 2319 Dropped: 0 2165 Dropped: 0 2320 2166 2321 - onmax(var).snapshot() 2167 - onmax(var).snapshot() 2322 2168 2323 The 'onmax(var).snapshot()' hist trigger 2169 The 'onmax(var).snapshot()' hist trigger action is invoked 2324 whenever the value of 'var' associated wi 2170 whenever the value of 'var' associated with a histogram entry 2325 exceeds the current maximum contained in 2171 exceeds the current maximum contained in that variable. 2326 2172 2327 The end result is that a global snapshot 2173 The end result is that a global snapshot of the trace buffer will 2328 be saved in the tracing/snapshot file if 2174 be saved in the tracing/snapshot file if 'var' exceeds the current 2329 maximum for any hist trigger entry. 2175 maximum for any hist trigger entry. 2330 2176 2331 Note that in this case the maximum is a g 2177 Note that in this case the maximum is a global maximum for the 2332 current trace instance, which is the maxi 2178 current trace instance, which is the maximum across all buckets of 2333 the histogram. The key of the specific t 2179 the histogram. The key of the specific trace event that caused 2334 the global maximum and the global maximum 2180 the global maximum and the global maximum itself are displayed, 2335 along with a message stating that a snaps 2181 along with a message stating that a snapshot has been taken and 2336 where to find it. The user can use the k 2182 where to find it. The user can use the key information displayed 2337 to locate the corresponding bucket in the 2183 to locate the corresponding bucket in the histogram for even more 2338 detail. 2184 detail. 2339 2185 2340 As an example the below defines a couple 2186 As an example the below defines a couple of hist triggers, one for 2341 sched_waking and another for sched_switch 2187 sched_waking and another for sched_switch, keyed on pid. Whenever 2342 a sched_waking event occurs, the timestam 2188 a sched_waking event occurs, the timestamp is saved in the entry 2343 corresponding to the current pid, and whe 2189 corresponding to the current pid, and when the scheduler switches 2344 back to that pid, the timestamp differenc 2190 back to that pid, the timestamp difference is calculated. If the 2345 resulting latency, stored in wakeup_lat, 2191 resulting latency, stored in wakeup_lat, exceeds the current 2346 maximum latency, a snapshot is taken. As 2192 maximum latency, a snapshot is taken. As part of the setup, all 2347 the scheduler events are also enabled, wh 2193 the scheduler events are also enabled, which are the events that 2348 will show up in the snapshot when it is t !! 2194 will show up in the snapshot when it is taken at some point: 2349 << 2350 # echo 1 > /sys/kernel/tracing/events/s << 2351 2195 2352 # echo 'hist:keys=pid:ts0=common_timest !! 2196 # echo 1 > /sys/kernel/debug/tracing/events/sched/enable 2353 if comm=="cyclictest"' >> \ << 2354 /sys/kernel/tracing/events/sche << 2355 2197 2356 # echo 'hist:keys=next_pid:wakeup_lat=c !! 2198 # echo 'hist:keys=pid:ts0=common_timestamp.usecs \ 2357 onmax($wakeup_lat).save(next_pr !! 2199 if comm=="cyclictest"' >> \ 2358 prev_comm):onmax($wakeup_lat).s !! 2200 /sys/kernel/debug/tracing/events/sched/sched_waking/trigger 2359 if next_comm=="cyclictest"' >> !! 2201 2360 /sys/kernel/tracing/events/sche !! 2202 # echo 'hist:keys=next_pid:wakeup_lat=common_timestamp.usecs-$ts0: \ >> 2203 onmax($wakeup_lat).save(next_prio,next_comm,prev_pid,prev_prio, \ >> 2204 prev_comm):onmax($wakeup_lat).snapshot() \ >> 2205 if next_comm=="cyclictest"' >> \ >> 2206 /sys/kernel/debug/tracing/events/sched/sched_switch/trigger 2361 2207 2362 When the histogram is displayed, for each 2208 When the histogram is displayed, for each bucket the max value 2363 and the saved values corresponding to the 2209 and the saved values corresponding to the max are displayed 2364 following the rest of the fields. 2210 following the rest of the fields. 2365 2211 2366 If a snapshot was taken, there is also a 2212 If a snapshot was taken, there is also a message indicating that, 2367 along with the value and event that trigg !! 2213 along with the value and event that triggered the global maximum: 2368 2214 2369 # cat /sys/kernel/tracing/events/sched/ !! 2215 # cat /sys/kernel/debug/tracing/events/sched/sched_switch/hist 2370 { next_pid: 2101 } hitcount: !! 2216 { next_pid: 2101 } hitcount: 200 2371 max: 52 next_prio: !! 2217 max: 52 next_prio: 120 next_comm: cyclictest \ 2372 prev_pid: 0 prev_prio: !! 2218 prev_pid: 0 prev_prio: 120 prev_comm: swapper/6 2373 2219 2374 { next_pid: 2103 } hitcount: !! 2220 { next_pid: 2103 } hitcount: 1326 2375 max: 572 next_prio: !! 2221 max: 572 next_prio: 19 next_comm: cyclictest \ 2376 prev_pid: 0 prev_prio: !! 2222 prev_pid: 0 prev_prio: 120 prev_comm: swapper/1 2377 2223 2378 { next_pid: 2102 } hitcount: !! 2224 { next_pid: 2102 } hitcount: 1982 \ 2379 max: 74 next_prio: !! 2225 max: 74 next_prio: 19 next_comm: cyclictest \ 2380 prev_pid: 0 prev_prio: !! 2226 prev_pid: 0 prev_prio: 120 prev_comm: swapper/5 2381 << 2382 Snapshot taken (see tracing/snapshot). << 2383 triggering value { onmax($wakeup_la << 2384 triggered by event with key: { next << 2385 2227 2386 Totals: !! 2228 Snapshot taken (see tracing/snapshot). Details: 2387 Hits: 3508 !! 2229 triggering value { onmax($wakeup_lat) }: 572 \ 2388 Entries: 3 !! 2230 triggered by event with key: { next_pid: 2103 } 2389 Dropped: 0 !! 2231 >> 2232 Totals: >> 2233 Hits: 3508 >> 2234 Entries: 3 >> 2235 Dropped: 0 2390 2236 2391 In the above case, the event that trigger 2237 In the above case, the event that triggered the global maximum has 2392 the key with next_pid == 2103. If you lo 2238 the key with next_pid == 2103. If you look at the bucket that has 2393 2103 as the key, you'll find the addition 2239 2103 as the key, you'll find the additional values save()'d along 2394 with the local maximum for that bucket, w 2240 with the local maximum for that bucket, which should be the same 2395 as the global maximum (since that was the 2241 as the global maximum (since that was the same value that 2396 triggered the global snapshot). 2242 triggered the global snapshot). 2397 2243 2398 And finally, looking at the snapshot data 2244 And finally, looking at the snapshot data should show at or near 2399 the end the event that triggered the snap 2245 the end the event that triggered the snapshot (in this case you 2400 can verify the timestamps between the sch 2246 can verify the timestamps between the sched_waking and 2401 sched_switch events, which should match t 2247 sched_switch events, which should match the time displayed in the 2402 global maximum):: 2248 global maximum):: 2403 2249 2404 # cat /sys/kernel/tracing/snapshot !! 2250 # cat /sys/kernel/debug/tracing/snapshot 2405 2251 2406 <...>-2103 [005] d..3 309.873125: 2252 <...>-2103 [005] d..3 309.873125: sched_switch: prev_comm=cyclictest prev_pid=2103 prev_prio=19 prev_state=D ==> next_comm=swapper/5 next_pid=0 next_prio=120 2407 <idle>-0 [005] d.h3 309.873611 2253 <idle>-0 [005] d.h3 309.873611: sched_waking: comm=cyclictest pid=2102 prio=19 target_cpu=005 2408 <idle>-0 [005] dNh4 309.873613 2254 <idle>-0 [005] dNh4 309.873613: sched_wakeup: comm=cyclictest pid=2102 prio=19 target_cpu=005 2409 <idle>-0 [005] d..3 309.873616 2255 <idle>-0 [005] d..3 309.873616: sched_switch: prev_comm=swapper/5 prev_pid=0 prev_prio=120 prev_state=S ==> next_comm=cyclictest next_pid=2102 next_prio=19 2410 <...>-2102 [005] d..3 309.873625: 2256 <...>-2102 [005] d..3 309.873625: sched_switch: prev_comm=cyclictest prev_pid=2102 prev_prio=19 prev_state=D ==> next_comm=swapper/5 next_pid=0 next_prio=120 2411 <idle>-0 [005] d.h3 309.874624 2257 <idle>-0 [005] d.h3 309.874624: sched_waking: comm=cyclictest pid=2102 prio=19 target_cpu=005 2412 <idle>-0 [005] dNh4 309.874626 2258 <idle>-0 [005] dNh4 309.874626: sched_wakeup: comm=cyclictest pid=2102 prio=19 target_cpu=005 2413 <idle>-0 [005] dNh3 309.874628 2259 <idle>-0 [005] dNh3 309.874628: sched_waking: comm=cyclictest pid=2103 prio=19 target_cpu=005 2414 <idle>-0 [005] dNh4 309.874630 2260 <idle>-0 [005] dNh4 309.874630: sched_wakeup: comm=cyclictest pid=2103 prio=19 target_cpu=005 2415 <idle>-0 [005] d..3 309.874633 2261 <idle>-0 [005] d..3 309.874633: sched_switch: prev_comm=swapper/5 prev_pid=0 prev_prio=120 prev_state=S ==> next_comm=cyclictest next_pid=2102 next_prio=19 2416 <idle>-0 [004] d.h3 309.874757 2262 <idle>-0 [004] d.h3 309.874757: sched_waking: comm=gnome-terminal- pid=1699 prio=120 target_cpu=004 2417 <idle>-0 [004] dNh4 309.874762 2263 <idle>-0 [004] dNh4 309.874762: sched_wakeup: comm=gnome-terminal- pid=1699 prio=120 target_cpu=004 2418 <idle>-0 [004] d..3 309.874766 2264 <idle>-0 [004] d..3 309.874766: sched_switch: prev_comm=swapper/4 prev_pid=0 prev_prio=120 prev_state=S ==> next_comm=gnome-terminal- next_pid=1699 next_prio=120 2419 gnome-terminal--1699 [004] d.h2 309.8 2265 gnome-terminal--1699 [004] d.h2 309.874941: sched_stat_runtime: comm=gnome-terminal- pid=1699 runtime=180706 [ns] vruntime=1126870572 [ns] 2420 <idle>-0 [003] d.s4 309.874956 2266 <idle>-0 [003] d.s4 309.874956: sched_waking: comm=rcu_sched pid=9 prio=120 target_cpu=007 2421 <idle>-0 [003] d.s5 309.874960 2267 <idle>-0 [003] d.s5 309.874960: sched_wake_idle_without_ipi: cpu=7 2422 <idle>-0 [003] d.s5 309.874961 2268 <idle>-0 [003] d.s5 309.874961: sched_wakeup: comm=rcu_sched pid=9 prio=120 target_cpu=007 2423 <idle>-0 [007] d..3 309.874963 2269 <idle>-0 [007] d..3 309.874963: sched_switch: prev_comm=swapper/7 prev_pid=0 prev_prio=120 prev_state=S ==> next_comm=rcu_sched next_pid=9 next_prio=120 2424 rcu_sched-9 [007] d..3 309.874973 2270 rcu_sched-9 [007] d..3 309.874973: sched_stat_runtime: comm=rcu_sched pid=9 runtime=13646 [ns] vruntime=22531430286 [ns] 2425 rcu_sched-9 [007] d..3 309.874978 2271 rcu_sched-9 [007] d..3 309.874978: sched_switch: prev_comm=rcu_sched prev_pid=9 prev_prio=120 prev_state=R+ ==> next_comm=swapper/7 next_pid=0 next_prio=120 2426 <...>-2102 [005] d..4 309.874994 2272 <...>-2102 [005] d..4 309.874994: sched_migrate_task: comm=cyclictest pid=2103 prio=19 orig_cpu=5 dest_cpu=1 2427 <...>-2102 [005] d..4 309.875185 2273 <...>-2102 [005] d..4 309.875185: sched_wake_idle_without_ipi: cpu=1 2428 <idle>-0 [001] d..3 309.875200 2274 <idle>-0 [001] d..3 309.875200: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=120 prev_state=S ==> next_comm=cyclictest next_pid=2103 next_prio=19 2429 2275 2430 - onchange(var).save(field,.. .) 2276 - onchange(var).save(field,.. .) 2431 2277 2432 The 'onchange(var).save(field,...)' hist 2278 The 'onchange(var).save(field,...)' hist trigger action is invoked 2433 whenever the value of 'var' associated wi 2279 whenever the value of 'var' associated with a histogram entry 2434 changes. 2280 changes. 2435 2281 2436 The end result is that the trace event fi 2282 The end result is that the trace event fields specified as the 2437 onchange.save() params will be saved if ' 2283 onchange.save() params will be saved if 'var' changes for that 2438 hist trigger entry. This allows context 2284 hist trigger entry. This allows context from the event that 2439 changed the value to be saved for later r 2285 changed the value to be saved for later reference. When the 2440 histogram is displayed, additional fields 2286 histogram is displayed, additional fields displaying the saved 2441 values will be printed. 2287 values will be printed. 2442 2288 2443 - onchange(var).snapshot() 2289 - onchange(var).snapshot() 2444 2290 2445 The 'onchange(var).snapshot()' hist trigg 2291 The 'onchange(var).snapshot()' hist trigger action is invoked 2446 whenever the value of 'var' associated wi 2292 whenever the value of 'var' associated with a histogram entry 2447 changes. 2293 changes. 2448 2294 2449 The end result is that a global snapshot 2295 The end result is that a global snapshot of the trace buffer will 2450 be saved in the tracing/snapshot file if 2296 be saved in the tracing/snapshot file if 'var' changes for any 2451 hist trigger entry. 2297 hist trigger entry. 2452 2298 2453 Note that in this case the changed value 2299 Note that in this case the changed value is a global variable 2454 associated with current trace instance. 2300 associated with current trace instance. The key of the specific 2455 trace event that caused the value to chan 2301 trace event that caused the value to change and the global value 2456 itself are displayed, along with a messag 2302 itself are displayed, along with a message stating that a snapshot 2457 has been taken and where to find it. The 2303 has been taken and where to find it. The user can use the key 2458 information displayed to locate the corre 2304 information displayed to locate the corresponding bucket in the 2459 histogram for even more detail. 2305 histogram for even more detail. 2460 2306 2461 As an example the below defines a hist tr 2307 As an example the below defines a hist trigger on the tcp_probe 2462 event, keyed on dport. Whenever a tcp_pr 2308 event, keyed on dport. Whenever a tcp_probe event occurs, the 2463 cwnd field is checked against the current 2309 cwnd field is checked against the current value stored in the 2464 $cwnd variable. If the value has changed 2310 $cwnd variable. If the value has changed, a snapshot is taken. 2465 As part of the setup, all the scheduler a 2311 As part of the setup, all the scheduler and tcp events are also 2466 enabled, which are the events that will s 2312 enabled, which are the events that will show up in the snapshot 2467 when it is taken at some point:: !! 2313 when it is taken at some point: 2468 2314 2469 # echo 1 > /sys/kernel/tracing/events/s !! 2315 # echo 1 > /sys/kernel/debug/tracing/events/sched/enable 2470 # echo 1 > /sys/kernel/tracing/events/t !! 2316 # echo 1 > /sys/kernel/debug/tracing/events/tcp/enable 2471 2317 2472 # echo 'hist:keys=dport:cwnd=snd_cwnd: !! 2318 # echo 'hist:keys=dport:cwnd=snd_cwnd: \ 2473 onchange($cwnd).save(snd_wnd,sr !! 2319 onchange($cwnd).save(snd_wnd,srtt,rcv_wnd): \ 2474 onchange($cwnd).snapshot()' >> !! 2320 onchange($cwnd).snapshot()' >> \ 2475 /sys/kernel/tracing/events/tcp/ !! 2321 /sys/kernel/debug/tracing/events/tcp/tcp_probe/trigger 2476 2322 2477 When the histogram is displayed, for each 2323 When the histogram is displayed, for each bucket the tracked value 2478 and the saved values corresponding to tha 2324 and the saved values corresponding to that value are displayed 2479 following the rest of the fields. 2325 following the rest of the fields. 2480 2326 2481 If a snapshot was taken, there is also a 2327 If a snapshot was taken, there is also a message indicating that, 2482 along with the value and event that trigg 2328 along with the value and event that triggered the snapshot:: 2483 2329 2484 # cat /sys/kernel/tracing/events/tcp/tc !! 2330 # cat /sys/kernel/debug/tracing/events/tcp/tcp_probe/hist 2485 2331 2486 { dport: 1521 } hitcount: 2332 { dport: 1521 } hitcount: 8 2487 changed: 10 snd_wnd: 35 2333 changed: 10 snd_wnd: 35456 srtt: 154262 rcv_wnd: 42112 2488 2334 2489 { dport: 80 } hitcount: 2335 { dport: 80 } hitcount: 23 2490 changed: 10 snd_wnd: 28 2336 changed: 10 snd_wnd: 28960 srtt: 19604 rcv_wnd: 29312 2491 2337 2492 { dport: 9001 } hitcount: 2338 { dport: 9001 } hitcount: 172 2493 changed: 10 snd_wnd: 48 2339 changed: 10 snd_wnd: 48384 srtt: 260444 rcv_wnd: 55168 2494 2340 2495 { dport: 443 } hitcount: 2341 { dport: 443 } hitcount: 211 2496 changed: 10 snd_wnd: 26 2342 changed: 10 snd_wnd: 26960 srtt: 17379 rcv_wnd: 28800 2497 2343 2498 Snapshot taken (see tracing/snapshot). !! 2344 Snapshot taken (see tracing/snapshot). Details:: 2499 2345 2500 triggering value { onchange($cwnd) !! 2346 triggering value { onchange($cwnd) }: 10 2501 triggered by event with key: { dpor !! 2347 triggered by event with key: { dport: 80 } 2502 2348 2503 Totals: 2349 Totals: 2504 Hits: 414 2350 Hits: 414 2505 Entries: 4 2351 Entries: 4 2506 Dropped: 0 2352 Dropped: 0 2507 2353 2508 In the above case, the event that trigger 2354 In the above case, the event that triggered the snapshot has the 2509 key with dport == 80. If you look at the 2355 key with dport == 80. If you look at the bucket that has 80 as 2510 the key, you'll find the additional value 2356 the key, you'll find the additional values save()'d along with the 2511 changed value for that bucket, which shou 2357 changed value for that bucket, which should be the same as the 2512 global changed value (since that was the 2358 global changed value (since that was the same value that triggered 2513 the global snapshot). 2359 the global snapshot). 2514 2360 2515 And finally, looking at the snapshot data 2361 And finally, looking at the snapshot data should show at or near 2516 the end the event that triggered the snap 2362 the end the event that triggered the snapshot:: 2517 2363 2518 # cat /sys/kernel/tracing/snapshot !! 2364 # cat /sys/kernel/debug/tracing/snapshot 2519 2365 2520 gnome-shell-1261 [006] dN.3 49.8 2366 gnome-shell-1261 [006] dN.3 49.823113: sched_stat_runtime: comm=gnome-shell pid=1261 runtime=49347 [ns] vruntime=1835730389 [ns] 2521 kworker/u16:4-773 [003] d..3 49.8 2367 kworker/u16:4-773 [003] d..3 49.823114: sched_switch: prev_comm=kworker/u16:4 prev_pid=773 prev_prio=120 prev_state=R+ ==> next_comm=kworker/3:2 next_pid=135 next_prio=120 2522 gnome-shell-1261 [006] d..3 49.8 2368 gnome-shell-1261 [006] d..3 49.823114: sched_switch: prev_comm=gnome-shell prev_pid=1261 prev_prio=120 prev_state=R+ ==> next_comm=kworker/6:2 next_pid=387 next_prio=120 2523 kworker/3:2-135 [003] d..3 49.8 2369 kworker/3:2-135 [003] d..3 49.823118: sched_stat_runtime: comm=kworker/3:2 pid=135 runtime=5339 [ns] vruntime=17815800388 [ns] 2524 kworker/6:2-387 [006] d..3 49.8 2370 kworker/6:2-387 [006] d..3 49.823120: sched_stat_runtime: comm=kworker/6:2 pid=387 runtime=9594 [ns] vruntime=14589605367 [ns] 2525 kworker/6:2-387 [006] d..3 49.8 2371 kworker/6:2-387 [006] d..3 49.823122: sched_switch: prev_comm=kworker/6:2 prev_pid=387 prev_prio=120 prev_state=R+ ==> next_comm=gnome-shell next_pid=1261 next_prio=120 2526 kworker/3:2-135 [003] d..3 49.8 2372 kworker/3:2-135 [003] d..3 49.823123: sched_switch: prev_comm=kworker/3:2 prev_pid=135 prev_prio=120 prev_state=T ==> next_comm=swapper/3 next_pid=0 next_prio=120 2527 <idle>-0 [004] ..s7 49.8 2373 <idle>-0 [004] ..s7 49.823798: tcp_probe: src=10.0.0.10:54326 dest=23.215.104.193:80 mark=0x0 length=32 snd_nxt=0xe3ae2ff5 snd_una=0xe3ae2ecd snd_cwnd=10 ssthresh=2147483647 snd_wnd=28960 srtt=19604 rcv_wnd=29312 2528 2374 2529 3. User space creating a trigger 2375 3. User space creating a trigger 2530 -------------------------------- 2376 -------------------------------- 2531 2377 2532 Writing into /sys/kernel/tracing/trace_marker 2378 Writing into /sys/kernel/tracing/trace_marker writes into the ftrace 2533 ring buffer. This can also act like an event, 2379 ring buffer. This can also act like an event, by writing into the trigger 2534 file located in /sys/kernel/tracing/events/ft 2380 file located in /sys/kernel/tracing/events/ftrace/print/ 2535 2381 2536 Modifying cyclictest to write into the trace_ 2382 Modifying cyclictest to write into the trace_marker file before it sleeps 2537 and after it wakes up, something like this:: 2383 and after it wakes up, something like this:: 2538 2384 2539 static void traceputs(char *str) 2385 static void traceputs(char *str) 2540 { 2386 { 2541 /* tracemark_fd is the trace_marker f 2387 /* tracemark_fd is the trace_marker file descriptor */ 2542 if (tracemark_fd < 0) 2388 if (tracemark_fd < 0) 2543 return; 2389 return; 2544 /* write the tracemark message */ 2390 /* write the tracemark message */ 2545 write(tracemark_fd, str, strlen(str)) 2391 write(tracemark_fd, str, strlen(str)); 2546 } 2392 } 2547 2393 2548 And later add something like:: 2394 And later add something like:: 2549 2395 2550 traceputs("start"); 2396 traceputs("start"); 2551 clock_nanosleep(...); 2397 clock_nanosleep(...); 2552 traceputs("end"); 2398 traceputs("end"); 2553 2399 2554 We can make a histogram from this:: 2400 We can make a histogram from this:: 2555 2401 2556 # cd /sys/kernel/tracing 2402 # cd /sys/kernel/tracing 2557 # echo 'latency u64 lat' > synthetic_events 2403 # echo 'latency u64 lat' > synthetic_events 2558 # echo 'hist:keys=common_pid:ts0=common_time 2404 # echo 'hist:keys=common_pid:ts0=common_timestamp.usecs if buf == "start"' > events/ftrace/print/trigger 2559 # echo 'hist:keys=common_pid:lat=common_time 2405 # echo 'hist:keys=common_pid:lat=common_timestamp.usecs-$ts0:onmatch(ftrace.print).latency($lat) if buf == "end"' >> events/ftrace/print/trigger 2560 # echo 'hist:keys=lat,common_pid:sort=lat' > 2406 # echo 'hist:keys=lat,common_pid:sort=lat' > events/synthetic/latency/trigger 2561 2407 2562 The above created a synthetic event called "l 2408 The above created a synthetic event called "latency" and two histograms 2563 against the trace_marker, one gets triggered 2409 against the trace_marker, one gets triggered when "start" is written into the 2564 trace_marker file and the other when "end" is 2410 trace_marker file and the other when "end" is written. If the pids match, then 2565 it will call the "latency" synthetic event wi 2411 it will call the "latency" synthetic event with the calculated latency as its 2566 parameter. Finally, a histogram is added to t 2412 parameter. Finally, a histogram is added to the latency synthetic event to 2567 record the calculated latency along with the 2413 record the calculated latency along with the pid. 2568 2414 2569 Now running cyclictest with:: 2415 Now running cyclictest with:: 2570 2416 2571 # ./cyclictest -p80 -d0 -i250 -n -a -t --tra 2417 # ./cyclictest -p80 -d0 -i250 -n -a -t --tracemark -b 1000 2572 2418 2573 -p80 : run threads at priority 80 2419 -p80 : run threads at priority 80 2574 -d0 : have all threads run at the same int 2420 -d0 : have all threads run at the same interval 2575 -i250 : start the interval at 250 microsecon 2421 -i250 : start the interval at 250 microseconds (all threads will do this) 2576 -n : sleep with nanosleep 2422 -n : sleep with nanosleep 2577 -a : affine all threads to a separate CPU 2423 -a : affine all threads to a separate CPU 2578 -t : one thread per available CPU 2424 -t : one thread per available CPU 2579 --tracemark : enable trace mark writing 2425 --tracemark : enable trace mark writing 2580 -b 1000 : stop if any latency is greater tha 2426 -b 1000 : stop if any latency is greater than 1000 microseconds 2581 2427 2582 Note, the -b 1000 is used just to make --trac 2428 Note, the -b 1000 is used just to make --tracemark available. 2583 2429 2584 Then we can see the histogram created by this 2430 Then we can see the histogram created by this with:: 2585 2431 2586 # cat events/synthetic/latency/hist 2432 # cat events/synthetic/latency/hist 2587 # event histogram 2433 # event histogram 2588 # 2434 # 2589 # trigger info: hist:keys=lat,common_pid:val 2435 # trigger info: hist:keys=lat,common_pid:vals=hitcount:sort=lat:size=2048 [active] 2590 # 2436 # 2591 2437 2592 { lat: 107, common_pid: 2039 } 2438 { lat: 107, common_pid: 2039 } hitcount: 1 2593 { lat: 122, common_pid: 2041 } 2439 { lat: 122, common_pid: 2041 } hitcount: 1 2594 { lat: 166, common_pid: 2039 } 2440 { lat: 166, common_pid: 2039 } hitcount: 1 2595 { lat: 174, common_pid: 2039 } 2441 { lat: 174, common_pid: 2039 } hitcount: 1 2596 { lat: 194, common_pid: 2041 } 2442 { lat: 194, common_pid: 2041 } hitcount: 1 2597 { lat: 196, common_pid: 2036 } 2443 { lat: 196, common_pid: 2036 } hitcount: 1 2598 { lat: 197, common_pid: 2038 } 2444 { lat: 197, common_pid: 2038 } hitcount: 1 2599 { lat: 198, common_pid: 2039 } 2445 { lat: 198, common_pid: 2039 } hitcount: 1 2600 { lat: 199, common_pid: 2039 } 2446 { lat: 199, common_pid: 2039 } hitcount: 1 2601 { lat: 200, common_pid: 2041 } 2447 { lat: 200, common_pid: 2041 } hitcount: 1 2602 { lat: 201, common_pid: 2039 } 2448 { lat: 201, common_pid: 2039 } hitcount: 2 2603 { lat: 202, common_pid: 2038 } 2449 { lat: 202, common_pid: 2038 } hitcount: 1 2604 { lat: 202, common_pid: 2043 } 2450 { lat: 202, common_pid: 2043 } hitcount: 1 2605 { lat: 203, common_pid: 2039 } 2451 { lat: 203, common_pid: 2039 } hitcount: 1 2606 { lat: 203, common_pid: 2036 } 2452 { lat: 203, common_pid: 2036 } hitcount: 1 2607 { lat: 203, common_pid: 2041 } 2453 { lat: 203, common_pid: 2041 } hitcount: 1 2608 { lat: 206, common_pid: 2038 } 2454 { lat: 206, common_pid: 2038 } hitcount: 2 2609 { lat: 207, common_pid: 2039 } 2455 { lat: 207, common_pid: 2039 } hitcount: 1 2610 { lat: 207, common_pid: 2036 } 2456 { lat: 207, common_pid: 2036 } hitcount: 1 2611 { lat: 208, common_pid: 2040 } 2457 { lat: 208, common_pid: 2040 } hitcount: 1 2612 { lat: 209, common_pid: 2043 } 2458 { lat: 209, common_pid: 2043 } hitcount: 1 2613 { lat: 210, common_pid: 2039 } 2459 { lat: 210, common_pid: 2039 } hitcount: 1 2614 { lat: 211, common_pid: 2039 } 2460 { lat: 211, common_pid: 2039 } hitcount: 4 2615 { lat: 212, common_pid: 2043 } 2461 { lat: 212, common_pid: 2043 } hitcount: 1 2616 { lat: 212, common_pid: 2039 } 2462 { lat: 212, common_pid: 2039 } hitcount: 2 2617 { lat: 213, common_pid: 2039 } 2463 { lat: 213, common_pid: 2039 } hitcount: 1 2618 { lat: 214, common_pid: 2038 } 2464 { lat: 214, common_pid: 2038 } hitcount: 1 2619 { lat: 214, common_pid: 2039 } 2465 { lat: 214, common_pid: 2039 } hitcount: 2 2620 { lat: 214, common_pid: 2042 } 2466 { lat: 214, common_pid: 2042 } hitcount: 1 2621 { lat: 215, common_pid: 2039 } 2467 { lat: 215, common_pid: 2039 } hitcount: 1 2622 { lat: 217, common_pid: 2036 } 2468 { lat: 217, common_pid: 2036 } hitcount: 1 2623 { lat: 217, common_pid: 2040 } 2469 { lat: 217, common_pid: 2040 } hitcount: 1 2624 { lat: 217, common_pid: 2039 } 2470 { lat: 217, common_pid: 2039 } hitcount: 1 2625 { lat: 218, common_pid: 2039 } 2471 { lat: 218, common_pid: 2039 } hitcount: 6 2626 { lat: 219, common_pid: 2039 } 2472 { lat: 219, common_pid: 2039 } hitcount: 9 2627 { lat: 220, common_pid: 2039 } 2473 { lat: 220, common_pid: 2039 } hitcount: 11 2628 { lat: 221, common_pid: 2039 } 2474 { lat: 221, common_pid: 2039 } hitcount: 5 2629 { lat: 221, common_pid: 2042 } 2475 { lat: 221, common_pid: 2042 } hitcount: 1 2630 { lat: 222, common_pid: 2039 } 2476 { lat: 222, common_pid: 2039 } hitcount: 7 2631 { lat: 223, common_pid: 2036 } 2477 { lat: 223, common_pid: 2036 } hitcount: 1 2632 { lat: 223, common_pid: 2039 } 2478 { lat: 223, common_pid: 2039 } hitcount: 3 2633 { lat: 224, common_pid: 2039 } 2479 { lat: 224, common_pid: 2039 } hitcount: 4 2634 { lat: 224, common_pid: 2037 } 2480 { lat: 224, common_pid: 2037 } hitcount: 1 2635 { lat: 224, common_pid: 2036 } 2481 { lat: 224, common_pid: 2036 } hitcount: 2 2636 { lat: 225, common_pid: 2039 } 2482 { lat: 225, common_pid: 2039 } hitcount: 5 2637 { lat: 225, common_pid: 2042 } 2483 { lat: 225, common_pid: 2042 } hitcount: 1 2638 { lat: 226, common_pid: 2039 } 2484 { lat: 226, common_pid: 2039 } hitcount: 7 2639 { lat: 226, common_pid: 2036 } 2485 { lat: 226, common_pid: 2036 } hitcount: 4 2640 { lat: 227, common_pid: 2039 } 2486 { lat: 227, common_pid: 2039 } hitcount: 6 2641 { lat: 227, common_pid: 2036 } 2487 { lat: 227, common_pid: 2036 } hitcount: 12 2642 { lat: 227, common_pid: 2043 } 2488 { lat: 227, common_pid: 2043 } hitcount: 1 2643 { lat: 228, common_pid: 2039 } 2489 { lat: 228, common_pid: 2039 } hitcount: 7 2644 { lat: 228, common_pid: 2036 } 2490 { lat: 228, common_pid: 2036 } hitcount: 14 2645 { lat: 229, common_pid: 2039 } 2491 { lat: 229, common_pid: 2039 } hitcount: 9 2646 { lat: 229, common_pid: 2036 } 2492 { lat: 229, common_pid: 2036 } hitcount: 8 2647 { lat: 229, common_pid: 2038 } 2493 { lat: 229, common_pid: 2038 } hitcount: 1 2648 { lat: 230, common_pid: 2039 } 2494 { lat: 230, common_pid: 2039 } hitcount: 11 2649 { lat: 230, common_pid: 2036 } 2495 { lat: 230, common_pid: 2036 } hitcount: 6 2650 { lat: 230, common_pid: 2043 } 2496 { lat: 230, common_pid: 2043 } hitcount: 1 2651 { lat: 230, common_pid: 2042 } 2497 { lat: 230, common_pid: 2042 } hitcount: 2 2652 { lat: 231, common_pid: 2041 } 2498 { lat: 231, common_pid: 2041 } hitcount: 1 2653 { lat: 231, common_pid: 2036 } 2499 { lat: 231, common_pid: 2036 } hitcount: 6 2654 { lat: 231, common_pid: 2043 } 2500 { lat: 231, common_pid: 2043 } hitcount: 1 2655 { lat: 231, common_pid: 2039 } 2501 { lat: 231, common_pid: 2039 } hitcount: 8 2656 { lat: 232, common_pid: 2037 } 2502 { lat: 232, common_pid: 2037 } hitcount: 1 2657 { lat: 232, common_pid: 2039 } 2503 { lat: 232, common_pid: 2039 } hitcount: 6 2658 { lat: 232, common_pid: 2040 } 2504 { lat: 232, common_pid: 2040 } hitcount: 2 2659 { lat: 232, common_pid: 2036 } 2505 { lat: 232, common_pid: 2036 } hitcount: 5 2660 { lat: 232, common_pid: 2043 } 2506 { lat: 232, common_pid: 2043 } hitcount: 1 2661 { lat: 233, common_pid: 2036 } 2507 { lat: 233, common_pid: 2036 } hitcount: 5 2662 { lat: 233, common_pid: 2039 } 2508 { lat: 233, common_pid: 2039 } hitcount: 11 2663 { lat: 234, common_pid: 2039 } 2509 { lat: 234, common_pid: 2039 } hitcount: 4 2664 { lat: 234, common_pid: 2038 } 2510 { lat: 234, common_pid: 2038 } hitcount: 2 2665 { lat: 234, common_pid: 2043 } 2511 { lat: 234, common_pid: 2043 } hitcount: 2 2666 { lat: 234, common_pid: 2036 } 2512 { lat: 234, common_pid: 2036 } hitcount: 11 2667 { lat: 234, common_pid: 2040 } 2513 { lat: 234, common_pid: 2040 } hitcount: 1 2668 { lat: 235, common_pid: 2037 } 2514 { lat: 235, common_pid: 2037 } hitcount: 2 2669 { lat: 235, common_pid: 2036 } 2515 { lat: 235, common_pid: 2036 } hitcount: 8 2670 { lat: 235, common_pid: 2043 } 2516 { lat: 235, common_pid: 2043 } hitcount: 2 2671 { lat: 235, common_pid: 2039 } 2517 { lat: 235, common_pid: 2039 } hitcount: 5 2672 { lat: 235, common_pid: 2042 } 2518 { lat: 235, common_pid: 2042 } hitcount: 2 2673 { lat: 235, common_pid: 2040 } 2519 { lat: 235, common_pid: 2040 } hitcount: 4 2674 { lat: 235, common_pid: 2041 } 2520 { lat: 235, common_pid: 2041 } hitcount: 1 2675 { lat: 236, common_pid: 2036 } 2521 { lat: 236, common_pid: 2036 } hitcount: 7 2676 { lat: 236, common_pid: 2037 } 2522 { lat: 236, common_pid: 2037 } hitcount: 1 2677 { lat: 236, common_pid: 2041 } 2523 { lat: 236, common_pid: 2041 } hitcount: 5 2678 { lat: 236, common_pid: 2039 } 2524 { lat: 236, common_pid: 2039 } hitcount: 3 2679 { lat: 236, common_pid: 2043 } 2525 { lat: 236, common_pid: 2043 } hitcount: 9 2680 { lat: 236, common_pid: 2040 } 2526 { lat: 236, common_pid: 2040 } hitcount: 7 2681 { lat: 237, common_pid: 2037 } 2527 { lat: 237, common_pid: 2037 } hitcount: 1 2682 { lat: 237, common_pid: 2040 } 2528 { lat: 237, common_pid: 2040 } hitcount: 1 2683 { lat: 237, common_pid: 2036 } 2529 { lat: 237, common_pid: 2036 } hitcount: 9 2684 { lat: 237, common_pid: 2039 } 2530 { lat: 237, common_pid: 2039 } hitcount: 3 2685 { lat: 237, common_pid: 2043 } 2531 { lat: 237, common_pid: 2043 } hitcount: 8 2686 { lat: 237, common_pid: 2042 } 2532 { lat: 237, common_pid: 2042 } hitcount: 2 2687 { lat: 237, common_pid: 2041 } 2533 { lat: 237, common_pid: 2041 } hitcount: 2 2688 { lat: 238, common_pid: 2043 } 2534 { lat: 238, common_pid: 2043 } hitcount: 10 2689 { lat: 238, common_pid: 2040 } 2535 { lat: 238, common_pid: 2040 } hitcount: 1 2690 { lat: 238, common_pid: 2037 } 2536 { lat: 238, common_pid: 2037 } hitcount: 9 2691 { lat: 238, common_pid: 2038 } 2537 { lat: 238, common_pid: 2038 } hitcount: 1 2692 { lat: 238, common_pid: 2039 } 2538 { lat: 238, common_pid: 2039 } hitcount: 1 2693 { lat: 238, common_pid: 2042 } 2539 { lat: 238, common_pid: 2042 } hitcount: 3 2694 { lat: 238, common_pid: 2036 } 2540 { lat: 238, common_pid: 2036 } hitcount: 7 2695 { lat: 239, common_pid: 2041 } 2541 { lat: 239, common_pid: 2041 } hitcount: 1 2696 { lat: 239, common_pid: 2043 } 2542 { lat: 239, common_pid: 2043 } hitcount: 11 2697 { lat: 239, common_pid: 2037 } 2543 { lat: 239, common_pid: 2037 } hitcount: 11 2698 { lat: 239, common_pid: 2038 } 2544 { lat: 239, common_pid: 2038 } hitcount: 6 2699 { lat: 239, common_pid: 2036 } 2545 { lat: 239, common_pid: 2036 } hitcount: 7 2700 { lat: 239, common_pid: 2040 } 2546 { lat: 239, common_pid: 2040 } hitcount: 1 2701 { lat: 239, common_pid: 2042 } 2547 { lat: 239, common_pid: 2042 } hitcount: 9 2702 { lat: 240, common_pid: 2037 } 2548 { lat: 240, common_pid: 2037 } hitcount: 29 2703 { lat: 240, common_pid: 2043 } 2549 { lat: 240, common_pid: 2043 } hitcount: 15 2704 { lat: 240, common_pid: 2040 } 2550 { lat: 240, common_pid: 2040 } hitcount: 44 2705 { lat: 240, common_pid: 2039 } 2551 { lat: 240, common_pid: 2039 } hitcount: 1 2706 { lat: 240, common_pid: 2041 } 2552 { lat: 240, common_pid: 2041 } hitcount: 2 2707 { lat: 240, common_pid: 2038 } 2553 { lat: 240, common_pid: 2038 } hitcount: 1 2708 { lat: 240, common_pid: 2036 } 2554 { lat: 240, common_pid: 2036 } hitcount: 10 2709 { lat: 240, common_pid: 2042 } 2555 { lat: 240, common_pid: 2042 } hitcount: 13 2710 { lat: 241, common_pid: 2036 } 2556 { lat: 241, common_pid: 2036 } hitcount: 21 2711 { lat: 241, common_pid: 2041 } 2557 { lat: 241, common_pid: 2041 } hitcount: 36 2712 { lat: 241, common_pid: 2037 } 2558 { lat: 241, common_pid: 2037 } hitcount: 34 2713 { lat: 241, common_pid: 2042 } 2559 { lat: 241, common_pid: 2042 } hitcount: 14 2714 { lat: 241, common_pid: 2040 } 2560 { lat: 241, common_pid: 2040 } hitcount: 94 2715 { lat: 241, common_pid: 2039 } 2561 { lat: 241, common_pid: 2039 } hitcount: 12 2716 { lat: 241, common_pid: 2038 } 2562 { lat: 241, common_pid: 2038 } hitcount: 2 2717 { lat: 241, common_pid: 2043 } 2563 { lat: 241, common_pid: 2043 } hitcount: 28 2718 { lat: 242, common_pid: 2040 } 2564 { lat: 242, common_pid: 2040 } hitcount: 109 2719 { lat: 242, common_pid: 2041 } 2565 { lat: 242, common_pid: 2041 } hitcount: 506 2720 { lat: 242, common_pid: 2039 } 2566 { lat: 242, common_pid: 2039 } hitcount: 155 2721 { lat: 242, common_pid: 2042 } 2567 { lat: 242, common_pid: 2042 } hitcount: 21 2722 { lat: 242, common_pid: 2037 } 2568 { lat: 242, common_pid: 2037 } hitcount: 52 2723 { lat: 242, common_pid: 2043 } 2569 { lat: 242, common_pid: 2043 } hitcount: 21 2724 { lat: 242, common_pid: 2036 } 2570 { lat: 242, common_pid: 2036 } hitcount: 16 2725 { lat: 242, common_pid: 2038 } 2571 { lat: 242, common_pid: 2038 } hitcount: 156 2726 { lat: 243, common_pid: 2037 } 2572 { lat: 243, common_pid: 2037 } hitcount: 46 2727 { lat: 243, common_pid: 2039 } 2573 { lat: 243, common_pid: 2039 } hitcount: 40 2728 { lat: 243, common_pid: 2042 } 2574 { lat: 243, common_pid: 2042 } hitcount: 119 2729 { lat: 243, common_pid: 2041 } 2575 { lat: 243, common_pid: 2041 } hitcount: 611 2730 { lat: 243, common_pid: 2036 } 2576 { lat: 243, common_pid: 2036 } hitcount: 69 2731 { lat: 243, common_pid: 2038 } 2577 { lat: 243, common_pid: 2038 } hitcount: 784 2732 { lat: 243, common_pid: 2040 } 2578 { lat: 243, common_pid: 2040 } hitcount: 323 2733 { lat: 243, common_pid: 2043 } 2579 { lat: 243, common_pid: 2043 } hitcount: 14 2734 { lat: 244, common_pid: 2043 } 2580 { lat: 244, common_pid: 2043 } hitcount: 35 2735 { lat: 244, common_pid: 2042 } 2581 { lat: 244, common_pid: 2042 } hitcount: 305 2736 { lat: 244, common_pid: 2039 } 2582 { lat: 244, common_pid: 2039 } hitcount: 8 2737 { lat: 244, common_pid: 2040 } 2583 { lat: 244, common_pid: 2040 } hitcount: 4515 2738 { lat: 244, common_pid: 2038 } 2584 { lat: 244, common_pid: 2038 } hitcount: 371 2739 { lat: 244, common_pid: 2037 } 2585 { lat: 244, common_pid: 2037 } hitcount: 31 2740 { lat: 244, common_pid: 2036 } 2586 { lat: 244, common_pid: 2036 } hitcount: 114 2741 { lat: 244, common_pid: 2041 } 2587 { lat: 244, common_pid: 2041 } hitcount: 3396 2742 { lat: 245, common_pid: 2036 } 2588 { lat: 245, common_pid: 2036 } hitcount: 700 2743 { lat: 245, common_pid: 2041 } 2589 { lat: 245, common_pid: 2041 } hitcount: 2772 2744 { lat: 245, common_pid: 2037 } 2590 { lat: 245, common_pid: 2037 } hitcount: 268 2745 { lat: 245, common_pid: 2039 } 2591 { lat: 245, common_pid: 2039 } hitcount: 472 2746 { lat: 245, common_pid: 2038 } 2592 { lat: 245, common_pid: 2038 } hitcount: 2758 2747 { lat: 245, common_pid: 2042 } 2593 { lat: 245, common_pid: 2042 } hitcount: 3833 2748 { lat: 245, common_pid: 2040 } 2594 { lat: 245, common_pid: 2040 } hitcount: 3105 2749 { lat: 245, common_pid: 2043 } 2595 { lat: 245, common_pid: 2043 } hitcount: 645 2750 { lat: 246, common_pid: 2038 } 2596 { lat: 246, common_pid: 2038 } hitcount: 3451 2751 { lat: 246, common_pid: 2041 } 2597 { lat: 246, common_pid: 2041 } hitcount: 142 2752 { lat: 246, common_pid: 2037 } 2598 { lat: 246, common_pid: 2037 } hitcount: 5101 2753 { lat: 246, common_pid: 2040 } 2599 { lat: 246, common_pid: 2040 } hitcount: 68 2754 { lat: 246, common_pid: 2043 } 2600 { lat: 246, common_pid: 2043 } hitcount: 5099 2755 { lat: 246, common_pid: 2039 } 2601 { lat: 246, common_pid: 2039 } hitcount: 5608 2756 { lat: 246, common_pid: 2042 } 2602 { lat: 246, common_pid: 2042 } hitcount: 3723 2757 { lat: 246, common_pid: 2036 } 2603 { lat: 246, common_pid: 2036 } hitcount: 4738 2758 { lat: 247, common_pid: 2042 } 2604 { lat: 247, common_pid: 2042 } hitcount: 312 2759 { lat: 247, common_pid: 2043 } 2605 { lat: 247, common_pid: 2043 } hitcount: 2385 2760 { lat: 247, common_pid: 2041 } 2606 { lat: 247, common_pid: 2041 } hitcount: 452 2761 { lat: 247, common_pid: 2038 } 2607 { lat: 247, common_pid: 2038 } hitcount: 792 2762 { lat: 247, common_pid: 2040 } 2608 { lat: 247, common_pid: 2040 } hitcount: 78 2763 { lat: 247, common_pid: 2036 } 2609 { lat: 247, common_pid: 2036 } hitcount: 2375 2764 { lat: 247, common_pid: 2039 } 2610 { lat: 247, common_pid: 2039 } hitcount: 1834 2765 { lat: 247, common_pid: 2037 } 2611 { lat: 247, common_pid: 2037 } hitcount: 2655 2766 { lat: 248, common_pid: 2037 } 2612 { lat: 248, common_pid: 2037 } hitcount: 36 2767 { lat: 248, common_pid: 2042 } 2613 { lat: 248, common_pid: 2042 } hitcount: 11 2768 { lat: 248, common_pid: 2038 } 2614 { lat: 248, common_pid: 2038 } hitcount: 122 2769 { lat: 248, common_pid: 2036 } 2615 { lat: 248, common_pid: 2036 } hitcount: 135 2770 { lat: 248, common_pid: 2039 } 2616 { lat: 248, common_pid: 2039 } hitcount: 26 2771 { lat: 248, common_pid: 2041 } 2617 { lat: 248, common_pid: 2041 } hitcount: 503 2772 { lat: 248, common_pid: 2043 } 2618 { lat: 248, common_pid: 2043 } hitcount: 66 2773 { lat: 248, common_pid: 2040 } 2619 { lat: 248, common_pid: 2040 } hitcount: 46 2774 { lat: 249, common_pid: 2037 } 2620 { lat: 249, common_pid: 2037 } hitcount: 29 2775 { lat: 249, common_pid: 2038 } 2621 { lat: 249, common_pid: 2038 } hitcount: 1 2776 { lat: 249, common_pid: 2043 } 2622 { lat: 249, common_pid: 2043 } hitcount: 29 2777 { lat: 249, common_pid: 2039 } 2623 { lat: 249, common_pid: 2039 } hitcount: 8 2778 { lat: 249, common_pid: 2042 } 2624 { lat: 249, common_pid: 2042 } hitcount: 56 2779 { lat: 249, common_pid: 2040 } 2625 { lat: 249, common_pid: 2040 } hitcount: 27 2780 { lat: 249, common_pid: 2041 } 2626 { lat: 249, common_pid: 2041 } hitcount: 11 2781 { lat: 249, common_pid: 2036 } 2627 { lat: 249, common_pid: 2036 } hitcount: 27 2782 { lat: 250, common_pid: 2038 } 2628 { lat: 250, common_pid: 2038 } hitcount: 1 2783 { lat: 250, common_pid: 2036 } 2629 { lat: 250, common_pid: 2036 } hitcount: 30 2784 { lat: 250, common_pid: 2040 } 2630 { lat: 250, common_pid: 2040 } hitcount: 19 2785 { lat: 250, common_pid: 2043 } 2631 { lat: 250, common_pid: 2043 } hitcount: 22 2786 { lat: 250, common_pid: 2042 } 2632 { lat: 250, common_pid: 2042 } hitcount: 20 2787 { lat: 250, common_pid: 2041 } 2633 { lat: 250, common_pid: 2041 } hitcount: 1 2788 { lat: 250, common_pid: 2039 } 2634 { lat: 250, common_pid: 2039 } hitcount: 6 2789 { lat: 250, common_pid: 2037 } 2635 { lat: 250, common_pid: 2037 } hitcount: 48 2790 { lat: 251, common_pid: 2037 } 2636 { lat: 251, common_pid: 2037 } hitcount: 43 2791 { lat: 251, common_pid: 2039 } 2637 { lat: 251, common_pid: 2039 } hitcount: 1 2792 { lat: 251, common_pid: 2036 } 2638 { lat: 251, common_pid: 2036 } hitcount: 12 2793 { lat: 251, common_pid: 2042 } 2639 { lat: 251, common_pid: 2042 } hitcount: 2 2794 { lat: 251, common_pid: 2041 } 2640 { lat: 251, common_pid: 2041 } hitcount: 1 2795 { lat: 251, common_pid: 2043 } 2641 { lat: 251, common_pid: 2043 } hitcount: 15 2796 { lat: 251, common_pid: 2040 } 2642 { lat: 251, common_pid: 2040 } hitcount: 3 2797 { lat: 252, common_pid: 2040 } 2643 { lat: 252, common_pid: 2040 } hitcount: 1 2798 { lat: 252, common_pid: 2036 } 2644 { lat: 252, common_pid: 2036 } hitcount: 12 2799 { lat: 252, common_pid: 2037 } 2645 { lat: 252, common_pid: 2037 } hitcount: 21 2800 { lat: 252, common_pid: 2043 } 2646 { lat: 252, common_pid: 2043 } hitcount: 14 2801 { lat: 253, common_pid: 2037 } 2647 { lat: 253, common_pid: 2037 } hitcount: 21 2802 { lat: 253, common_pid: 2039 } 2648 { lat: 253, common_pid: 2039 } hitcount: 2 2803 { lat: 253, common_pid: 2036 } 2649 { lat: 253, common_pid: 2036 } hitcount: 9 2804 { lat: 253, common_pid: 2043 } 2650 { lat: 253, common_pid: 2043 } hitcount: 6 2805 { lat: 253, common_pid: 2040 } 2651 { lat: 253, common_pid: 2040 } hitcount: 1 2806 { lat: 254, common_pid: 2036 } 2652 { lat: 254, common_pid: 2036 } hitcount: 8 2807 { lat: 254, common_pid: 2043 } 2653 { lat: 254, common_pid: 2043 } hitcount: 3 2808 { lat: 254, common_pid: 2041 } 2654 { lat: 254, common_pid: 2041 } hitcount: 1 2809 { lat: 254, common_pid: 2042 } 2655 { lat: 254, common_pid: 2042 } hitcount: 1 2810 { lat: 254, common_pid: 2039 } 2656 { lat: 254, common_pid: 2039 } hitcount: 1 2811 { lat: 254, common_pid: 2037 } 2657 { lat: 254, common_pid: 2037 } hitcount: 12 2812 { lat: 255, common_pid: 2043 } 2658 { lat: 255, common_pid: 2043 } hitcount: 1 2813 { lat: 255, common_pid: 2037 } 2659 { lat: 255, common_pid: 2037 } hitcount: 2 2814 { lat: 255, common_pid: 2036 } 2660 { lat: 255, common_pid: 2036 } hitcount: 2 2815 { lat: 255, common_pid: 2039 } 2661 { lat: 255, common_pid: 2039 } hitcount: 8 2816 { lat: 256, common_pid: 2043 } 2662 { lat: 256, common_pid: 2043 } hitcount: 1 2817 { lat: 256, common_pid: 2036 } 2663 { lat: 256, common_pid: 2036 } hitcount: 4 2818 { lat: 256, common_pid: 2039 } 2664 { lat: 256, common_pid: 2039 } hitcount: 6 2819 { lat: 257, common_pid: 2039 } 2665 { lat: 257, common_pid: 2039 } hitcount: 5 2820 { lat: 257, common_pid: 2036 } 2666 { lat: 257, common_pid: 2036 } hitcount: 4 2821 { lat: 258, common_pid: 2039 } 2667 { lat: 258, common_pid: 2039 } hitcount: 5 2822 { lat: 258, common_pid: 2036 } 2668 { lat: 258, common_pid: 2036 } hitcount: 2 2823 { lat: 259, common_pid: 2036 } 2669 { lat: 259, common_pid: 2036 } hitcount: 7 2824 { lat: 259, common_pid: 2039 } 2670 { lat: 259, common_pid: 2039 } hitcount: 7 2825 { lat: 260, common_pid: 2036 } 2671 { lat: 260, common_pid: 2036 } hitcount: 8 2826 { lat: 260, common_pid: 2039 } 2672 { lat: 260, common_pid: 2039 } hitcount: 6 2827 { lat: 261, common_pid: 2036 } 2673 { lat: 261, common_pid: 2036 } hitcount: 5 2828 { lat: 261, common_pid: 2039 } 2674 { lat: 261, common_pid: 2039 } hitcount: 7 2829 { lat: 262, common_pid: 2039 } 2675 { lat: 262, common_pid: 2039 } hitcount: 5 2830 { lat: 262, common_pid: 2036 } 2676 { lat: 262, common_pid: 2036 } hitcount: 5 2831 { lat: 263, common_pid: 2039 } 2677 { lat: 263, common_pid: 2039 } hitcount: 7 2832 { lat: 263, common_pid: 2036 } 2678 { lat: 263, common_pid: 2036 } hitcount: 7 2833 { lat: 264, common_pid: 2039 } 2679 { lat: 264, common_pid: 2039 } hitcount: 9 2834 { lat: 264, common_pid: 2036 } 2680 { lat: 264, common_pid: 2036 } hitcount: 9 2835 { lat: 265, common_pid: 2036 } 2681 { lat: 265, common_pid: 2036 } hitcount: 5 2836 { lat: 265, common_pid: 2039 } 2682 { lat: 265, common_pid: 2039 } hitcount: 1 2837 { lat: 266, common_pid: 2036 } 2683 { lat: 266, common_pid: 2036 } hitcount: 1 2838 { lat: 266, common_pid: 2039 } 2684 { lat: 266, common_pid: 2039 } hitcount: 3 2839 { lat: 267, common_pid: 2036 } 2685 { lat: 267, common_pid: 2036 } hitcount: 1 2840 { lat: 267, common_pid: 2039 } 2686 { lat: 267, common_pid: 2039 } hitcount: 3 2841 { lat: 268, common_pid: 2036 } 2687 { lat: 268, common_pid: 2036 } hitcount: 1 2842 { lat: 268, common_pid: 2039 } 2688 { lat: 268, common_pid: 2039 } hitcount: 6 2843 { lat: 269, common_pid: 2036 } 2689 { lat: 269, common_pid: 2036 } hitcount: 1 2844 { lat: 269, common_pid: 2043 } 2690 { lat: 269, common_pid: 2043 } hitcount: 1 2845 { lat: 269, common_pid: 2039 } 2691 { lat: 269, common_pid: 2039 } hitcount: 2 2846 { lat: 270, common_pid: 2040 } 2692 { lat: 270, common_pid: 2040 } hitcount: 1 2847 { lat: 270, common_pid: 2039 } 2693 { lat: 270, common_pid: 2039 } hitcount: 6 2848 { lat: 271, common_pid: 2041 } 2694 { lat: 271, common_pid: 2041 } hitcount: 1 2849 { lat: 271, common_pid: 2039 } 2695 { lat: 271, common_pid: 2039 } hitcount: 5 2850 { lat: 272, common_pid: 2039 } 2696 { lat: 272, common_pid: 2039 } hitcount: 10 2851 { lat: 273, common_pid: 2039 } 2697 { lat: 273, common_pid: 2039 } hitcount: 8 2852 { lat: 274, common_pid: 2039 } 2698 { lat: 274, common_pid: 2039 } hitcount: 2 2853 { lat: 275, common_pid: 2039 } 2699 { lat: 275, common_pid: 2039 } hitcount: 1 2854 { lat: 276, common_pid: 2039 } 2700 { lat: 276, common_pid: 2039 } hitcount: 2 2855 { lat: 276, common_pid: 2037 } 2701 { lat: 276, common_pid: 2037 } hitcount: 1 2856 { lat: 276, common_pid: 2038 } 2702 { lat: 276, common_pid: 2038 } hitcount: 1 2857 { lat: 277, common_pid: 2039 } 2703 { lat: 277, common_pid: 2039 } hitcount: 1 2858 { lat: 277, common_pid: 2042 } 2704 { lat: 277, common_pid: 2042 } hitcount: 1 2859 { lat: 278, common_pid: 2039 } 2705 { lat: 278, common_pid: 2039 } hitcount: 1 2860 { lat: 279, common_pid: 2039 } 2706 { lat: 279, common_pid: 2039 } hitcount: 4 2861 { lat: 279, common_pid: 2043 } 2707 { lat: 279, common_pid: 2043 } hitcount: 1 2862 { lat: 280, common_pid: 2039 } 2708 { lat: 280, common_pid: 2039 } hitcount: 3 2863 { lat: 283, common_pid: 2036 } 2709 { lat: 283, common_pid: 2036 } hitcount: 2 2864 { lat: 284, common_pid: 2039 } 2710 { lat: 284, common_pid: 2039 } hitcount: 1 2865 { lat: 284, common_pid: 2043 } 2711 { lat: 284, common_pid: 2043 } hitcount: 1 2866 { lat: 288, common_pid: 2039 } 2712 { lat: 288, common_pid: 2039 } hitcount: 1 2867 { lat: 289, common_pid: 2039 } 2713 { lat: 289, common_pid: 2039 } hitcount: 1 2868 { lat: 300, common_pid: 2039 } 2714 { lat: 300, common_pid: 2039 } hitcount: 1 2869 { lat: 384, common_pid: 2039 } 2715 { lat: 384, common_pid: 2039 } hitcount: 1 2870 2716 2871 Totals: 2717 Totals: 2872 Hits: 67625 2718 Hits: 67625 2873 Entries: 278 2719 Entries: 278 2874 Dropped: 0 2720 Dropped: 0 2875 2721 2876 Note, the writes are around the sleep, so ide 2722 Note, the writes are around the sleep, so ideally they will all be of 250 2877 microseconds. If you are wondering how there 2723 microseconds. If you are wondering how there are several that are under 2878 250 microseconds, that is because the way cyc 2724 250 microseconds, that is because the way cyclictest works, is if one 2879 iteration comes in late, the next one will se 2725 iteration comes in late, the next one will set the timer to wake up less that 2880 250. That is, if an iteration came in 50 micr 2726 250. That is, if an iteration came in 50 microseconds late, the next wake up 2881 will be at 200 microseconds. 2727 will be at 200 microseconds. 2882 2728 2883 But this could easily be done in userspace. T 2729 But this could easily be done in userspace. To make this even more 2884 interesting, we can mix the histogram between 2730 interesting, we can mix the histogram between events that happened in the 2885 kernel with trace_marker:: 2731 kernel with trace_marker:: 2886 2732 2887 # cd /sys/kernel/tracing 2733 # cd /sys/kernel/tracing 2888 # echo 'latency u64 lat' > synthetic_events 2734 # echo 'latency u64 lat' > synthetic_events 2889 # echo 'hist:keys=pid:ts0=common_timestamp.u 2735 # echo 'hist:keys=pid:ts0=common_timestamp.usecs' > events/sched/sched_waking/trigger 2890 # echo 'hist:keys=common_pid:lat=common_time 2736 # echo 'hist:keys=common_pid:lat=common_timestamp.usecs-$ts0:onmatch(sched.sched_waking).latency($lat) if buf == "end"' > events/ftrace/print/trigger 2891 # echo 'hist:keys=lat,common_pid:sort=lat' > 2737 # echo 'hist:keys=lat,common_pid:sort=lat' > events/synthetic/latency/trigger 2892 2738 2893 The difference this time is that instead of u 2739 The difference this time is that instead of using the trace_marker to start 2894 the latency, the sched_waking event is used, 2740 the latency, the sched_waking event is used, matching the common_pid for the 2895 trace_marker write with the pid that is being 2741 trace_marker write with the pid that is being woken by sched_waking. 2896 2742 2897 After running cyclictest again with the same 2743 After running cyclictest again with the same parameters, we now have:: 2898 2744 2899 # cat events/synthetic/latency/hist 2745 # cat events/synthetic/latency/hist 2900 # event histogram 2746 # event histogram 2901 # 2747 # 2902 # trigger info: hist:keys=lat,common_pid:val 2748 # trigger info: hist:keys=lat,common_pid:vals=hitcount:sort=lat:size=2048 [active] 2903 # 2749 # 2904 2750 2905 { lat: 7, common_pid: 2302 } 2751 { lat: 7, common_pid: 2302 } hitcount: 640 2906 { lat: 7, common_pid: 2299 } 2752 { lat: 7, common_pid: 2299 } hitcount: 42 2907 { lat: 7, common_pid: 2303 } 2753 { lat: 7, common_pid: 2303 } hitcount: 18 2908 { lat: 7, common_pid: 2305 } 2754 { lat: 7, common_pid: 2305 } hitcount: 166 2909 { lat: 7, common_pid: 2306 } 2755 { lat: 7, common_pid: 2306 } hitcount: 1 2910 { lat: 7, common_pid: 2301 } 2756 { lat: 7, common_pid: 2301 } hitcount: 91 2911 { lat: 7, common_pid: 2300 } 2757 { lat: 7, common_pid: 2300 } hitcount: 17 2912 { lat: 8, common_pid: 2303 } 2758 { lat: 8, common_pid: 2303 } hitcount: 8296 2913 { lat: 8, common_pid: 2304 } 2759 { lat: 8, common_pid: 2304 } hitcount: 6864 2914 { lat: 8, common_pid: 2305 } 2760 { lat: 8, common_pid: 2305 } hitcount: 9464 2915 { lat: 8, common_pid: 2301 } 2761 { lat: 8, common_pid: 2301 } hitcount: 9213 2916 { lat: 8, common_pid: 2306 } 2762 { lat: 8, common_pid: 2306 } hitcount: 6246 2917 { lat: 8, common_pid: 2302 } 2763 { lat: 8, common_pid: 2302 } hitcount: 8797 2918 { lat: 8, common_pid: 2299 } 2764 { lat: 8, common_pid: 2299 } hitcount: 8771 2919 { lat: 8, common_pid: 2300 } 2765 { lat: 8, common_pid: 2300 } hitcount: 8119 2920 { lat: 9, common_pid: 2305 } 2766 { lat: 9, common_pid: 2305 } hitcount: 1519 2921 { lat: 9, common_pid: 2299 } 2767 { lat: 9, common_pid: 2299 } hitcount: 2346 2922 { lat: 9, common_pid: 2303 } 2768 { lat: 9, common_pid: 2303 } hitcount: 2841 2923 { lat: 9, common_pid: 2301 } 2769 { lat: 9, common_pid: 2301 } hitcount: 1846 2924 { lat: 9, common_pid: 2304 } 2770 { lat: 9, common_pid: 2304 } hitcount: 3861 2925 { lat: 9, common_pid: 2302 } 2771 { lat: 9, common_pid: 2302 } hitcount: 1210 2926 { lat: 9, common_pid: 2300 } 2772 { lat: 9, common_pid: 2300 } hitcount: 2762 2927 { lat: 9, common_pid: 2306 } 2773 { lat: 9, common_pid: 2306 } hitcount: 4247 2928 { lat: 10, common_pid: 2299 } 2774 { lat: 10, common_pid: 2299 } hitcount: 16 2929 { lat: 10, common_pid: 2306 } 2775 { lat: 10, common_pid: 2306 } hitcount: 333 2930 { lat: 10, common_pid: 2303 } 2776 { lat: 10, common_pid: 2303 } hitcount: 16 2931 { lat: 10, common_pid: 2304 } 2777 { lat: 10, common_pid: 2304 } hitcount: 168 2932 { lat: 10, common_pid: 2302 } 2778 { lat: 10, common_pid: 2302 } hitcount: 240 2933 { lat: 10, common_pid: 2301 } 2779 { lat: 10, common_pid: 2301 } hitcount: 28 2934 { lat: 10, common_pid: 2300 } 2780 { lat: 10, common_pid: 2300 } hitcount: 95 2935 { lat: 10, common_pid: 2305 } 2781 { lat: 10, common_pid: 2305 } hitcount: 18 2936 { lat: 11, common_pid: 2303 } 2782 { lat: 11, common_pid: 2303 } hitcount: 5 2937 { lat: 11, common_pid: 2305 } 2783 { lat: 11, common_pid: 2305 } hitcount: 8 2938 { lat: 11, common_pid: 2306 } 2784 { lat: 11, common_pid: 2306 } hitcount: 221 2939 { lat: 11, common_pid: 2302 } 2785 { lat: 11, common_pid: 2302 } hitcount: 76 2940 { lat: 11, common_pid: 2304 } 2786 { lat: 11, common_pid: 2304 } hitcount: 26 2941 { lat: 11, common_pid: 2300 } 2787 { lat: 11, common_pid: 2300 } hitcount: 125 2942 { lat: 11, common_pid: 2299 } 2788 { lat: 11, common_pid: 2299 } hitcount: 2 2943 { lat: 12, common_pid: 2305 } 2789 { lat: 12, common_pid: 2305 } hitcount: 3 2944 { lat: 12, common_pid: 2300 } 2790 { lat: 12, common_pid: 2300 } hitcount: 6 2945 { lat: 12, common_pid: 2306 } 2791 { lat: 12, common_pid: 2306 } hitcount: 90 2946 { lat: 12, common_pid: 2302 } 2792 { lat: 12, common_pid: 2302 } hitcount: 4 2947 { lat: 12, common_pid: 2303 } 2793 { lat: 12, common_pid: 2303 } hitcount: 1 2948 { lat: 12, common_pid: 2304 } 2794 { lat: 12, common_pid: 2304 } hitcount: 122 2949 { lat: 13, common_pid: 2300 } 2795 { lat: 13, common_pid: 2300 } hitcount: 12 2950 { lat: 13, common_pid: 2301 } 2796 { lat: 13, common_pid: 2301 } hitcount: 1 2951 { lat: 13, common_pid: 2306 } 2797 { lat: 13, common_pid: 2306 } hitcount: 32 2952 { lat: 13, common_pid: 2302 } 2798 { lat: 13, common_pid: 2302 } hitcount: 5 2953 { lat: 13, common_pid: 2305 } 2799 { lat: 13, common_pid: 2305 } hitcount: 1 2954 { lat: 13, common_pid: 2303 } 2800 { lat: 13, common_pid: 2303 } hitcount: 1 2955 { lat: 13, common_pid: 2304 } 2801 { lat: 13, common_pid: 2304 } hitcount: 61 2956 { lat: 14, common_pid: 2303 } 2802 { lat: 14, common_pid: 2303 } hitcount: 4 2957 { lat: 14, common_pid: 2306 } 2803 { lat: 14, common_pid: 2306 } hitcount: 5 2958 { lat: 14, common_pid: 2305 } 2804 { lat: 14, common_pid: 2305 } hitcount: 4 2959 { lat: 14, common_pid: 2304 } 2805 { lat: 14, common_pid: 2304 } hitcount: 62 2960 { lat: 14, common_pid: 2302 } 2806 { lat: 14, common_pid: 2302 } hitcount: 19 2961 { lat: 14, common_pid: 2300 } 2807 { lat: 14, common_pid: 2300 } hitcount: 33 2962 { lat: 14, common_pid: 2299 } 2808 { lat: 14, common_pid: 2299 } hitcount: 1 2963 { lat: 14, common_pid: 2301 } 2809 { lat: 14, common_pid: 2301 } hitcount: 4 2964 { lat: 15, common_pid: 2305 } 2810 { lat: 15, common_pid: 2305 } hitcount: 1 2965 { lat: 15, common_pid: 2302 } 2811 { lat: 15, common_pid: 2302 } hitcount: 25 2966 { lat: 15, common_pid: 2300 } 2812 { lat: 15, common_pid: 2300 } hitcount: 11 2967 { lat: 15, common_pid: 2299 } 2813 { lat: 15, common_pid: 2299 } hitcount: 5 2968 { lat: 15, common_pid: 2301 } 2814 { lat: 15, common_pid: 2301 } hitcount: 1 2969 { lat: 15, common_pid: 2304 } 2815 { lat: 15, common_pid: 2304 } hitcount: 8 2970 { lat: 15, common_pid: 2303 } 2816 { lat: 15, common_pid: 2303 } hitcount: 1 2971 { lat: 15, common_pid: 2306 } 2817 { lat: 15, common_pid: 2306 } hitcount: 6 2972 { lat: 16, common_pid: 2302 } 2818 { lat: 16, common_pid: 2302 } hitcount: 31 2973 { lat: 16, common_pid: 2306 } 2819 { lat: 16, common_pid: 2306 } hitcount: 3 2974 { lat: 16, common_pid: 2300 } 2820 { lat: 16, common_pid: 2300 } hitcount: 5 2975 { lat: 17, common_pid: 2302 } 2821 { lat: 17, common_pid: 2302 } hitcount: 6 2976 { lat: 17, common_pid: 2303 } 2822 { lat: 17, common_pid: 2303 } hitcount: 1 2977 { lat: 18, common_pid: 2304 } 2823 { lat: 18, common_pid: 2304 } hitcount: 1 2978 { lat: 18, common_pid: 2302 } 2824 { lat: 18, common_pid: 2302 } hitcount: 8 2979 { lat: 18, common_pid: 2299 } 2825 { lat: 18, common_pid: 2299 } hitcount: 1 2980 { lat: 18, common_pid: 2301 } 2826 { lat: 18, common_pid: 2301 } hitcount: 1 2981 { lat: 19, common_pid: 2303 } 2827 { lat: 19, common_pid: 2303 } hitcount: 4 2982 { lat: 19, common_pid: 2304 } 2828 { lat: 19, common_pid: 2304 } hitcount: 5 2983 { lat: 19, common_pid: 2302 } 2829 { lat: 19, common_pid: 2302 } hitcount: 4 2984 { lat: 19, common_pid: 2299 } 2830 { lat: 19, common_pid: 2299 } hitcount: 3 2985 { lat: 19, common_pid: 2306 } 2831 { lat: 19, common_pid: 2306 } hitcount: 1 2986 { lat: 19, common_pid: 2300 } 2832 { lat: 19, common_pid: 2300 } hitcount: 4 2987 { lat: 19, common_pid: 2305 } 2833 { lat: 19, common_pid: 2305 } hitcount: 5 2988 { lat: 20, common_pid: 2299 } 2834 { lat: 20, common_pid: 2299 } hitcount: 2 2989 { lat: 20, common_pid: 2302 } 2835 { lat: 20, common_pid: 2302 } hitcount: 3 2990 { lat: 20, common_pid: 2305 } 2836 { lat: 20, common_pid: 2305 } hitcount: 1 2991 { lat: 20, common_pid: 2300 } 2837 { lat: 20, common_pid: 2300 } hitcount: 2 2992 { lat: 20, common_pid: 2301 } 2838 { lat: 20, common_pid: 2301 } hitcount: 2 2993 { lat: 20, common_pid: 2303 } 2839 { lat: 20, common_pid: 2303 } hitcount: 3 2994 { lat: 21, common_pid: 2305 } 2840 { lat: 21, common_pid: 2305 } hitcount: 1 2995 { lat: 21, common_pid: 2299 } 2841 { lat: 21, common_pid: 2299 } hitcount: 5 2996 { lat: 21, common_pid: 2303 } 2842 { lat: 21, common_pid: 2303 } hitcount: 4 2997 { lat: 21, common_pid: 2302 } 2843 { lat: 21, common_pid: 2302 } hitcount: 7 2998 { lat: 21, common_pid: 2300 } 2844 { lat: 21, common_pid: 2300 } hitcount: 1 2999 { lat: 21, common_pid: 2301 } 2845 { lat: 21, common_pid: 2301 } hitcount: 5 3000 { lat: 21, common_pid: 2304 } 2846 { lat: 21, common_pid: 2304 } hitcount: 2 3001 { lat: 22, common_pid: 2302 } 2847 { lat: 22, common_pid: 2302 } hitcount: 5 3002 { lat: 22, common_pid: 2303 } 2848 { lat: 22, common_pid: 2303 } hitcount: 1 3003 { lat: 22, common_pid: 2306 } 2849 { lat: 22, common_pid: 2306 } hitcount: 3 3004 { lat: 22, common_pid: 2301 } 2850 { lat: 22, common_pid: 2301 } hitcount: 2 3005 { lat: 22, common_pid: 2300 } 2851 { lat: 22, common_pid: 2300 } hitcount: 1 3006 { lat: 22, common_pid: 2299 } 2852 { lat: 22, common_pid: 2299 } hitcount: 1 3007 { lat: 22, common_pid: 2305 } 2853 { lat: 22, common_pid: 2305 } hitcount: 1 3008 { lat: 22, common_pid: 2304 } 2854 { lat: 22, common_pid: 2304 } hitcount: 1 3009 { lat: 23, common_pid: 2299 } 2855 { lat: 23, common_pid: 2299 } hitcount: 1 3010 { lat: 23, common_pid: 2306 } 2856 { lat: 23, common_pid: 2306 } hitcount: 2 3011 { lat: 23, common_pid: 2302 } 2857 { lat: 23, common_pid: 2302 } hitcount: 6 3012 { lat: 24, common_pid: 2302 } 2858 { lat: 24, common_pid: 2302 } hitcount: 3 3013 { lat: 24, common_pid: 2300 } 2859 { lat: 24, common_pid: 2300 } hitcount: 1 3014 { lat: 24, common_pid: 2306 } 2860 { lat: 24, common_pid: 2306 } hitcount: 2 3015 { lat: 24, common_pid: 2305 } 2861 { lat: 24, common_pid: 2305 } hitcount: 1 3016 { lat: 24, common_pid: 2299 } 2862 { lat: 24, common_pid: 2299 } hitcount: 1 3017 { lat: 25, common_pid: 2300 } 2863 { lat: 25, common_pid: 2300 } hitcount: 1 3018 { lat: 25, common_pid: 2302 } 2864 { lat: 25, common_pid: 2302 } hitcount: 4 3019 { lat: 26, common_pid: 2302 } 2865 { lat: 26, common_pid: 2302 } hitcount: 2 3020 { lat: 27, common_pid: 2305 } 2866 { lat: 27, common_pid: 2305 } hitcount: 1 3021 { lat: 27, common_pid: 2300 } 2867 { lat: 27, common_pid: 2300 } hitcount: 1 3022 { lat: 27, common_pid: 2302 } 2868 { lat: 27, common_pid: 2302 } hitcount: 3 3023 { lat: 28, common_pid: 2306 } 2869 { lat: 28, common_pid: 2306 } hitcount: 1 3024 { lat: 28, common_pid: 2302 } 2870 { lat: 28, common_pid: 2302 } hitcount: 4 3025 { lat: 29, common_pid: 2302 } 2871 { lat: 29, common_pid: 2302 } hitcount: 1 3026 { lat: 29, common_pid: 2300 } 2872 { lat: 29, common_pid: 2300 } hitcount: 2 3027 { lat: 29, common_pid: 2306 } 2873 { lat: 29, common_pid: 2306 } hitcount: 1 3028 { lat: 29, common_pid: 2304 } 2874 { lat: 29, common_pid: 2304 } hitcount: 1 3029 { lat: 30, common_pid: 2302 } 2875 { lat: 30, common_pid: 2302 } hitcount: 4 3030 { lat: 31, common_pid: 2302 } 2876 { lat: 31, common_pid: 2302 } hitcount: 6 3031 { lat: 32, common_pid: 2302 } 2877 { lat: 32, common_pid: 2302 } hitcount: 1 3032 { lat: 33, common_pid: 2299 } 2878 { lat: 33, common_pid: 2299 } hitcount: 1 3033 { lat: 33, common_pid: 2302 } 2879 { lat: 33, common_pid: 2302 } hitcount: 3 3034 { lat: 34, common_pid: 2302 } 2880 { lat: 34, common_pid: 2302 } hitcount: 2 3035 { lat: 35, common_pid: 2302 } 2881 { lat: 35, common_pid: 2302 } hitcount: 1 3036 { lat: 35, common_pid: 2304 } 2882 { lat: 35, common_pid: 2304 } hitcount: 1 3037 { lat: 36, common_pid: 2302 } 2883 { lat: 36, common_pid: 2302 } hitcount: 4 3038 { lat: 37, common_pid: 2302 } 2884 { lat: 37, common_pid: 2302 } hitcount: 6 3039 { lat: 38, common_pid: 2302 } 2885 { lat: 38, common_pid: 2302 } hitcount: 2 3040 { lat: 39, common_pid: 2302 } 2886 { lat: 39, common_pid: 2302 } hitcount: 2 3041 { lat: 39, common_pid: 2304 } 2887 { lat: 39, common_pid: 2304 } hitcount: 1 3042 { lat: 40, common_pid: 2304 } 2888 { lat: 40, common_pid: 2304 } hitcount: 2 3043 { lat: 40, common_pid: 2302 } 2889 { lat: 40, common_pid: 2302 } hitcount: 5 3044 { lat: 41, common_pid: 2304 } 2890 { lat: 41, common_pid: 2304 } hitcount: 1 3045 { lat: 41, common_pid: 2302 } 2891 { lat: 41, common_pid: 2302 } hitcount: 8 3046 { lat: 42, common_pid: 2302 } 2892 { lat: 42, common_pid: 2302 } hitcount: 6 3047 { lat: 42, common_pid: 2304 } 2893 { lat: 42, common_pid: 2304 } hitcount: 1 3048 { lat: 43, common_pid: 2302 } 2894 { lat: 43, common_pid: 2302 } hitcount: 3 3049 { lat: 43, common_pid: 2304 } 2895 { lat: 43, common_pid: 2304 } hitcount: 4 3050 { lat: 44, common_pid: 2302 } 2896 { lat: 44, common_pid: 2302 } hitcount: 6 3051 { lat: 45, common_pid: 2302 } 2897 { lat: 45, common_pid: 2302 } hitcount: 5 3052 { lat: 46, common_pid: 2302 } 2898 { lat: 46, common_pid: 2302 } hitcount: 5 3053 { lat: 47, common_pid: 2302 } 2899 { lat: 47, common_pid: 2302 } hitcount: 7 3054 { lat: 48, common_pid: 2301 } 2900 { lat: 48, common_pid: 2301 } hitcount: 1 3055 { lat: 48, common_pid: 2302 } 2901 { lat: 48, common_pid: 2302 } hitcount: 9 3056 { lat: 49, common_pid: 2302 } 2902 { lat: 49, common_pid: 2302 } hitcount: 3 3057 { lat: 50, common_pid: 2302 } 2903 { lat: 50, common_pid: 2302 } hitcount: 1 3058 { lat: 50, common_pid: 2301 } 2904 { lat: 50, common_pid: 2301 } hitcount: 1 3059 { lat: 51, common_pid: 2302 } 2905 { lat: 51, common_pid: 2302 } hitcount: 2 3060 { lat: 51, common_pid: 2301 } 2906 { lat: 51, common_pid: 2301 } hitcount: 1 3061 { lat: 61, common_pid: 2302 } 2907 { lat: 61, common_pid: 2302 } hitcount: 1 3062 { lat: 110, common_pid: 2302 } 2908 { lat: 110, common_pid: 2302 } hitcount: 1 3063 2909 3064 Totals: 2910 Totals: 3065 Hits: 89565 2911 Hits: 89565 3066 Entries: 158 2912 Entries: 158 3067 Dropped: 0 2913 Dropped: 0 3068 2914 3069 This doesn't tell us any information about ho 2915 This doesn't tell us any information about how late cyclictest may have 3070 woken up, but it does show us a nice histogra 2916 woken up, but it does show us a nice histogram of how long it took from 3071 the time that cyclictest was woken to the tim 2917 the time that cyclictest was woken to the time it made it into user space.
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.