histogram.txt 134 KB

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