Perfetto Tracing¶
Mesa has experimental support for Perfetto for GPU performance monitoring. Perfetto supports multiple producers each with one or more data-sources. Perfetto already provides various producers and data-sources for things like:
CPU scheduling events (
linux.ftrace
)CPU frequency scaling (
linux.ftrace
)System calls (
linux.ftrace
)Process memory utilization (
linux.process_stats
)
As well as various domain specific producers.
The mesa perfetto support adds additional producers, to allow for visualizing GPU performance (frequency, utilization, performance counters, etc) on the same timeline, to better understand and tune/debug system level performance:
pps-producer: A systemwide daemon that can collect global performance counters.
mesa: Per-process producer within mesa to capture render-stage traces on the GPU timeline, track events, etc.
The exact supported features vary per driver:
Driver |
PPS Counters |
Render Stages |
---|---|---|
Freedreno |
|
|
Turnip |
|
|
Intel |
|
Run¶
To capture a trace with perfetto you need to take the following steps:
Build perfetto from sources available at
subprojects/perfetto
following this guide.Create a trace config, which is a json formatted text file with extension
.cfg
, or use one of the config files under thesrc/tool/pps/cfg
directory. More examples of config files can be found insubprojects/perfetto/test/configs
.Change directory to
subprojects/perfetto
and run a convenience script to start the tracing service:cd subprojects/perfetto CONFIG=<path/to/gpu.cfg> OUT=out/linux_clang_release ./tools/tmux -n
Start other producers you may need, e.g.
pps-producer
.Start
perfetto
under the tmux session initiated in step 3.Once tracing has finished, you can detach from tmux with Ctrl+b, d, and the convenience script should automatically copy the trace files into
$HOME/Downloads
.Go to ui.perfetto.dev and upload
$HOME/Downloads/trace.protobuf
by clicking on Open trace file.Alternatively you can open the trace in AGI (which despite the name can be used to view non-android traces).
Driver Specifics¶
Below is driver specific information/instructions for the PPS provider.
Freedreno / Turnip¶
The Freedreno PPS driver needs root access to read system-wide performance counters, so you can simply run it with sudo:
sudo ./build/src/tool/pps/pps-producer
Intel¶
The Intel PPS driver needs root access to read system-wide RenderBasic performance counters, so you can simply run it with sudo:
sudo ./build/src/tool/pps/pps-producer
Another option to enable access wide data without root permissions would be running the following:
sudo sysctl dev.i915.perf_stream_paranoid=0
Alternatively using the CAP_PERFMON
permission on the binary should work too.
Troubleshooting¶
Tmux¶
If the convenience script tools/tmux
keeps copying artifacts to your
SSH_TARGET
without starting the tmux session, make sure you have tmux
installed in your system.
apt install tmux
Missing counter names¶
If the trace viewer shows a list of counters with a description like
gpu_counter(#)
instead of their proper names, maybe you had a data loss due
to the trace buffer being full and wrapped.
In order to prevent this loss of data you can tweak the trace config file in two different ways:
Increase the size of the buffer in use:
buffers { size_kb: 2048, fill_policy: RING_BUFFER, }
Periodically flush the trace buffer into the output file:
write_into_file: true file_write_period_ms: 250
Discard new traces when the buffer fills:
buffers { size_kb: 2048, fill_policy: DISCARD, }