1TRACE-CMD-RECORD(1)                                        TRACE-CMD-RECORD(1)
2
3
4

NAME

6       trace-cmd-record - record a trace from the Ftrace Linux internal tracer
7

SYNOPSIS

9       trace-cmd record [OPTIONS] [command]
10

DESCRIPTION

12       The trace-cmd(1) record command will set up the Ftrace Linux kernel
13       tracer to record the specified plugins or events that happen while the
14       command executes. If no command is given, then it will record until the
15       user hits Ctrl-C.
16
17       The record command of trace-cmd will set up the Ftrace tracer to start
18       tracing the various events or plugins that are given on the command
19       line. It will then create a number of tracing processes (one per CPU)
20       that will start recording from the kernel ring buffer straight into
21       temporary files. When the command is complete (or Ctrl-C is hit) all
22       the files will be combined into a trace.dat file that can later be read
23       (see trace-cmd-report(1)).
24

OPTIONS

26       -p tracer
27           Specify a tracer. Tracers usually do more than just trace an event.
28           Common tracers are: function, function_graph, preemptirqsoff,
29           irqsoff, preemptoff and wakeup. A tracer must be supported by the
30           running kernel. To see a list of available tracers, see
31           trace-cmd-list(1).
32
33       -e event
34           Specify an event to trace. Various static trace points have been
35           added to the Linux kernel. They are grouped by subsystem where you
36           can enable all events of a given subsystem or specify specific
37           events to be enabled. The event is of the format
38           "subsystem:event-name". You can also just specify the subsystem
39           without the :event-name or the event-name without the "subsystem:".
40           Using "-e sched_switch" will enable the "sched_switch" event where
41           as, "-e sched" will enable all events under the "sched" subsystem.
42
43               The 'event' can also contain glob expressions. That is, "*stat*" will
44               select all events (or subsystems) that have the characters "stat" in their
45               names.
46
47               The keyword 'all' can be used to enable all events.
48
49       -a
50           Every event that is being recorded has its output format file saved
51           in the output file to be able to display it later. But if other
52           events are enabled in the trace without trace-cmd’s knowledge, the
53           formats of those events will not be recorded and trace-cmd report
54           will not be able to display them. If this is the case, then specify
55           the -a option and the format for all events in the system will be
56           saved.
57
58       -T
59           Enable a stacktrace on each event. For example:
60
61                         <idle>-0     [003] 58549.289091: sched_switch:         kworker/0:1:0 [120] R ==> trace-cmd:2603 [120]
62                         <idle>-0     [003] 58549.289092: kernel_stack:         <stack trace>
63               => schedule (ffffffff814b260e)
64               => cpu_idle (ffffffff8100a38c)
65               => start_secondary (ffffffff814ab828)
66
67       --func-stack
68           Enable a stack trace on all functions. Note this is only applicable
69           for the "function" plugin tracer, and will only take effect if the
70           -l option is used and succeeds in limiting functions. If the
71           function tracer is not filtered, and the stack trace is enabled,
72           you can live lock the machine.
73
74       -f filter
75           Specify a filter for the previous event. This must come after a -e.
76           This will filter what events get recorded based on the content of
77           the event. Filtering is passed to the kernel directly so what
78           filtering is allowed may depend on what version of the kernel you
79           have. Basically, it will let you use C notation to check if an
80           event should be processed or not.
81
82               ==, >=, <=, >, <, &, |, && and ||
83
84           The above are usually safe to use to compare fields.
85
86       --no-filter
87           Do not filter out the trace-cmd threads. By default, the threads
88           are filtered out to not be traced by events. This option will have
89           the trace-cmd threads also be traced.
90
91       -R trigger
92           Specify a trigger for the previous event. This must come after a
93           -e. This will add a given trigger to the given event. To only
94           enable the trigger and not the event itself, then place the event
95           after the -v option.
96
97               See Documentation/trace/events.txt in the Linux kernel source for more
98               information on triggers.
99
100       -v
101           This will cause all events specified after it on the command line
102           to not be traced. This is useful for selecting a subsystem to be
103           traced but to leave out various events. For Example: "-e sched -v
104           -e "*stat\*"" will enable all events in the sched subsystem except
105           those that have "stat" in their names.
106
107               Note: the *-v* option was taken from the way grep(1) inverts the following
108               matches.
109
110       -F
111           This will filter only the executable that is given on the command
112           line. If no command is given, then it will filter itself (pretty
113           pointless). Using -F will let you trace only events that are caused
114           by the given command.
115
116       -P pid
117           Similar to -F but lets you specify a process ID to trace.
118
119       -c
120           Used with either -F (or -P if kernel supports it) to trace the
121           process' children too.
122
123       -C clock
124           Set the trace clock to "clock".
125
126               Use trace-cmd(1) list -C to see what clocks are available.
127
128       -o output-file
129           By default, trace-cmd report will create a trace.dat file. You can
130           specify a different file to write to with the -o option.
131
132       -l function-name
133           This will limit the function and function_graph tracers to only
134           trace the given function name. More than one -l may be specified on
135           the command line to trace more than one function. The limited use
136           of glob expressions are also allowed. These are match* to only
137           filter functions that start with match.  *match to only filter
138           functions that end with match.  *match\* to only filter on
139           functions that contain match.
140
141       -g function-name
142           This option is for the function_graph plugin. It will graph the
143           given function. That is, it will only trace the function and all
144           functions that it calls. You can have more than one -g on the
145           command line.
146
147       -n function-name
148           This has the opposite effect of -l. The function given with the -n
149           option will not be traced. This takes precedence, that is, if you
150           include the same function for both -n and -l, it will not be
151           traced.
152
153       -d
154           Some tracer plugins enable the function tracer by default. Like the
155           latency tracers. This option prevents the function tracer from
156           being enabled at start up.
157
158       -D
159           The option -d will try to use the function-trace option to disable
160           the function tracer (if available), otherwise it defaults to the
161           proc file: /proc/sys/kernel/ftrace_enabled, but will not touch it
162           if the function-trace option is available. The -D option will
163           disable both the ftrace_enabled proc file as well as the
164           function-trace option if it exists.
165
166               Note, this disable function tracing for all users, which includes users
167               outside of ftrace tracers (stack_tracer, perf, etc).
168
169       -O option
170           Ftrace has various options that can be enabled or disabled. This
171           allows you to set them. Appending the text no to an option disables
172           it. For example: "-O nograph-time" will disable the "graph-time"
173           Ftrace option.
174
175       -s interval
176           The processes that trace-cmd creates to record from the ring buffer
177           need to wake up to do the recording. Setting the interval to zero
178           will cause the processes to wakeup every time new data is written
179           into the buffer. But since Ftrace is recording kernel activity, the
180           act of this processes going back to sleep may cause new events into
181           the ring buffer which will wake the process back up. This will
182           needlessly add extra data into the ring buffer.
183
184               The 'interval' metric is microseconds. The default is set to 1000 (1 ms).
185               This is the time each recording process will sleep before waking up to
186               record any new data that was written to the ring buffer.
187
188       -r priority
189           The priority to run the capture threads at. In a busy system the
190           trace capturing threads may be staved and events can be lost. This
191           increases the priority of those threads to the real time (FIFO)
192           priority. But use this option with care, it can also change the
193           behaviour of the system being traced.
194
195       -b size
196           This sets the ring buffer size to size kilobytes. Because the
197           Ftrace ring buffer is per CPU, this size is the size of each per
198           CPU ring buffer inside the kernel. Using "-b 10000" on a machine
199           with 4 CPUs will make Ftrace have a total buffer size of 40 Megs.
200
201       -B buffer-name
202           If the kernel supports multiple buffers, this will add a buffer
203           with the given name. If the buffer name already exists, that buffer
204           is just reset and will not be deleted at the end of record
205           execution. If the buffer is created, it will be removed at the end
206           of execution (unless the -k is set, or start command was used).
207
208               After a buffer name is stated, all events added after that will be
209               associated with that buffer. If no buffer is specified, or an event
210               is specified before a buffer name, it will be associated with the
211               main (toplevel) buffer.
212
213               trace-cmd record -e sched -B block -e block -B time -e timer sleep 1
214
215               The above is will enable all sched events in the main buffer. It will
216               then create a 'block' buffer instance and enable all block events within
217               that buffer. A 'time' buffer instance is created and all timer events
218               will be enabled for that event.
219
220       -m size
221           The max size in kilobytes that a per cpu buffer should be. Note,
222           due to rounding to page size, the number may not be totally
223           correct. Also, this is performed by switching between two buffers
224           that are half the given size thus the output may not be of the
225           given size even if much more was written.
226
227               Use this to prevent running out of diskspace for long runs.
228
229       -M cpumask
230           Set the cpumask for to trace. It only affects the last buffer
231           instance given. If supplied before any buffer instance, then it
232           affects the main buffer. The value supplied must be a hex number.
233
234               trace-cmd record -p function -M c -B events13 -e all -M 5
235
236               If the -M is left out, then the mask stays the same. To enable all
237               CPUs, pass in a value of '-1'.
238
239       -k
240           By default, when trace-cmd is finished tracing, it will reset the
241           buffers and disable all the tracing that it enabled. This option
242           keeps trace-cmd from disabling the tracer and reseting the buffer.
243           This option is useful for debugging trace-cmd.
244
245               Note: usually trace-cmd will set the "tracing_on" file back to what it
246               was before it was called. This option will leave that file set to zero.
247
248       -i
249           By default, if an event is listed that trace-cmd does not find, it
250           will exit with an error. This option will just ignore events that
251           are listed on the command line but are not found on the system.
252
253       -N host:port
254           If another machine is running "trace-cmd listen", this option is
255           used to have the data sent to that machine with UDP packets.
256           Instead of writing to an output file, the data is sent off to a
257           remote box. This is ideal for embedded machines with little
258           storage, or having a single machine that will keep all the data in
259           a single repository.
260
261               Note: This option is not supported with latency tracer plugins:
262                 wakeup, wakeup_rt, irqsoff, preemptoff and preemptirqsoff
263
264       -t
265           This option is used with -N, when there’s a need to send the live
266           data with TCP packets instead of UDP. Although TCP is not nearly as
267           fast as sending the UDP packets, but it may be needed if the
268           network is not that reliable, the amount of data is not that
269           intensive, and a guarantee is needed that all traced information is
270           transfered successfully.
271
272       -q | --quiet
273           For use with recording an application. Suppresses normal output
274           (except for errors) to allow only the application’s output to be
275           displayed.
276
277       --date
278           With the --date option, "trace-cmd" will write timestamps into the
279           trace buffer after it has finished recording. It will then map the
280           timestamp to gettimeofday which will allow wall time output from
281           the timestamps reading the created trace.dat file.
282
283       --max-graph-depth depth
284           Set the maximum depth the function_graph tracer will trace into a
285           function. A value of one will only show where userspace enters the
286           kernel but not any functions called in the kernel. The default is
287           zero, which means no limit.
288
289       --module module
290           Filter a module’s name in function tracing. It is equivalent to
291           adding :mod:module after all other functions being filtered. If no
292           other function filter is listed, then all modules functions will be
293           filtered in the filter.
294
295               '--module snd'  is equivalent to  '-l :mod:snd'
296
297               '--module snd -l "*jack*"' is equivalent to '-l "*jack*:mod:snd"'
298
299               '--module snd -n "*"' is equivalent to '-n :mod:snd'
300
301       --profile
302           With the --profile option, "trace-cmd" will enable tracing that can
303           be used with trace-cmd-report(1) --profile option. If a tracer -p
304           is not set, and function graph depth is supported by the kernel,
305           then the function_graph tracer will be enabled with a depth of one
306           (only show where userspace enters into the kernel). It will also
307           enable various tracepoints with stack tracing such that the report
308           can show where tasks have been blocked for the longest time.
309
310               See trace-cmd-profile(1) for more details and examples.
311
312       -H event-hooks
313           Add custom event matching to connect any two events together. When
314           not used with --profile, it will save the parameter and this will
315           be used by trace-cmd report --profile, too. That is:
316
317               trace-cmd record -H hrtimer_expire_entry,hrtimer/hrtimer_expire_exit,hrtimer,sp
318               trace-cmd report --profile
319
320               Will profile hrtimer_expire_entry and hrtimer_expire_ext times.
321
322               See trace-cmd-profile(1) for format.
323
324       -S
325           (for --profile only) Only enable the tracer or events speficied on
326           the command line. With this option, the function_graph tracer is
327           not enabled, nor are any events (like sched_switch), unless they
328           are specifically specified on the command line (i.e. -p function -e
329           sched_switch -e sched_wakeup)
330
331       --ts-offset offset
332           Add an offset for the timestamp in the trace.dat file. This will
333           add a offset option into the trace.dat file such that a trace-cmd
334           report will offset all the timestamps of the events by the given
335           offset. The offset is in raw units. That is, if the event
336           timestamps are in nanoseconds the offset will also be in
337           nanoseconds even if the displayed units are in microseconds.
338
339       --stderr
340           Have output go to stderr instead of stdout, but the output of the
341           command executed will not be changed. This is useful if you want to
342           monitor the output of the command being executed, but not see the
343           output from trace-cmd.
344

