Update text on TMF/Trace Compass viewer
[lttng-docs.git] / contents / getting-started / viewing-and-analyzing.md
CommitLineData
5e0cbfb0
PP
1---
2id: viewing-and-analyzing-your-traces
3---
4
5This section describes how to visualize the data gathered after tracing
6the Linux kernel or a user space application.
7
8Many ways exist to read your LTTng traces:
9
10 * **`babeltrace`** is a command line utility which converts trace formats;
11 it supports the format used by LTTng,
12 <abbr title="Common Trace Format">CTF</abbr>, as well as a basic
13 text output which may be `grep`ed. The `babeltrace` command is
14 part of the
15 <a href="http://www.efficios.com/babeltrace" class="ext">Babeltrace</a> project.
16 * Babeltrace also includes a **Python binding** so that you may
17 easily open and read an LTTng trace with your own script, benefiting
18 from the power of Python.
19 * The **<a href="https://eclipse.org/downloads/packages/eclipse-ide-cc-developers/lunar" class="ext">
20 Eclise IDE for C/C++ Developers</a>**
21 includes the Tracing and Monitoring Framework (TMF) plugin which
22 supports LTTng traces, amongst others.
4c93e172
GB
23 * <a href="http://projects.eclipse.org/projects/tools.tracecompass">Trace Compass</a>
24 is an Eclipse plugin, the TMF plugin mentioned above moved to its own
25 project, used to visualize and analyze various types of traces,
26 including LTTng. It also comes as a standalone application and can be
27 downloaded from
28 <a href="http://secretaire.dorsal.polymtl.ca/~gbastien/TracingRCP/TraceCompass/">here</a>
29 for a daily build of the latest source code. A version containing some
30 experimental features like Virtual Machine analysis and Critical Path
31 analysis is also available
32 <a href="http://secretaire.dorsal.polymtl.ca/~gbastien/TracingRCP/DorsalExperimental/">here</a>.
5e0cbfb0
PP
33
34LTTng trace files are usually recorded in the `~/lttng-traces` directory.
35Let's now view the trace and perform a basic analysis using
36`babeltrace`.
37
38The simplest way to list all the recorded events of a trace is to pass its
39path to `babeltrace` with no options:
40
41<pre class="term">
42babeltrace ~/lttng-traces/my-session
43</pre>
44
45`babeltrace` will find all traces within the given path recursively and
46output all their events, merging them intelligently.
47
48Listing all the system calls of a Linux kernel trace with their arguments is
49easy with `babeltrace` and `grep`:
50
51<pre class="term">
52babeltrace ~/lttng-traces/my-kernel-session | grep sys_
53</pre>
54
55Counting events is also straightforward:
56
57<pre class="term">
58babeltrace ~/lttng-traces/my-kernel-session | grep sys_read | wc -l
59</pre>
60
61The text output of `babeltrace` is useful for isolating events by simple
62matching using `grep` and similar utilities. However, more elaborate filters
63such as keeping only events with a field value falling within a specific range
64are not trivial to write using a shell. Moreover, reductions and even the
65most basic computations involving multiple events are virtually impossible
66to implement.
67
68Fortunately, Babeltrace ships with a Python 3 binding which makes it
69really easy to read the events of an LTTng trace sequentially and compute
70the desired information.
71
72Here's a simple example using the Babeltrace Python binding. The following
73script accepts an LTTng Linux kernel trace path as its first argument and
74outputs the short names of the top 5 running processes on CPU 0 during the
75whole trace:
76
77~~~ python
78import sys
79from collections import Counter
80import babeltrace
81
82
83def top5proc():
84 if len(sys.argv) != 2:
85 msg = 'Usage: python {} TRACEPATH'.format(sys.argv[0])
86 raise ValueError(msg)
87
88 # a trace collection holds one to many traces
89 col = babeltrace.TraceCollection()
90
91 # add the trace provided by the user
92 # (LTTng traces always have the 'ctf' format)
93 if col.add_trace(sys.argv[1], 'ctf') is None:
94 raise RuntimeError('Cannot add trace')
95
96 # this counter dict will hold execution times:
97 #
98 # task command name -> total execution time (ns)
99 exec_times = Counter()
100
101 # this holds the last `sched_switch` timestamp
102 last_ts = None
103
104 # iterate events
105 for event in col.events:
106 # keep only `sched_switch` events
107 if event.name != 'sched_switch':
108 continue
109
110 # keep only events which happened on CPU 0
111 if event['cpu_id'] != 0:
112 continue
113
114 # event timestamp
115 cur_ts = event.timestamp
116
117 if last_ts is None:
118 # we start here
119 last_ts = cur_ts
120
121 # previous task command (short) name
122 prev_comm = event['prev_comm']
123
124 # initialize entry in our dict if not yet done
125 if prev_comm not in exec_times:
126 exec_times[prev_comm] = 0
127
128 # compute previous command execution time
129 diff = cur_ts - last_ts
130
131 # update execution time of this command
132 exec_times[prev_comm] += diff
133
134 # update last timestamp
135 last_ts = cur_ts
136
137 # display top 10
138 for name, ns in exec_times.most_common()[:5]:
139 s = ns / 1000000000
140 print('{:20}{} s'.format(name, s))
141
142
143if __name__ == '__main__':
144 top5proc()
145~~~
146
147Save this script as `top5proc.py` and run it with Python 3, providing the
148path to an LTTng Linux kernel trace as the first argument:
149
150<pre class="term">
151python3 top5proc.py ~/lttng-sessions/my-session-.../kernel
152</pre>
153
154Make sure the path you provide is the directory containing actual trace
155files (`channel0_0`, `metadata`, etc.): the `babeltrace` utility recurses
156directories, but the Python binding does not.
157
158Here's an example of output:
159
160~~~ text
161swapper/0 48.607245889 s
162chromium 7.192738188 s
163pavucontrol 0.709894415 s
164Compositor 0.660867933 s
165Xorg.bin 0.616753786 s
166~~~
167
168Note that `swapper/0` is the "idle" process of CPU 0 on Linux; since we
169weren't using the CPU that much when tracing, its first position in the list
170makes sense.
This page took 0.027446 seconds and 4 git commands to generate.