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