xref: /aosp_15_r20/external/mesa3d/docs/perfetto.rst (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard WorkerPerfetto Tracing
2*61046927SAndroid Build Coastguard Worker================
3*61046927SAndroid Build Coastguard Worker
4*61046927SAndroid Build Coastguard WorkerMesa has experimental support for `Perfetto <https://perfetto.dev>`__ for
5*61046927SAndroid Build Coastguard WorkerGPU performance monitoring.  Perfetto supports multiple
6*61046927SAndroid Build Coastguard Worker`producers <https://perfetto.dev/docs/concepts/service-model>`__ each with
7*61046927SAndroid Build Coastguard Workerone or more data-sources.  Perfetto already provides various producers and
8*61046927SAndroid Build Coastguard Workerdata-sources for things like:
9*61046927SAndroid Build Coastguard Worker
10*61046927SAndroid Build Coastguard Worker- CPU scheduling events (``linux.ftrace``)
11*61046927SAndroid Build Coastguard Worker- CPU frequency scaling (``linux.ftrace``)
12*61046927SAndroid Build Coastguard Worker- System calls (``linux.ftrace``)
13*61046927SAndroid Build Coastguard Worker- Process memory utilization (``linux.process_stats``)
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard WorkerAs well as various domain specific producers.
16*61046927SAndroid Build Coastguard Worker
17*61046927SAndroid Build Coastguard WorkerThe mesa Perfetto support adds additional producers, to allow for visualizing
18*61046927SAndroid Build Coastguard WorkerGPU performance (frequency, utilization, performance counters, etc) on the
19*61046927SAndroid Build Coastguard Workersame timeline, to better understand and tune/debug system level performance:
20*61046927SAndroid Build Coastguard Worker
21*61046927SAndroid Build Coastguard Worker- pps-producer: A systemwide daemon that can collect global performance
22*61046927SAndroid Build Coastguard Worker  counters.
23*61046927SAndroid Build Coastguard Worker- mesa: Per-process producer within mesa to capture render-stage traces
24*61046927SAndroid Build Coastguard Worker  on the GPU timeline, track events on the CPU timeline, etc.
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard WorkerThe exact supported features vary per driver:
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker.. list-table:: Supported data-sources
29*61046927SAndroid Build Coastguard Worker   :header-rows: 1
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker   * - Driver
32*61046927SAndroid Build Coastguard Worker     - PPS Counters
33*61046927SAndroid Build Coastguard Worker     - Render Stages
34*61046927SAndroid Build Coastguard Worker   * - Freedreno
35*61046927SAndroid Build Coastguard Worker     - ``gpu.counters.msm``
36*61046927SAndroid Build Coastguard Worker     - ``gpu.renderstages.msm``
37*61046927SAndroid Build Coastguard Worker   * - Turnip
38*61046927SAndroid Build Coastguard Worker     - ``gpu.counters.msm``
39*61046927SAndroid Build Coastguard Worker     - ``gpu.renderstages.msm``
40*61046927SAndroid Build Coastguard Worker   * - Intel
41*61046927SAndroid Build Coastguard Worker     - ``gpu.counters.i915``
42*61046927SAndroid Build Coastguard Worker     - ``gpu.renderstages.intel``
43*61046927SAndroid Build Coastguard Worker   * - Panfrost
44*61046927SAndroid Build Coastguard Worker     - ``gpu.counters.panfrost``
45*61046927SAndroid Build Coastguard Worker     -
46*61046927SAndroid Build Coastguard Worker
47*61046927SAndroid Build Coastguard WorkerRun
48*61046927SAndroid Build Coastguard Worker---
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard WorkerTo capture a trace with Perfetto you need to take the following steps:
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Worker1. Build Perfetto from sources available at ``subprojects/perfetto`` following
53*61046927SAndroid Build Coastguard Worker   `this guide <https://perfetto.dev/docs/quickstart/linux-tracing>`__.
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker2. Create a `trace config <https://perfetto.dev/docs/concepts/config>`__, which is
56*61046927SAndroid Build Coastguard Worker   a json formatted text file with extension ``.cfg``, or use one of the config
57*61046927SAndroid Build Coastguard Worker   files under the ``src/tool/pps/cfg`` directory. More examples of config files
58*61046927SAndroid Build Coastguard Worker   can be found in ``subprojects/perfetto/test/configs``.
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker3. Change directory to ``subprojects/perfetto`` and run a
61*61046927SAndroid Build Coastguard Worker   `convenience script <https://perfetto.dev/docs/quickstart/linux-tracing#capturing-a-trace>`__
62*61046927SAndroid Build Coastguard Worker   to start the tracing service:
63*61046927SAndroid Build Coastguard Worker
64*61046927SAndroid Build Coastguard Worker   .. code-block:: sh
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker      cd subprojects/perfetto
67*61046927SAndroid Build Coastguard Worker      CONFIG=<path/to/gpu.cfg> OUT=out/linux_clang_release ./tools/tmux -n
68*61046927SAndroid Build Coastguard Worker
69*61046927SAndroid Build Coastguard Worker4. Start other producers you may need, e.g. ``pps-producer``.
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker5. Start ``perfetto`` under the tmux session initiated in step 3.
72*61046927SAndroid Build Coastguard Worker
73*61046927SAndroid Build Coastguard Worker6. Once tracing has finished, you can detach from tmux with :kbd:`Ctrl+b`,
74*61046927SAndroid Build Coastguard Worker   :kbd:`d`, and the convenience script should automatically copy the trace
75*61046927SAndroid Build Coastguard Worker   files into ``$HOME/Downloads``.
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker7. Go to `ui.perfetto.dev <https://ui.perfetto.dev>`__ and upload
78*61046927SAndroid Build Coastguard Worker   ``$HOME/Downloads/trace.protobuf`` by clicking on **Open trace file**.
79*61046927SAndroid Build Coastguard Worker
80*61046927SAndroid Build Coastguard Worker8. Alternatively you can open the trace in `AGI <https://gpuinspector.dev/>`__
81*61046927SAndroid Build Coastguard Worker   (which despite the name can be used to view non-android traces).
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard WorkerTo be a bit more explicit, here is a listing of commands reproducing
84*61046927SAndroid Build Coastguard Workerthe steps above :
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker.. code-block:: sh
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker   # Configure Mesa with perfetto
89*61046927SAndroid Build Coastguard Worker   mesa $ meson . build -Dperfetto=true -Dvulkan-drivers=intel,broadcom -Dgallium-drivers=
90*61046927SAndroid Build Coastguard Worker   # Build mesa
91*61046927SAndroid Build Coastguard Worker   mesa $ meson compile -C build
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker   # Within the Mesa repo, build perfetto
94*61046927SAndroid Build Coastguard Worker   mesa $ cd subprojects/perfetto
95*61046927SAndroid Build Coastguard Worker   perfetto $ ./tools/install-build-deps
96*61046927SAndroid Build Coastguard Worker   perfetto $ ./tools/gn gen --args='is_debug=false' out/linux
97*61046927SAndroid Build Coastguard Worker   perfetto $ ./tools/ninja -C out/linux
98*61046927SAndroid Build Coastguard Worker
99*61046927SAndroid Build Coastguard Worker   # Start perfetto
100*61046927SAndroid Build Coastguard Worker   perfetto $ CONFIG=../../src/tool/pps/cfg/gpu.cfg OUT=out/linux/ ./tools/tmux -n
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker   # In parallel from the Mesa repo, start the PPS producer
103*61046927SAndroid Build Coastguard Worker   mesa $ ./build/src/tool/pps/pps-producer
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker   # Back in the perfetto tmux, press enter to start the capture
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard WorkerCPU Tracing
108*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~
109*61046927SAndroid Build Coastguard Worker
110*61046927SAndroid Build Coastguard WorkerMesa's CPU tracepoints (``MESA_TRACE_*``) use Perfetto track events when
111*61046927SAndroid Build Coastguard WorkerPerfetto is enabled.  They use ``mesa.default`` and ``mesa.slow`` categories.
112*61046927SAndroid Build Coastguard Worker
113*61046927SAndroid Build Coastguard WorkerCurrently, only EGL and Freedreno have CPU tracepoints.
114*61046927SAndroid Build Coastguard Worker
115*61046927SAndroid Build Coastguard WorkerVulkan data sources
116*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~~~
117*61046927SAndroid Build Coastguard Worker
118*61046927SAndroid Build Coastguard WorkerThe Vulkan API gives the application control over recording of command
119*61046927SAndroid Build Coastguard Workerbuffers as well as when they are submitted to the hardware. As a
120*61046927SAndroid Build Coastguard Workerconsequence, we need to ensure command buffers are properly
121*61046927SAndroid Build Coastguard Workerinstrumented for the Perfetto driver data sources prior to Perfetto
122*61046927SAndroid Build Coastguard Workeractually collecting traces.
123*61046927SAndroid Build Coastguard Worker
124*61046927SAndroid Build Coastguard WorkerThis can be achieved by setting the :envvar:`MESA_GPU_TRACES`
125*61046927SAndroid Build Coastguard Workerenvironment variable before starting a Vulkan application :
126*61046927SAndroid Build Coastguard Worker
127*61046927SAndroid Build Coastguard Worker.. code-block:: sh
128*61046927SAndroid Build Coastguard Worker
129*61046927SAndroid Build Coastguard Worker   MESA_GPU_TRACES=perfetto ./build/my_vulkan_app
130*61046927SAndroid Build Coastguard Worker
131*61046927SAndroid Build Coastguard WorkerDriver Specifics
132*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~
133*61046927SAndroid Build Coastguard Worker
134*61046927SAndroid Build Coastguard WorkerBelow is driver specific information/instructions for the PPS producer.
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard WorkerFreedreno / Turnip
137*61046927SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^
138*61046927SAndroid Build Coastguard Worker
139*61046927SAndroid Build Coastguard WorkerThe Freedreno PPS driver needs root access to read system-wide
140*61046927SAndroid Build Coastguard Workerperformance counters, so you can simply run it with sudo:
141*61046927SAndroid Build Coastguard Worker
142*61046927SAndroid Build Coastguard Worker.. code-block:: sh
143*61046927SAndroid Build Coastguard Worker
144*61046927SAndroid Build Coastguard Worker   sudo ./build/src/tool/pps/pps-producer
145*61046927SAndroid Build Coastguard Worker
146*61046927SAndroid Build Coastguard WorkerIntel
147*61046927SAndroid Build Coastguard Worker^^^^^
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard WorkerThe Intel PPS driver needs root access to read system-wide
150*61046927SAndroid Build Coastguard Worker`RenderBasic <https://www.intel.com/content/www/us/en/docs/vtune-profiler/user-guide/2023-0/gpu-metrics-reference.html>`__
151*61046927SAndroid Build Coastguard Workerperformance counters, so you can simply run it with sudo:
152*61046927SAndroid Build Coastguard Worker
153*61046927SAndroid Build Coastguard Worker.. code-block:: sh
154*61046927SAndroid Build Coastguard Worker
155*61046927SAndroid Build Coastguard Worker   sudo ./build/src/tool/pps/pps-producer
156*61046927SAndroid Build Coastguard Worker
157*61046927SAndroid Build Coastguard WorkerAnother option to enable access wide data without root permissions would be running the following:
158*61046927SAndroid Build Coastguard Worker
159*61046927SAndroid Build Coastguard Worker.. code-block:: sh
160*61046927SAndroid Build Coastguard Worker
161*61046927SAndroid Build Coastguard Worker   sudo sysctl dev.i915.perf_stream_paranoid=0
162*61046927SAndroid Build Coastguard Worker
163*61046927SAndroid Build Coastguard WorkerAlternatively using the ``CAP_PERFMON`` permission on the binary should work too.
164*61046927SAndroid Build Coastguard Worker
165*61046927SAndroid Build Coastguard WorkerA particular metric set can also be selected to capture a different
166*61046927SAndroid Build Coastguard Workerset of HW counters :
167*61046927SAndroid Build Coastguard Worker
168*61046927SAndroid Build Coastguard Worker.. code-block:: sh
169*61046927SAndroid Build Coastguard Worker
170*61046927SAndroid Build Coastguard Worker   INTEL_PERFETTO_METRIC_SET=RasterizerAndPixelBackend ./build/src/tool/pps/pps-producer
171*61046927SAndroid Build Coastguard Worker
172*61046927SAndroid Build Coastguard WorkerVulkan applications can also be instrumented to be Perfetto producers.
173*61046927SAndroid Build Coastguard WorkerTo enable this for given application, set the environment variable as
174*61046927SAndroid Build Coastguard Workerfollow :
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Worker.. code-block:: sh
177*61046927SAndroid Build Coastguard Worker
178*61046927SAndroid Build Coastguard Worker   PERFETTO_TRACE=1 my_vulkan_app
179*61046927SAndroid Build Coastguard Worker
180*61046927SAndroid Build Coastguard WorkerPanfrost
181*61046927SAndroid Build Coastguard Worker^^^^^^^^
182*61046927SAndroid Build Coastguard Worker
183*61046927SAndroid Build Coastguard WorkerThe Panfrost PPS driver uses unstable ioctls that behave correctly on
184*61046927SAndroid Build Coastguard Workerkernel version `5.4.23+ <https://lwn.net/Articles/813601/>`__ and
185*61046927SAndroid Build Coastguard Worker`5.5.7+ <https://lwn.net/Articles/813600/>`__.
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard WorkerTo run the producer, follow these two simple steps:
188*61046927SAndroid Build Coastguard Worker
189*61046927SAndroid Build Coastguard Worker1. Enable Panfrost unstable ioctls via kernel parameter:
190*61046927SAndroid Build Coastguard Worker
191*61046927SAndroid Build Coastguard Worker   .. code-block:: sh
192*61046927SAndroid Build Coastguard Worker
193*61046927SAndroid Build Coastguard Worker      modprobe panfrost unstable_ioctls=1
194*61046927SAndroid Build Coastguard Worker
195*61046927SAndroid Build Coastguard Worker   Alternatively you could add ``panfrost.unstable_ioctls=1`` to your kernel command line, or ``echo 1 > /sys/module/panfrost/parameters/unstable_ioctls``.
196*61046927SAndroid Build Coastguard Worker
197*61046927SAndroid Build Coastguard Worker2. Run the producer:
198*61046927SAndroid Build Coastguard Worker
199*61046927SAndroid Build Coastguard Worker   .. code-block:: sh
200*61046927SAndroid Build Coastguard Worker
201*61046927SAndroid Build Coastguard Worker      ./build/pps-producer
202*61046927SAndroid Build Coastguard Worker
203*61046927SAndroid Build Coastguard WorkerTroubleshooting
204*61046927SAndroid Build Coastguard Worker---------------
205*61046927SAndroid Build Coastguard Worker
206*61046927SAndroid Build Coastguard WorkerTmux
207*61046927SAndroid Build Coastguard Worker~~~~
208*61046927SAndroid Build Coastguard Worker
209*61046927SAndroid Build Coastguard WorkerIf the convenience script ``tools/tmux`` keeps copying artifacts to your
210*61046927SAndroid Build Coastguard Worker``SSH_TARGET`` without starting the tmux session, make sure you have ``tmux``
211*61046927SAndroid Build Coastguard Workerinstalled in your system.
212*61046927SAndroid Build Coastguard Worker
213*61046927SAndroid Build Coastguard Worker.. code-block:: sh
214*61046927SAndroid Build Coastguard Worker
215*61046927SAndroid Build Coastguard Worker   apt install tmux
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard WorkerMissing counter names
218*61046927SAndroid Build Coastguard Worker~~~~~~~~~~~~~~~~~~~~~
219*61046927SAndroid Build Coastguard Worker
220*61046927SAndroid Build Coastguard WorkerIf the trace viewer shows a list of counters with a description like
221*61046927SAndroid Build Coastguard Worker``gpu_counter(#)`` instead of their proper names, maybe you had a data loss due
222*61046927SAndroid Build Coastguard Workerto the trace buffer being full and wrapped.
223*61046927SAndroid Build Coastguard Worker
224*61046927SAndroid Build Coastguard WorkerIn order to prevent this loss of data you can tweak the trace config file in
225*61046927SAndroid Build Coastguard Workertwo different ways:
226*61046927SAndroid Build Coastguard Worker
227*61046927SAndroid Build Coastguard Worker- Increase the size of the buffer in use:
228*61046927SAndroid Build Coastguard Worker
229*61046927SAndroid Build Coastguard Worker  .. code-block:: javascript
230*61046927SAndroid Build Coastguard Worker
231*61046927SAndroid Build Coastguard Worker      buffers {
232*61046927SAndroid Build Coastguard Worker          size_kb: 2048,
233*61046927SAndroid Build Coastguard Worker          fill_policy: RING_BUFFER,
234*61046927SAndroid Build Coastguard Worker      }
235*61046927SAndroid Build Coastguard Worker
236*61046927SAndroid Build Coastguard Worker- Periodically flush the trace buffer into the output file:
237*61046927SAndroid Build Coastguard Worker
238*61046927SAndroid Build Coastguard Worker  .. code-block:: javascript
239*61046927SAndroid Build Coastguard Worker
240*61046927SAndroid Build Coastguard Worker      write_into_file: true
241*61046927SAndroid Build Coastguard Worker      file_write_period_ms: 250
242*61046927SAndroid Build Coastguard Worker
243*61046927SAndroid Build Coastguard Worker
244*61046927SAndroid Build Coastguard Worker- Discard new traces when the buffer fills:
245*61046927SAndroid Build Coastguard Worker
246*61046927SAndroid Build Coastguard Worker  .. code-block:: javascript
247*61046927SAndroid Build Coastguard Worker
248*61046927SAndroid Build Coastguard Worker      buffers {
249*61046927SAndroid Build Coastguard Worker          size_kb: 2048,
250*61046927SAndroid Build Coastguard Worker          fill_policy: DISCARD,
251*61046927SAndroid Build Coastguard Worker      }
252