EXAMPLES

346       The basic way to trace all events:
347
348            # trace-cmd record -e all ls > /dev/null
349            # trace-cmd report
350                  trace-cmd-13541 [003] 106260.693809: filemap_fault: address=0x128122 offset=0xce
351                  trace-cmd-13543 [001] 106260.693809: kmalloc: call_site=81128dd4 ptr=0xffff88003dd83800 bytes_req=768 bytes_alloc=1024 gfp_flags=GFP_KERNEL|GFP_ZERO
352                         ls-13545 [002] 106260.693809: kfree: call_site=810a7abb ptr=0x0
353                         ls-13545 [002] 106260.693818: sys_exit_write:       0x1
354
355       To use the function tracer with sched switch tracing:
356
357            # trace-cmd record -p function -e sched_switch ls > /dev/null
358            # trace-cmd report
359                         ls-13587 [002] 106467.860310: function: hrtick_start_fair <-- pick_next_task_fair
360                         ls-13587 [002] 106467.860313: sched_switch: prev_comm=trace-cmd prev_pid=13587 prev_prio=120 prev_state=R ==> next_comm=trace-cmd next_pid=13583 next_prio=120
361                  trace-cmd-13585 [001] 106467.860314: function: native_set_pte_at <-- __do_fault
362                  trace-cmd-13586 [003] 106467.860314: function:             up_read <-- do_page_fault
363                         ls-13587 [002] 106467.860317: function:             __phys_addr <-- schedule
364                  trace-cmd-13585 [001] 106467.860318: function: _raw_spin_unlock <-- __do_fault
365                         ls-13587 [002] 106467.860320: function: native_load_sp0 <-- __switch_to
366                  trace-cmd-13586 [003] 106467.860322: function: down_read_trylock <-- do_page_fault
367
368       Here is a nice way to find what interrupts have the highest latency:
369
370            # trace-cmd record -p function_graph -e irq_handler_entry  -l do_IRQ sleep 10
371            # trace-cmd report
372                     <idle>-0     [000] 157412.933969: funcgraph_entry:                  |  do_IRQ() {
373                     <idle>-0     [000] 157412.933974: irq_handler_entry:    irq=48 name=eth0
374                     <idle>-0     [000] 157412.934004: funcgraph_exit:       + 36.358 us |  }
375                     <idle>-0     [000] 157413.895004: funcgraph_entry:                  |  do_IRQ() {
376                     <idle>-0     [000] 157413.895011: irq_handler_entry:    irq=48 name=eth0
377                     <idle>-0     [000] 157413.895026: funcgraph_exit:                        + 24.014 us |  }
378                     <idle>-0     [000] 157415.891762: funcgraph_entry:                  |  do_IRQ() {
379                     <idle>-0     [000] 157415.891769: irq_handler_entry:    irq=48 name=eth0
380                     <idle>-0     [000] 157415.891784: funcgraph_exit:       + 22.928 us |  }
381                     <idle>-0     [000] 157415.934869: funcgraph_entry:                  |  do_IRQ() {
382                     <idle>-0     [000] 157415.934874: irq_handler_entry:    irq=48 name=eth0
383                     <idle>-0     [000] 157415.934906: funcgraph_exit:       + 37.512 us |  }
384                     <idle>-0     [000] 157417.888373: funcgraph_entry:                  |  do_IRQ() {
385                     <idle>-0     [000] 157417.888381: irq_handler_entry:    irq=48 name=eth0
386                     <idle>-0     [000] 157417.888398: funcgraph_exit:       + 25.943 us |  }
387
388       An example of the profile:
389
390            # trace-cmd record --profile sleep 1
391            # trace-cmd report --profile --comm sleep
392           task: sleep-21611
393             Event: sched_switch:R (1) Total: 99442 Avg: 99442 Max: 99442 Min:99442
394                <stack> 1 total:99442 min:99442 max:99442 avg=99442
395                  => ftrace_raw_event_sched_switch (0xffffffff8105f812)
396                  => __schedule (0xffffffff8150810a)
397                  => preempt_schedule (0xffffffff8150842e)
398                  => ___preempt_schedule (0xffffffff81273354)
399                  => cpu_stop_queue_work (0xffffffff810b03c5)
400                  => stop_one_cpu (0xffffffff810b063b)
401                  => sched_exec (0xffffffff8106136d)
402                  => do_execve_common.isra.27 (0xffffffff81148c89)
403                  => do_execve (0xffffffff811490b0)
404                  => SyS_execve (0xffffffff811492c4)
405                  => return_to_handler (0xffffffff8150e3c8)
406                  => stub_execve (0xffffffff8150c699)
407             Event: sched_switch:S (1) Total: 1000506680 Avg: 1000506680 Max: 1000506680 Min:1000506680
408                <stack> 1 total:1000506680 min:1000506680 max:1000506680 avg=1000506680
409                  => ftrace_raw_event_sched_switch (0xffffffff8105f812)
410                  => __schedule (0xffffffff8150810a)
411                  => schedule (0xffffffff815084b8)
412                  => do_nanosleep (0xffffffff8150b22c)
413                  => hrtimer_nanosleep (0xffffffff8108d647)
414                  => SyS_nanosleep (0xffffffff8108d72c)
415                  => return_to_handler (0xffffffff8150e3c8)
416                  => tracesys_phase2 (0xffffffff8150c304)
417             Event: sched_wakeup:21611 (1) Total: 30326 Avg: 30326 Max: 30326 Min:30326
418                <stack> 1 total:30326 min:30326 max:30326 avg=30326
419                  => ftrace_raw_event_sched_wakeup_template (0xffffffff8105f653)
420                  => ttwu_do_wakeup (0xffffffff810606eb)
421                  => ttwu_do_activate.constprop.124 (0xffffffff810607c8)
422                  => try_to_wake_up (0xffffffff8106340a)
423

SEE ALSO

425       trace-cmd(1), trace-cmd-report(1), trace-cmd-start(1),
426       trace-cmd-stop(1), trace-cmd-extract(1), trace-cmd-reset(1),
427       trace-cmd-split(1), trace-cmd-list(1), trace-cmd-listen(1),
428       trace-cmd-profile(1)
429

AUTHOR

431       Written by Steven Rostedt, <rostedt@goodmis.org[1]>
432

RESOURCES

434       git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git
435

COPYING

437       Copyright (C) 2010 Red Hat, Inc. Free use of this software is granted
438       under the terms of the GNU Public License (GPL).
439

NOTES

441        1. rostedt@goodmis.org
442           mailto:rostedt@goodmis.org
443
444
445
446                                  02/08/2020               TRACE-CMD-RECORD(1)
Impressum